主库和从库binlog_format值不同直接导致同步失败,因解析体系不兼容:主库写row事件而从库用statement解析relay log,必然报error executing row event或got fatal error 1236;必须分别在主从执行select @@binlog_format确认一致,不一致时需stop slave后set global binlog_format='row'并重启mysql确保sql线程生效,同时校验binlog_row_image=full、slave_exec_mode=strict及@@sql_log_bin=1。

主库和从库binlog_format值不同直接导致同步失败
这不是配置“没生效”,而是主从根本不在同一日志解析体系里。主库写ROW事件,从库却用STATEMENT模式去解析relay log,必然报错Error executing row event或Got fatal error 1236。最典型的现象是SHOW SLAVE STATUS\G里Slave_SQL_Running: No,且Last_Error明确提示格式不兼容。
- 必须分别在主库和从库执行
SELECT @@binlog_format;——不能只查主库,也不能只看my.cnf - 如果结果不一致(比如主库是
'ROW'、从库是'STATEMENT'),立刻停掉从库复制:STOP SLAVE; - 在从库上执行
SET GLOBAL binlog_format = 'ROW';,然后重启MySQL服务(比仅改GLOBAL变量更可靠) - 确认从库
slave_exec_mode为'STRICT'而非'IDEMPOTENT',否则错误会被掩盖
为什么SET GLOBAL binlog_format='ROW'后仍不生效
因为已有连接(包括SQL线程)不会自动切换格式,它们继续用启动时加载的旧值。你看到SELECT @@binlog_format返回'ROW',只是新连接的结果,不代表复制线程已切换。
- 执行
STOP SLAVE;后再START SLAVE;,强制SQL线程重建连接 - 检查
SHOW SLAVE STATUS\G里的Seconds_Behind_Master是否开始下降;若卡在0但Slave_SQL_Running仍是No,说明SQL线程没真正用新格式启动 - 更稳妥的做法是重启从库MySQL进程,确保所有内部线程(IO/SQL)都按新配置初始化
- 别忽略
binlog_row_image——即使binlog_format是ROW,若它被设为MINIMAL,UPDATE/DELETE可能丢失关键字段,导致pt-table-checksum校验失败
混合模式下MIXED fallback到STATEMENT引发隐性不一致
binlog_format=MIXED不是安全退路。MySQL在判断“是否确定”时有盲区,尤其对函数调用、触发器、子查询等场景,会悄无声息地fallback回STATEMENT,而你根本看不到警告。
- 在慢查询日志里搜
UUID()、NOW()、@var、SYS_DATE()——只要出现,就说明某条语句被MIXED判定为“不确定”,走了STATEMENT路径 - 检查主库是否启用了
log_bin_trust_function_creators=0,这会让自定义函数强制走STATEMENT(即使你写了DETERMINISTIC) - DDL+DML混合操作(如
ALTER TABLE后紧跟INSERT)在MIXED下大概率fallback,直接切ROW省事 - GTID模式下,STATEMENT和ROW事务不能共存于同一binlog文件,IO线程会直接中断并报错
验证ROW模式是否真正覆盖所有路径
改完配置只是起点,关键要看真实业务流量是否全量走ROW。尤其要注意运维脚本、备份工具、ETL任务这些“非交互式连接”,它们很可能绕过你的新配置。
- 在主库执行
SELECT @@sql_log_bin;,必须返回1——如果为0,说明有脚本调用了SET SQL_LOG_BIN = 0,这部分变更根本不会进binlog - 用
mysqlbinlog --base64-output=DECODE-ROWS -v解析最新binlog,确认事件类型是Write_rows/Update_rows,而不是Query事件 - 观察一个完整业务周期(比如订单高峰期8小时),确认从库
Seconds_Behind_Master无持续增长、Last_Errno始终为0 - 旧binlog仍按原格式记录,切换后至少保留7天以上,以防需要回溯分析历史不一致源头
sql_log_bin=0漏掉的变更,或者replicate-ignore-db过滤掉的库表,它们在ROW模式下也照样不复制。











