mysql 8.4 中 source_retry_count 默认值由 0 改为 10,即从库连接中断后自动重试 10 次(间隔默认 60 秒),实现故障自愈;旧配置未显式声明时可能掩盖网络抖动,需改用 replica_io_running = 'no' 等方式监控。

source_retry_count 默认值从 0 变为 10
MySQL 8.4 中,SOURCE_RETRY_COUNT 的默认值已从 0 改为 10。这意味着:当从库与主库连接中断(如网络闪断、主库重启),它会自动重试 10 次,每次间隔由 SOURCE_CONNECT_RETRY 控制(默认 60 秒)。
以前设为 0 时,失败即停,DBA 必须手动 START REPLICA;现在默认“自愈”,减少了人工介入频率。
容易踩的坑:
- 旧配置未显式声明
SOURCE_RETRY_COUNT,升级后复制链路看似“更稳”,但可能掩盖底层网络抖动问题,导致延迟悄悄累积 - 若你依赖监控脚本检测
Seconds_Behind_Master = NULL来告警连接中断,现在这个条件几乎不再触发——得改用REPLICA_IO_RUNNING = 'No'或日志中Retry connecting to source关键字来捕获
GTID 模式成为事实推荐路径,非 GTID 配置需额外校验
虽然 MySQL 8.4 仍支持传统 file/position 复制,但官方文档和工具链(如 mysqlsh util.checkForServerUpgrade())已明显倾向 GTID。启用 GTID 后,CHANGE REPLICATION SOURCE TO 不再需要指定 MASTER_LOG_FILE 和 MASTER_LOG_POS,而是靠 SOURCE_AUTO_POSITION = 1 自动对齐。
使用场景:
- 跨版本升级(如 5.7→8.4)必须用 GTID,否则无法安全跳过不兼容 binlog event
- 主库故障切换后,新主能通过
gtid_executed精确判断哪些事务已同步,避免重复执行或遗漏
关键提醒:
-
enforce_gtid_consistency = ON和gtid_mode = ON必须同时生效,缺一不可;单独开gtid_mode会导致启动失败 - 如果从库之前是 file/position 模式,切 GTID 前必须确保所有 relay log 已执行完毕(
SHOW REPLICA STATUS\G中Relay_Log_File和Relay_Log_Pos与Exec_Master_Log_Pos一致),否则SOURCE_AUTO_POSITION = 1会拒绝生效
group_replication_consistency 默认改为 BEFORE_ON_PRIMARY_FAILOVER
这个改动只影响 MGR(组复制)集群内部的故障转移行为,不影响传统主从。但很多团队把 MGR 当作“高级主从”在用,容易误判。
8.4 默认开启 group_replication_consistency = BEFORE_ON_PRIMARY_FAILOVER,意味着新主节点在对外提供服务前,必须完成所有已提交事务的回放(包括其他节点发来的事务)。这堵住了“读到旧数据”的窗口。
为什么重要:
- 如果你的应用有强读写依赖(比如下单后立刻查订单状态),这个默认值能避免一致性错乱
- 但它会让故障切换时间增加几百毫秒——不是 bug,是设计取舍
容易踩的坑:
- 该参数不能动态修改,必须写进
my.cnf并重启 mysqld 才生效 - 某些压测脚本假设切换是瞬时的,升级后可能因超时失败;需检查
wait_timeout和应用层重试逻辑
binlog 格式默认仍是 ROW,但 row_image 行为更严格
binlog_format = ROW 依然是默认值,但 MySQL 8.4 对 binlog_row_image 的校验收紧了:当设为 MINIMAL 时,如果 DML 涉及唯一索引变更,会强制退化为 FULL 记录整行,防止从库应用时找不到匹配行。
这解决了 8.0 时代一个隐蔽问题:某些 UPDATE 使用非主键 WHERE + 唯一索引列更新,MINIMAL 模式下只记变更列,从库找不到原记录导致复制中断。
建议做法:
- 生产环境统一用
binlog_row_image = FULL,省去判断边界 - 若坚持用
MINIMAL,务必确认所有 UPDATE/DELETE 的 WHERE 条件都包含主键或非空唯一索引,否则复制可能失败并报错Could not execute Write_rows_v1 event on table xxx; Duplicate entry
innodb_change_buffering = none 会影响批量导入吞吐,mysql_native_password 被禁用会直接拦住旧客户端连接。这些不是配置项本身变了,而是“不配就出事”的静默契约。











