2026/2/27 17:07:54
网站建设
项目流程
如何选择品牌网站建设,国内建设地铁的公司网站,网络广告策划书模板,wordpress 内页插件一、什么是binlog#xff1f;binlog#xff08;二进制日志#xff09;是MySQL用来记录所有数据变更操作的文件。就像一个监控录像#xff0c;MySQL把每一个INSERT、UPDATE、DELETE操作都记录下来。二、为什么需要binlog#xff1f;想象一个场景#xff1a;你…一、什么是binlogbinlog二进制日志是MySQL用来记录所有数据变更操作的文件。就像一个监控录像MySQL把每一个INSERT、UPDATE、DELETE操作都记录下来。二、为什么需要binlog想象一个场景你的电商系统突然宕机了已经处理的订单数据丢失。这时候有了binlog就像有了黑匣子你可以用它来恢复丢失的数据。2-1、binlog的主要用途有三个1. 数据恢复- 系统故障时可以用binlog恢复到某个时间点的数据状态2. 主从复制- 从库通过读主库的binlog来保持数据同步。这是构建高可用系统的基础3. 审计追踪- 可以查看谁在什么时间修改了什么数据2-2、binlog的三种格式1、STATEMENT格式记录SQL语句比如你执行UPDATE users SET age age 1 WHERE id 100 binlog就记录这条SQL语句原文优点记录量小节省空间缺点某些函数如NOW()可能导致从库数据不一致2、ROW格式记录行数据变化不记录SQL语句而是记录id101的用户age字段从20变成21 详细记录每一行数据变化前后的值优点最安全不会有数据不一致的问题缺点记录量大占用空间多3、MIXED格式混合模式MySQL智能选择普通操作用STATEMENT格式可能有问题的操作用ROW格式三、如何启用binlog编辑MySQL配置文件my.cnf[mysqld] server-id 1 log-bin /var/log/mysql/mysql-bin binlog-format ROW expire-logs-days 7然后重启MySQL服务。四、实际操作示例查看binlog是否启用SHOW VARIABLES LIKE log_bin; -- 结果ON 表示已启用查看当前binlog文件列表SHOW BINARY LOGS; -- 显示mysql-bin.000001, mysql-bin.000002 等查看binlog内容以可读的方式mysqlbinlog /var/log/mysql/mysql-bin.000001输出会显示类似这样的内容# at 154 #250107 10:30:45 server id 1 end_log_pos 235 Query thread_id2 exec_time0 error_code0 SET TIMESTAMP1704597045/*!*/; INSERT INTO users (id, name, age) VALUES (1, Alice, 25)4-1、一个完整的场景理解假设你有个电商系统10:00 - 用户购买商品订单状态改为已支付 10:05 - 系统宕机了 10:10 - 系统恢复但这5分钟的数据丢了 此时你可以 1. 查看binlog中10:00-10:05的所有操作 2. 用mysqlbinlog工具恢复这部分数据 3. 系统恢复正常五、三个日志的作用undo log用于事务回滚记录数据修改前的旧值redo log用于崩溃恢复记录数据修改后的新值binlog用于主从复制和数据恢复记录所有数据变更5-1、三种日志的层次归属日志类型所属层次文件后缀负责模块BinlogServer层.000001,.000002...MySQL ServerUndo Log存储引擎层(InnoDB)ibdata1,undo001InnoDB 引擎Redo Log存储引擎层(InnoDB)ib_logfile0,ib_logfile1InnoDB 引擎5-2、详细对比三种日志1. Binlog二进制日志归属Server层所有引擎共用作用主从复制 数据恢复特点• 逻辑日志记录SQL语句或行变化ROW格式记录变化前后的值• 追加写入一直往后写文件满了切下一个• 所有引擎共享不管用InnoDB还是MyISAM都会记录为什么 Binlog 在 Server 层设计目标支持所有存储引擎的主从复制2. Undo Log回滚日志归属存储引擎层InnoDB特有作用事务回滚 MVCC多版本控制特点• 物理日志记录数据修改前的旧版本• 循环使用空间会被复用• 实现MVCC提供事务的隔离性可重复读3. Redo Log重做日志归属存储引擎层InnoDB特有作用崩溃恢复 保证持久性特点• 物理日志记录数据页的物理变化• 循环写入固定大小文件循环写• Write-Ahead Logging先写日志后写数据为什么 Redo/Undo 在引擎层设计目标事务实现是引擎自己的事不同引擎的事务实现不同• InnoDB需要 Redo/Undo• MyISAM根本没有事务不需要这些日志只有 InnoDB 需要 Redo/Undo Log 吗是的MyISAM没有事务崩溃可能丢数据Memory数据在内存重启就丢