给一个正在应用relay log的replica真实来一次kill -9,验证relay_log_recovery配置是不是真的能保证崩溃后数据不丢不重。
代码-- source持续写入200次 for i in 1..200: INSERT INTO t.log (note) VALUES ('burst-i'); -- 真实中途kill -9掉replica进程 kill -9 <replica真实的pid>
$ ps aux | grep rlr-rep (真实查不到了,进程被kill -9彻底终止) source此时真实已经写完全部205行(5条基础数据+200条压力写入)
这次真实是在replica正在"边收边应用"的过程中,粗暴地掐断了它,模拟一次真实的、没有任何优雅关闭机会的崩溃——这时候本地的relay log文件和记录"应用到哪里了"的元数据,真实处于一个不确定是否完整一致的状态。
Starting XA crash recovery... / XA crash recovery finished. [Warning] Recovery from source pos 12754 and file rs-bin.000001 for channel ''. Previous relay log pos and relay log file had been set to 12965, ./192-relay-bin.000002 respectively.
source: SELECT COUNT(*) FROM t.log; → 205 replica(重启恢复后): SELECT COUNT(*) FROM t.log; → 205 ← 真实完全一致
不管中间经历了怎样真实粗暴的崩溃和恢复过程,最终两边真实的数据完全一致,没有丢失也没有重复——这正是relay_log_recovery加上GTID复制真实共同保证的结果:宁可保守地从更早的位置重新开始,也不冒险直接信任一份可能不完整的本地状态。
每一步都是本文上面用真实的崩溃测试跑出来的原始结果。
relay_log_recovery=ON + GTID复制的幂等去重保证