binlog 是什么
binlog(Binary Log,二进制日志)是 MySQL Server 层维护的顺序变更日志:数据修改、DDL 与事务边界按执行顺序追加写入,与使用哪个存储引擎无关。它记录的是「数据库发生了什么」,而不是「数据页现在长什么样」,因此既能用于复制,也能用于按时间点恢复与增量捕获。
三种主要用途
第一,主从复制:从库拉取主库 binlog 事件并回放,实现数据同步;第二,数据恢复:全量备份加 binlog 回放到指定时间点,可把误删表恢复到故障前一刻;第三,CDC 增量捕获:Canal、Debezium、Flink CDC 都以从库身份订阅 binlog 得到变更事件流。
基本信息
| 全称 | Binary Log(二进制日志),MySQL Server 层组件 |
|---|---|
| 内容 | 数据修改、DDL、事务边界,按格式记录语句或行镜像 |
| 开启 | log_bin=ON;MySQL 8.0 默认已启用 |
| 格式 | binlog_format=ROW / STATEMENT / MIXED |
| CDC 要求 | binlog_format=ROW,binlog_row_image 按需设为 FULL |
| 保留 | binlog_expire_logs_seconds 控制,8.0 默认 2592000 秒(30 天) |
典型使用场景
- 主从复制搭建:从库以 binlog 位点或 GTID 为起点追随主库
- 误操作恢复:用最近全量备份加 binlog 回放,恢复到删除前的时刻
- CDC 增量同步:解析 binlog 还原增删改事件,投递到 Kafka 或数仓
- 审计与追溯:核查某段时间内哪些事务改动了哪些行
- 数据比对:以 binlog 事件为依据,核对目标库是否与源库一致
确认当前配置
确认当前配置
-- 是否开启、用哪种格式、实例编号是否重复
SHOW VARIABLES LIKE 'log_bin'; -- ON 表示已开启
SHOW VARIABLES LIKE 'binlog_format'; -- CDC 必须是 ROW
SHOW VARIABLES LIKE 'server_id'; -- 集群内唯一,CDC 工具会占用一个编号
SHOW VARIABLES LIKE 'binlog_row_image'; -- FULL 保留前后完整镜像
SHOW VARIABLES LIKE 'binlog_expire_logs_seconds'; -- 保留时长,决定可回溯窗口查看日志文件与解析事件
查看日志文件与解析事件
# 查看当前有哪些 binlog 文件及其大小
mysql -uroot -p -e 'SHOW BINARY LOGS;'
# 查看当前写入位置(MySQL 8.4 起推荐用 SHOW BINARY LOG STATUS)
mysql -uroot -p -e 'SHOW MASTER STATUS;'
# 把行事件解析成可读的伪 SQL,便于人工核查某个文件
mysqlbinlog --base64-output=DECODE-ROWS -vv /var/lib/mysql/mysql-bin.000123 | less关键参数读法
| 参数 | 作用 | CDC 相关要求 |
|---|---|---|
| log_bin | 是否开启二进制日志 | 必须为 ON,否则无法做增量捕获 |
| binlog_format | 记录语句还是行镜像 | 必须为 ROW,MIXED 下解析结果不可靠 |
| binlog_row_image | 行镜像保存哪些列 | FULL 才能还原完整的 before/after |
| server_id | 实例唯一编号 | CDC 工具需独立编号,不能与从库冲突 |
| sync_binlog | 事务提交时是否刷盘 | 为 1 最安全,但会增加磁盘写入压力 |
server_id 在复制拓扑内必须唯一:CDC 工具以从库身份接入并占用一个编号,撞号会导致正常复制中断或采集异常,接入前先盘点拓扑里已用编号。
binlog 的保留时长决定了「最多能回溯多久」:默认 30 天,但高写入实例常因磁盘压力缩短到几天。做补数方案前先确认实际保留窗口,否则事后想重放时文件已被清理。