Encontrar e neutralizar transações errant GTID
MySQLReplicaçãoComando
-- 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';O que faz
Detecta, por diferença de conjuntos de GTID, transações executadas diretamente em uma réplica sem correspondente na source (errant) e alinha os conjuntos de GTID em toda a topologia marcando-as com transações vazias na source.
Quando usar
Como verificação de rotina antes de failover / switchover; quando o Orchestrator ou o MySQL Shell se recusa a promover uma réplica por causa de errant GTIDs ou quando uma réplica falha com 1236 ao se conectar a uma nova source.
Atenção
Primeiro descubra o que a transação errant fez a partir do binlog da réplica (mysqlbinlog --include-gtids=...). Se ela alterou dados, a transação vazia apenas encobre o GTID e a diferença de dados permanece; reconstrua a réplica (CLONE) ou alinhe os dados manualmente. Transações vazias confirmadas na source se propagam para todas as réplicas; isso é intencional. Mantenha super_read_only=ON nas réplicas para evitar recorrência.