MySQL技巧(九): Binlog 完整格式解析(ROW 模式,默认)

MySQL 5.7 默认 binlog 格式是 ROW(行模式) ,这是生产环境最常用、最稳定的格式。我给你一份可直接落地使用的解析指南,包含格式结构、解析命令、字段含义、实战案例。


一、MySQL 5.7 Binlog 核心特性

  1. 默认格式 :ROW(行模式)
  2. 记录内容 :不存 SQL,只存行数据变更的前后镜像
  3. 主从复制:绝对一致,无函数 / 存储过程偏差
  4. 支持:数据恢复、闪回、CDC 同步(Canal/Debezium)
  5. binlog 文件 :二进制文件,必须用 mysqlbinlog 解析

二、3 种格式在 5.7 中的表现

表格

格式 说明 5.7 是否推荐
ROW(默认) 记录行变更 ✅ 强烈推荐
STATEMENT 记录原始 SQL ❌ 不推荐(主从不一致)
MIXED 自动切换 ⚠️ 一般不使用

查看当前格式:

sql

复制代码
show variables like 'binlog_format';

三、ROW 模式 Binlog 结构(最重要)

一个完整的 binlog 事件包含:

  1. 事件头:时间、位置、语句类型
  2. 表映射:库名、表名、字段结构
  3. 行数据
    • 前镜像(before):变更前的数据(UPDATE/DELETE)
    • 后镜像(after):变更后的数据(INSERT/UPDATE)

四、mysqlbinlog 解析命令(5.7 专用)

1. 基础解析(能看懂行数据)

bash

运行

复制代码
mysqlbinlog -v --base64-output=DECODE-ROWS mysql-bin.000001

2. 详细解析(最常用)

bash

运行

复制代码
mysqlbinlog -vv --base64-output=DECODE-ROWS mysql-bin.000001
  • -v:简单解析行
  • -vv:显示字段名 + 类型 + 值(生产必备)

3. 按时间 / 位置解析

bash

运行

复制代码
# 按位置
mysqlbinlog --start-position=107 --stop-position=1000 -vv mysql-bin.000001

# 按时间
mysqlbinlog --start-datetime="2026-03-28 10:00:00" --stop-datetime="2026-03-28 11:00:00" mysql-bin.000001

五、ROW 格式解析实战(一看就懂)

示例 SQL

sql

复制代码
update user set age=26 where id=1;

解析后关键内容(精简版)

plaintext

复制代码
### UPDATE `test`.`user`
### WHERE
###   @1=1        (id, INT)
###   @2='张三'   (name, VARCHAR)
###   @3=25       (age, INT)
### SET
###   @1=1
###   @2='张三'
###   @3=26

字段含义

  • @1:第 1 列
  • @2:第 2 列
  • WHERE:前镜像(原数据)
  • SET:后镜像(新数据)

六、三种操作的 Binlog 表现

1. INSERT(只有后镜像)

plaintext

复制代码
### INSERT INTO `test`.`user`
### SET
###   @1=2
###   @2='李四'
###   @3=20

2. UPDATE(前 + 后镜像)

plaintext

复制代码
### UPDATE
### WHERE(原数据)
### SET(新数据)

3. DELETE(只有前镜像)

plaintext

复制代码
### DELETE FROM `test`.`user`
### WHERE
###   @1=1
###   @2='张三'
###   @3=26

七、MySQL 5.7 Binlog 关键配置(my.cnf)

ini

复制代码
server-id = 1
log_bin = mysql-bin
binlog_format = ROW        # 5.7 默认
expire_logs_days = 7      # 自动清理
binlog_row_image = full   # 默认:记录全部字段(推荐)
  • binlog_row_image=full:记录所有列(恢复最安全)
  • minimal:只记录修改列(省空间,但恢复麻烦)

八、常见问题

1. 解析出来是乱码?

必须加:

plaintext

复制代码
--base64-output=DECODE-ROWS -vv

2. 看不到字段名?

用 -vv 而不是 -v。

3. 批量更新日志很大?

ROW 模式会记录每一行,正常现象。


总结(最核心)

  1. MySQL 5.7 默认 binlog = ROW 行模式
  2. 记录:行数据前后镜像
  3. 解析命令 :mysqlbinlog -vv --base64-output=DECODE-ROWS
  4. 结构:事件头 → 表信息 → 前镜像 (WHERE) → 后镜像 (SET)
  5. 用途:主从复制、数据恢复、CDC 同步
相关推荐
Titan20241 小时前
MySQL索引学习笔记
笔记·学习·mysql
ClouGence2 小时前
数据库迁移工具 CloudCanal v6.5.0.0 发布:新增 TDSQL PostgreSQL 多条链路,支持 MongoDB 双向同步
数据库·mysql·mongodb
这个DBA有点耶3 小时前
Change Buffer深入:二级索引写入的隐形加速器与它的代价
数据库·mysql·代码规范
for_ever_love__3 小时前
MySQL 事务隔离级别讲透:MVCC、幻读与四个级别怎么选
java·数据库·mysql·事务·mvcc·不可重复读·幻读
这个DBA有点耶8 小时前
关系数据库管理系统选型指南:四步决策框架与主流产品技术路线对比
数据库·sql·程序人生·mysql·database·dba
我不会起名字3229 小时前
MVCC 快照读为什么读不到刚提交的数据:ReadView 的 4 条可见性规则
数据库·mysql·innodb·mvcc·事务隔离
螺蛳粉 螺蛳粉9 小时前
第四篇:Keepalived + MySQL 主从高可用实战
数据库·mysql·adb·keepalived·高可用
陈年老古董9 小时前
Hive DML 语言学习笔记:数据加载、插入、导出与导入
hive·笔记·学习·mysql
软擎10 小时前
轻虾数据恢复科普:采访录音、会议记录误删了又不能重录,手机和录音笔里的录音怎么找回?
数据恢复
for_ever_love__10 小时前
MySQL 锁与死锁讲透:行锁、间隙锁、Next-Key Lock 与排查方法
mysql·lock·行锁·死锁·间隙锁·排查·next-key