首页/数据/数据库速查/binlog 格式选择(ROW/STATEMENT/MIXED)
备份与恢复56 条

binlog 格式选择(ROW/STATEMENT/MIXED)

复制与恢复都依赖 binlog:ROW 记录行级变化(8.0 默认,最安全),STATEMENT 记录 SQL 原文(体积小但不确定性大),MIXED 混合。

数据库速查数据更新于 2026-10-13

三种格式的差别

binlog 既要给复制用,也要给按时间点恢复用,记录方式直接影响可靠性。ROW 记录每一行被修改前后的镜像,重放结果确定,是 MySQL 8.0 的默认值;STATEMENT 记录原始 SQL,体积小但带不确定函数的语句在重放时可能得到不同结果;MIXED 默认按 STATEMENT 记录,遇到无法安全重放的情况自动切换成 ROW。

基本信息

适用平台MySQL 5.7 / 8.0、MariaDB
查看方式SHOW VARIABLES LIKE 'binlog_format'
8.0 默认ROW
行镜像控制binlog_row_image 取 full(默认)、minimal、noblob
修改前提需要 SYSTEM_VARIABLES_ADMIN 或 SUPER 权限
生产建议统一使用 ROW

典型使用场景

  • 搭建与校验从库:确认位点重放结果与主库完全一致
  • 按时间点恢复(PITR)前核对二进制日志格式,评估重放可靠性
  • CDC 数据同步:下游工具通常依赖 ROW 格式解析行级变化
  • 误操作后回捞数据:从 binlog 里定位事件并构造反向语句
  • 审计变更:需要知道每一行改前改后的具体值

查看与调整

查看与调整
-- 查看当前格式与行镜像级别
SHOW VARIABLES LIKE 'binlog_format';
SHOW VARIABLES LIKE 'binlog_row_image';
-- 会话级临时覆盖(谨慎,且需足够权限)
SET SESSION binlog_format = 'ROW';
-- 全局调整(仅影响新会话)
SET GLOBAL binlog_format = 'ROW';
-- 查看当前正在写的二进制日志文件与位点
SHOW BINARY LOG STATUS;      -- 8.0.22+,旧版本用 SHOW MASTER STATUS

三种格式对比

格式记录内容可靠性体积
ROW每行修改前后的镜像重放确定,PITR 可靠较大,可用 minimal 缩减
STATEMENT原始 SQL 文本含不确定函数时结果可能不一致小
MIXED按语句安全自动切换同一事务内可能两种格式混用介于两者之间
binlog_row_image=minimal仅记录变更列体积小,但 before 镜像不完整最小
GTID 复制下改变 binlog 格式不会改变 GTID 语义,但重放结果的确定性仍取决于格式本身:只要追求可靠恢复,结论都是一样的,统一用 ROW。
把格式从 STATEMENT 切到 ROW 只对新写入生效:切换前的历史 binlog 仍是旧格式,做 PITR 时不能假设全部事件都可靠重放。

易错点

  • 沿用 STATEMENT 做 PITR:涉及 NOW()、RAND()、UUID() 或带 LIMIT 无 ORDER BY 的语句重放结果不同,恢复出错误数据
  • 把 binlog_row_image 设为 minimal:before 镜像不含未修改列,部分行级分析工具与回捞脚本会失真
  • MIXED 下按最理想情况预估重放:同一事务内可能混用两种格式,审计与恢复都要按最坏情况准备
  • 在从库单独修改 binlog_format:会造成主从行为差异,格式参数应在全链路保持一致

数据来源与参考

  • MySQL 8.0 Reference Manual: Binary Log Formats

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌