DBAtlas · Атлас эксплуатации баз данных

Найти и нейтрализовать 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 на репликах, чтобы предотвратить повторение.

Открыть в DBAtlas →

Связанные материалы