DBAtlas · Atlas de operaciones de bases de datos

Encontrar y neutralizar transacciones GTID errant

MySQLReplicación

Comando

-- 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';

Qué hace

Detecta, mediante la diferencia de conjuntos GTID, las transacciones ejecutadas directamente en una réplica sin equivalente en el origen (errant), y alinea los conjuntos GTID en toda la topología marcándolas con transacciones vacías en el origen.

Cuándo usarlo

Como comprobación rutinaria previa a un failover / switchover; cuando Orchestrator o MySQL Shell se niegan a promover una réplica por GTID errant, o una réplica falla con 1236 al conectarse a un origen nuevo.

Precaución

Averigüe primero qué hizo la transacción errant a partir del binlog de la réplica (mysqlbinlog --include-gtids=...). Si cambió datos, la transacción vacía solo tapa el GTID y la diferencia de datos permanece; reconstruya la réplica (CLONE) o alinee los datos manualmente. Las transacciones vacías confirmadas en el origen se propagan a todas las réplicas; es lo que se pretende. Mantenga super_read_only=ON en las réplicas para evitar que se repita.

Abrir en DBAtlas →

Relacionado