一、什么是binlog?
binlog(二进制日志)是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语句,而是记录"id=101的用户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_id=2 exec_time=0 error_code=0 set timestamp=1704597045/*!*/; 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、三种日志的层次归属
| 日志类型 | 所属层次 | 文件后缀 | 负责模块 |
|---|---|---|---|
| binlog | server层 | .000001, .000002... | mysql server |
| undo log | 存储引擎层 (innodb) | ibdata1, undo001 | innodb 引擎 |
| redo log | 存储引擎层 (innodb) | ib_logfile0, ib_logfile1 | innodb 引擎 |
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:数据在内存,重启就丢
到此这篇关于mysql中的binlog日志操作示例的文章就介绍到这了,更多相关mysql binlog日志内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论