DBAtlas · Veritabanı operasyon atlası

Binlog ile point-in-time recovery: hatalı transaction'ı bul ve atla

MySQLYedekleme & PITR

Komut

# 1) Hatali olayin GTID ve pozisyonunu bul (zaman araligiyla daralt)
mysqlbinlog --base64-output=DECODE-ROWS -vv --start-datetime='2026-10-08 20:00:00' --stop-datetime='2026-10-08 20:30:00' /var/lib/mysql/binlog.000003 | grep -B12 -iE '^(DROP|TRUNCATE)' | grep -E 'GTID_NEXT|^# at|^#[0-9]{6}|^DROP|^TRUNCATE'

# 2) Yedegi ayri bir sunucuya yukle (dump GTID_PURGED'i ayarlar)
zcat /backup/full_2026-10-08_0200.sql.gz | mysql -h restore-db -u root -p

# 3a) Yalniz hatali transaction'i atlayarak tum binlog'lari uygula
mysqlbinlog --exclude-gtids='af6bc361-c353-11f1-8f12-f69e63ad6c0e:23' /binlogs/binlog.000003 /binlogs/binlog.000004 | mysql -h restore-db -u root -p
# 3b) Ya da hatali olayin GTID event'inden hemen once dur
mysqlbinlog --stop-position=537205 /binlogs/binlog.000003 | mysql -h restore-db -u root -p

Ne yapar?

Yedeği geri yükledikten sonra binlog'ları sırayla uygulayarak veritabanını istenen ana getirir. GTID açıkken yedekte zaten bulunan transaction'lar otomatik atlanır; --exclude-gtids ile yalnız hatalı transaction çıkarılıp sonrasındaki tüm değişiklikler korunabilir.

Ne zaman kullanılır?

Hatalı DROP / DELETE / UPDATE sonrası, yedek ile olay anı arasındaki değişiklikleri kaybetmeden geri dönmek için.

Dikkat

Geri yüklemeyi production'a değil ayrı bir sunucuya yap, doğrula, sonra yalnız etkilenen tabloyu taşı. --start/--stop-datetime mysqlbinlog'u çalıştıran makinenin saat dilimine göre yorumlanır. --stop-position yalnız son verilen dosyaya uygulanır; birden çok dosyada önceki dosyaları ayrı komutla tam uygula. --exclude-gtids yalnız bağımsız bir transaction için güvenlidir; sonraki transaction'lar silinen tabloya yazıyorsa onlar da hata verir. Gereken binlog'lar kaynakta purge edilmemiş olmalı; binlog retention en az bir yedek aralığından uzun tutulmalı.

DBAtlas'ta aç →

İlgili