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';하는 일
source에 대응 항목이 없이 replica에서 직접 실행된 트랜잭션(errant)을 GTID 집합 차이로 탐지하고, source에서 빈 트랜잭션으로 표시하여 토폴로지 전체의 GTID 집합을 맞춘다.
사용 시점
페일오버 / 스위치오버 전 정기 점검으로. Orchestrator나 MySQL Shell이 errant GTID 때문에 replica 승격을 거부할 때, 또는 replica가 새 source에 연결할 때 1236으로 실패할 때.
주의
먼저 replica의 binlog(mysqlbinlog --include-gtids=...)에서 errant 트랜잭션이 무엇을 했는지 확인한다. 데이터를 변경했다면 빈 트랜잭션은 GTID만 덮을 뿐 데이터 차이는 남으므로 replica를 재구축(CLONE)하거나 데이터를 수동으로 맞춘다. source에서 커밋한 빈 트랜잭션은 모든 replica로 전파되며, 이는 의도된 동작이다. 재발을 막기 위해 replica에서 super_read_only=ON을 유지한다.