DBAtlas · Veritabanı operasyon atlası

Errant GTID transaction'larını bul ve etkisizleştir

MySQLReplikasyon

Komut

-- 1) Kaynakta: gtid_executed degerini al
SELECT @@GLOBAL.gtid_executed;

-- 2) Replikada: kaynakta olmayan GTID'ler (bos sonuc = temiz)
SELECT GTID_SUBTRACT(@@GLOBAL.gtid_executed,
       'af6bc361-c353-11f1-8f12-f69e63ad6c0e:1-13') AS errant_gtids;

-- 3) Icerik zararsizsa: kaynakta her errant GTID icin bos transaction isle
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';

Ne yapar?

Replikada doğrudan çalıştırılmış ve kaynakta karşılığı olmayan (errant) transaction'ları GTID set farkıyla tespit eder; kaynakta boş transaction ile işaretleyerek topolojideki GTID setlerini eşitler.

Ne zaman kullanılır?

Failover / switchover öncesi rutin kontrol olarak; Orchestrator veya MySQL Shell bir replikayı errant GTID gerekçesiyle promote etmediğinde ya da replika yeni kaynağa bağlanırken 1236 hatası verdiğinde.

Dikkat

Önce errant transaction'ın ne yaptığını replikanın binlog'undan bul (mysqlbinlog --include-gtids=...). Veri değiştiren bir transaction'sa boş transaction yalnız GTID'yi örter, veri farkı kalır; bu durumda replikayı yeniden kur (CLONE) veya veriyi elle hizala. Kaynakta işlenen boş transaction'lar tüm replikalara yayılır; istenen davranış budur. Tekrarını önlemek için replikalarda super_read_only=ON tut.

DBAtlas'ta aç →

İlgili