Encontrar y neutralizar transacciones GTID errant
MySQLReplicaciónComando
-- 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.
Relacionado
- Configurar una réplica (CHANGE REPLICATION SOURCE)
- Iniciar / detener una réplica
- Ver el estado de la réplica (SHOW REPLICA STATUS)
- Omitir una transacción rota (GTID)
- Monitorear el lag de la réplica y los errores de los workers del applier (performance_schema)
- Ajustar la réplica multi-threaded (replica_parallel_workers)