Найти и нейтрализовать 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';Что делает
Выявляет через разность наборов GTID транзакции, выполненные напрямую на реплике и не имеющие соответствия на источнике (errant), и выравнивает наборы GTID по всей топологии, помечая их пустыми транзакциями на источнике.
Когда использовать
Как регулярная проверка перед failover / switchover; когда Orchestrator или MySQL Shell отказывается повышать реплику из-за errant GTID или реплика при подключении к новому источнику падает с ошибкой 1236.
Внимание
Сначала выясните по binlog реплики, что сделала errant-транзакция (mysqlbinlog --include-gtids=...). Если она изменила данные, пустая транзакция лишь маскирует GTID, а расхождение данных остаётся; пересоздайте реплику (CLONE) или выровняйте данные вручную. Пустые транзакции, зафиксированные на источнике, распространяются на все реплики; так и задумано. Держите super_read_only=ON на репликах, чтобы предотвратить повторение.
Связанные материалы
- Настроить реплику (CHANGE REPLICATION SOURCE)
- Запустить / остановить реплику
- Просмотреть состояние реплики (SHOW REPLICA STATUS)
- Пропустить сломанную транзакцию (GTID)
- Мониторинг отставания реплики и ошибок рабочих процессов applier (performance_schema)
- Настроить многопоточную реплику (replica_parallel_workers)