誤ったGTIDトランザクション(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';概要
ソースに対応するものがなくレプリカで直接実行されたトランザクション(errant)をGTIDセットの差分で検出し、ソースで空のトランザクションとしてマークすることで、トポロジ全体のGTIDセットを揃える。
使用する場面
フェイルオーバー/スイッチオーバー前の定期チェックとして。Orchestrator や MySQL Shellが誤ったGTIDのためにレプリカの昇格を拒否するとき、またはレプリカが新しいソースへの接続時に1236で失敗するときに。
注意
まず、誤ったトランザクションが何をしたかをレプリカのbinlogから確認する(mysqlbinlog --include-gtids=...)。データを変更していた場合、空のトランザクションはGTIDを取り繕うだけでデータの差異は残る。レプリカを再構築する(CLONE)か、データを手動で揃える。ソースでコミットした空のトランザクションはすべてのレプリカに伝播するが、それは意図どおり。再発防止のため、レプリカではsuper_read_only=ONを維持する。