行镜像粒度是什么
binlog_row_image 决定 binlog_format=ROW 时,每行变更事件里记录哪些列。它回答的是「一条 UPDATE 到底写进去多少信息」:FULL 记录变更前后的完整镜像,MINIMAL 只记被修改的列和定位这一行所需的键列,NOBLOB 与 FULL 类似但对未变更的大字段做省略。CDC 同步与审计类消费都要依赖完整镜像来还原整行,默认值 FULL 才是它们的舒适区。
基本信息
| FULL | 前后镜像包含所有列(默认值) |
|---|---|
| MINIMAL | 只含被改列与定位键列,省日志但信息不全 |
| NOBLOB | 全列但省略未变更的 BLOB/TEXT 字段 |
| 作用范围 | 全局与会话两级变量,会话级可单独设置 |
| 检查命令 | SHOW VARIABLES LIKE 'binlog_row_image' |
| 版本归属 | MySQL 5.6.2 及以上(含 5.7、8.0) |
核对与临时调整
核对与临时调整
SHOW VARIABLES LIKE 'binlog_row_image';
-- 期望结果:FULL
SHOW GLOBAL VARIABLES LIKE 'binlog_format';
-- 期望结果:ROW(CDC 场景不可用 STATEMENT)
-- 会话级临时调整(只影响当前会话产生的写入)
SET SESSION binlog_row_image = 'FULL';
-- 全局调整(新会话生效,重启后仍以配置文件为准)
SET GLOBAL binlog_row_image = 'FULL';典型使用场景
- Change Data Capture:Debezium、Canal 这类采集端需要整行镜像才能重建下游记录
- 审计与追溯:要还原「改成了什么」而不只是「哪一列变了」
- 主从复制:基于行的复制默认跟随该参数,值不同会影响部分场景的行为
- 控制 binlog 体积:写入量大且只关心变更列的链路,可评估 MINIMAL 节省空间
- 迁移前核对:新老实例参数不一致会导致采集端事件结构悄悄变化,上线前要逐项比对
三种取值对比
| 取值 | 记录内容 | 对下游的影响 |
|---|---|---|
| FULL | 变更前后各列完整值 | 可直接还原整行,兼容所有 CDC 工具 |
| MINIMAL | 只记被改列与定位键列 | 未变更列在下游取不到旧值,可能被写成空 |
| NOBLOB | 除未变更大字段外的所有列 | 大字段不变时下游可能缺值,需评估读取方式 |
改成 MINIMAL 后,未变更列的旧值不会出现在事件里:增量同步需要整行回写的场景会缺字段,变更前要评估所有搬数链路。
该参数属于动态变量,可以在线调整,但调整前产生的历史 binlog 仍按旧粒度记录;采集端从旧位点开始时,事件结构可能前后不一致,排障时要留意这一点。