首页/数据/数据工程与 ETL 速查/binlog_row_image:行镜像粒度
CDC 与同步53 条

binlog_row_image:行镜像粒度

binlog_row_image 控制 ROW 格式每行事件记录哪些列:FULL 记录前后镜像的全部列(默认),MINIMAL 只记被修改列与定位行的键列,NOBLOB 类似 FULL 但不重复记录未变更的 BLOB/TEXT。CDC 与审计类消费依赖完整镜像,一般要求 FULL。

行镜像粒度是什么

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 仍按旧粒度记录;采集端从旧位点开始时,事件结构可能前后不一致,排障时要留意这一点。

易错点

  • 为省 binlog 空间改成 MINIMAL,事后发现下游更新旧值全部为空,只能重建链路
  • 主从切换后新主库参数与旧主不一致,采集端事件结构悄悄变化
  • 只核对 binlog_format 为 ROW 就以为万事俱备,忽略了行镜像粒度同样影响采集
  • 在会话级临时改值做测试却忘了恢复,后续写入的事件粒度与其他会话不一致
  • 把 NOBLOB 当成省空间的通用方案,实际大字段变更仍被完整记录,收益有限

数据来源与参考

  • MySQL 8.0 Reference Manual: binlog_row_image
  • Debezium 官方文档(MySQL 连接器对行镜像的要求)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌