首页/数据/数据工程与 ETL 速查/MySQL binlog 二进制日志基础
CDC 与同步53 条

MySQL binlog 二进制日志基础

binlog(二进制日志)是 MySQL Server 层记录的变更日志,按事件顺序追加数据修改与 DDL,是主从复制与 CDC 增量捕获的基础。用于 CDC 需要开启 log_bin、使用 ROW 格式,并为实例配置集群内唯一的 server_id。

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 天,但高写入实例常因磁盘压力缩短到几天。做补数方案前先确认实际保留窗口,否则事后想重放时文件已被清理。

易错点

  • 默认以为格式一定是 ROW:部分历史环境仍是 STATEMENT 或 MIXED,接入 CDC 前必须逐项确认参数
  • 给 CDC 工具分配的 server_id 与真实从库重复,位点互相干扰,复制与采集同时出问题
  • 把 binlog 保留期设得过短,等到需要按时间点恢复或补数时发现文件已被清理
  • 同步账号权限不足(缺少复制相关权限),表现为连接成功但无法拉取 binlog;授权语句以对应版本文档为准

数据来源与参考

  • MySQL 8.0 Reference Manual: The Binary Log
  • MySQL 8.0 Reference Manual: Replication
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌