查找并消除 errant GTID 事务
MySQL复制命令
-- 1) On the source: get gtid_executed
SELECT @@GLOBAL.gtid_executed;
-- 2) On the replica: GTIDs missing on the source (empty result = clean)
SELECT GTID_SUBTRACT(@@GLOBAL.gtid_executed,
'af6bc361-c353-11f1-8f12-f69e63ad6c0e:1-13') AS errant_gtids;
-- 3) If the content is harmless: commit an empty transaction per errant GTID on the source
SET GTID_NEXT = 'b030e5a6-c353-11f1-a887-523817ec642a:1'; BEGIN; COMMIT;
SET GTID_NEXT = 'b030e5a6-c353-11f1-a887-523817ec642a:2'; BEGIN; COMMIT;
SET GTID_NEXT = 'AUTOMATIC';作用
通过 GTID 集合差集检测直接在副本上执行、在源上没有对应项的事务(errant),并通过在源上用空事务标记它们,使整个拓扑中的 GTID 集合保持一致。
适用场景
作为故障转移/主备切换前的例行检查;当 Orchestrator 或 MySQL Shell 因 errant GTID 拒绝提升副本,或副本在连接新源时因 1236 失败时。
注意
先通过副本的 binlog(mysqlbinlog --include-gtids=...)查明 errant 事务做了什么。如果它修改了数据,空事务只是掩盖了 GTID,数据差异依然存在;请重建副本(CLONE)或手动对齐数据。在源上提交的空事务会传播到每个副本;这是预期行为。在副本上保持 super_read_only=ON 以防再次发生。