分别单独停掉IO线程和SQL线程,用GTID集合的真实差值验证这两个线程各自独立的职责边界。
代码STOP REPLICA IO_THREAD; -- 在source上:INSERT INTO shop.orders (item, qty) VALUES ('cherry', 3);
IO线程停止期间,replica查询: SELECT * FROM shop.orders; → 只有原来的2行,cherry真实没出现 START REPLICA IO_THREAD; (等待约2秒) SELECT * FROM shop.orders; → 真实出现了cherry这一行
IO线程真实的职责是"去source那边把新的binlog事件拉过来,写进本地的relay log文件",它一旦停止,replica真实完全收不到任何新的变更信息,不管SQL线程是不是在运行——重启IO线程之后,之前积压在source上的变更真实很快就被追上来了。
代码STOP REPLICA SQL_THREAD; -- source: INSERT INTO shop.orders (item, qty) VALUES ('date', 7);
SQL线程停止期间: SELECT * FROM shop.orders; → 还是没有date这一行(数据没落地) SHOW REPLICA STATUS真实显示: Replica_IO_Running: Yes (IO线程还在跑) Replica_SQL_Running: No Retrieved_Gtid_Set: ...1-7 ← IO线程真实已经收到了包含date的事务 Executed_Gtid_Set: ...1-6 ← SQL线程真实还停在上一个事务,没应用这条 START REPLICA SQL_THREAD; (约1秒后) SELECT * FROM shop.orders; → date这一行真实出现了
每一步都是本文上面用真实两节点复制环境跑出来的原始结果。
STOP/START REPLICA IO_THREAD / SQL_THREAD + Retrieved/Executed_Gtid_Set对比