relay_log_recovery 的陷阱 — MTS 多线程复制下的数据静默丢失
前言 relay_log_recovery=ON 是 MySQL 主从复制中常见的安全配置,官方文档描述它的作用是:从库重启时,丢弃未执行的 relay log,从主库重新拉取。听起来很安全,但在特定条件下,它不仅救不了你,反而会导致 数据静默丢失 — 复制显示正常,实际上数据已经少了。 本文通过一个完整的实验,从环境确认、故障触发、原因分析到最终修复,逐步展示这个陷阱的全貌。 一、实验环境 角色 实例 服务器 主库 3308 120.48.119.118 从库 3309 101.34.248.57 MySQL 版本:8.0.35,GTID 模式,半同步复制。 从库关键参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 mysql> SHOW VARIABLES LIKE 'relay_log_recovery'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | relay_log_recovery | ON | +--------------------+-------+ mysql> SHOW VARIABLES LIKE 'relay_log_info_repository'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | relay_log_info_repository| TABLE | +--------------------------+-------+ mysql> SHOW VARIABLES LIKE 'slave_parallel_workers'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | slave_parallel_workers| 4 | +-----------------------+-------+ -- ↑ 多线程复制,这是出问题的关键! mysql> SHOW VARIABLES LIKE 'slave_parallel_type'; +--------------------+---------------+ | Variable_name | Value | +--------------------+---------------+ | slave_parallel_type| LOGICAL_CLOCK | +--------------------+---------------+ mysql> SHOW VARIABLES LIKE 'gtid_mode'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | gtid_mode | ON | +---------------+-------+ 配置总结:GTID + AUTO_POSITION + relay_log_recovery + MTS(4 worker) ...