RPO
Ne kadar veri? · kabul edilebilir kayıp
RTO
Ne kadar sürede? · geri dönüş süresi
Kural
3-2-1-1-0 · 3 kopya, 2 ortam, 1 off-site
+1 / +0
immutable · 0 hatalı restore testi
Altın Kural
Test edilmemiş yedek = yedek değildir
01
Temel Kavramlar & Strateji
| Kavram | Açıklama |
| Mantıksal | SQL / nesne seviyesinde döküm. Sürüm & platform bağımsız, seçici restore kolay; büyük veride yavaş restore (indeksler yeniden kurulur). |
| Fiziksel | Veri dosyalarının blok kopyası. Hızlı restore, TB ölçeğe uygun; aynı ana sürüm + platform gerekir. |
| Snapshot | LVM / ZFS / EBS / SAN anlık görüntüsü. Crash-consistent; WAL/redo aynı volume'deyse ya da backup modu kullanılırsa güvenli. |
| Full / Incr / Diff | Tamamı / son yedekten beri / son full'den beri değişenler. Incremental zinciri uzadıkça restore süresi ve risk artar. |
| Hot / Warm / Cold | Okuma+yazma açık / sadece okuma / sunucu kapalı. Production'da hedef: hot. |
| Sürekli Arşiv | Full yedek + kesintisiz binlog akışı → PITR: herhangi bir ana geri dönüş. RPO'yu saniyelere indirir. |
Yöntem Seçimi
| Senaryo | Öneri |
| < 100 GB, sürüm geçişi, tek şema | util.dumpSchemas / mydumper |
| TB ölçek, kısa RTO | XtraBackup / MEB + binlog |
| Saniyelik RPO | Semi-sync replika + binlog stream |
| "Yanlışlıkla sildim" koruması | PITR + SOURCE_DELAY |
Araç Haritası
| Mantıksal | mysqldump · MySQL Shell util.* · mydumper |
| Fiziksel | XtraBackup · MEB (mysqlbackup) · CLONE |
| Binlog | mysqlbinlog · SHOW BINARY LOGS |
| Yalnızca InnoDB | Hot fiziksel yedek ve tutarlı dump yalnızca InnoDB'de garanti |
Replikasyon yedek değildir: DROP TABLE veya hatalı UPDATE milisaniyeler içinde tüm replikalara da gider. HA ≠ DR.
02
Mantıksal Yedek
| Araç | Paralel | Not |
| mysqldump | ✗ | Her yerde var; tek thread, küçük/orta veri |
| mysqlpump | ✓ | 8.0.34'te deprecated, 8.4'te kaldırıldı — kullanma |
Shell util.* | ✓ | dumpInstance / dumpSchemas / dumpTables + loadDump; zstd, chunking, resume |
| mydumper | ✓ | Açık kaynak, myloader ile paralel restore |
mysqldump — Production Bayrakları
$ mysqldump --single-transaction --source-data=2 \
--routines --events --triggers --hex-blob \
--set-gtid-purged=ON --all-databases \
| zstd -T0 > /bk/full_$(date +%F).sql.zst
# --source-data=2 → binlog konumu yorum olarak yazılır
# (8.0.26 öncesi: --master-data=2)
MySQL Shell Dump & Load (JS)
util.dumpInstance('/bk/inst_2026-10-13',
{threads: 8, compression: 'zstd', consistent: true})
util.dumpSchemas(['shop'], '/bk/shop', {threads: 8})
// hedefte local_infile=ON gerekir
util.loadDump('/bk/inst_2026-10-13',
{threads: 8, deferTableIndexes: 'all'})
Restore
$ zstd -dc full.sql.zst | mysql -u root -p
$ myloader -d /bk/mydumper -t 8 --overwrite-tables
Dikkat: --single-transaction yalnızca InnoDB için tutarlıdır; MyISAM tabloları tutarsız kalır. Dump sırasında DDL (ALTER/TRUNCATE) çalıştırma — tutarlılık bozulur.
Hız: Shell util.loadDump ve myloader, düz SQL restore'a göre çok daha hızlıdır: paralel yükler ve indeksleri en sona bırakır.
03
Fiziksel Yedek
| Araç | Lisans | Not |
| XtraBackup | GPL | Hot, full + incremental, stream (xbstream), sıkıştırma, şifreleme |
| MEB | Enterprise | mysqlbackup: image backup, incremental, TDE desteği |
| CLONE | Dahili | 8.0.17+: CLONE LOCAL DATA DIRECTORY — yerel fiziksel kopya |
XtraBackup — Full + Incremental
$ xtrabackup --backup --target-dir=/bk/full
$ xtrabackup --backup --target-dir=/bk/inc1 \
--incremental-basedir=/bk/full
# PREPARE: son incremental hariç --apply-log-only
$ xtrabackup --prepare --apply-log-only --target-dir=/bk/full
$ xtrabackup --prepare --target-dir=/bk/full \
--incremental-dir=/bk/inc1
# RESTORE: datadir boş, sunucu kapalı
$ xtrabackup --copy-back --target-dir=/bk/full
$ chown -R mysql:mysql /var/lib/mysql
Stream → Uzak Sunucu / Obje Depolama
$ xtrabackup --backup --stream=xbstream --compress \
--parallel=4 | ssh bk01 "xbstream -x -C /bk/db1"
CLONE ile Yerel Kopya & MEB
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
CLONE LOCAL DATA DIRECTORY = '/bk/clone_20261013';
$ mysqlbackup --backup-dir=/bk/meb \
--backup-image=full.mbi backup-to-image
| Konum Bilgisi | xtrabackup_binlog_info → binlog dosyası, pozisyon ve GTID seti — PITR'ın başlangıç noktası. |
Dikkat: XtraBackup sürümü sunucuyla eşleşmeli (8.0 ↔ 8.0, 8.4 ↔ 8.4). Prepare edilmemiş yedek restore edilemez — prepare adımını yedek alındıktan hemen sonra test et.
MySQL Yedek & Kurtarma Referansı · Binlog PITR, Doğrulama & Felaket Senaryoları
04
Binlog & Point-in-Time Recovery
Kritik
| Parametre | Önerilen |
| log_bin | ON (8.0+ varsayılan) |
| binlog_format | ROW |
| sync_binlog | 1 — her commit'te diske |
| innodb_flush_log_at_trx_commit | 1 — tam dayanıklılık |
| binlog_expire_logs_seconds | ≥ en eski yedeğin yaşı |
| gtid_mode | ON + enforce_gtid_consistency |
Canlı Binlog Yedeği (ayrı sunucuda)
$ mysqlbinlog --read-from-remote-server --raw \
--stop-never --host=db1 --user=bkp -p \
--result-file=/binlogs/ binlog.000001
Adım Adım PITR
1Full yedeği geri yükle (dump / XtraBackup / CLONE).
2Başlangıç konumunu bul: dump başlığı veya xtrabackup_binlog_info.
3Hatalı olayın konumunu bul (aşağıda).
4Binlog'ları tek komutla olaydan hemen öncesine kadar oynat.
Olayı Bul & Oynat
$ mysqlbinlog -v --base64-output=DECODE-ROWS \
--start-datetime="2026-10-13 09:50:00" binlog.000043 \
| grep -n -B5 -i "DROP TABLE" # → end_log_pos
$ mysqlbinlog --start-position=157 --stop-position=48211 \
binlog.000042 binlog.000043 | mysql -u root -p
# GTID ile: hatalı işlemi atla, gerisini oynat
$ mysqlbinlog --exclude-gtids='3E11FA47-…:1234' \
binlog.000042 binlog.000043 | mysql -u root -p
Tuzak: Binlog dosyalarını ayrı ayrı mysqlbinlog | mysql ile oynatma — temporary table'lar ve çok dosyaya yayılan transaction'lar kırılır. Hepsini tek çağrıda ver.
05
Doğrulama, Test & İzleme
| Kontrol | Araç / Yöntem |
| Yedek Bütünlüğü | xtrabackup --prepare → "completed OK!", MEB validate |
| Veri Bütünlüğü | CHECK TABLE, mysqlcheck, CHECKSUM TABLE |
| Replika Tutarlılığı | pt-table-checksum → fark varsa pt-table-sync |
| Binlog Sağlığı | binlog stream süreci, SHOW BINARY LOGS, gtid_purged |
| Restore Testi | Otomatik, en az haftalık; ayrı sunucuda geri yükle → sorgu ile doğrula → RTO'yu ölç ve kaydet. |
Binlog Sağlık Kontrolü
SHOW BINARY LOGS;
SHOW BINARY LOG STATUS; -- 8.4 (8.0: SHOW MASTER STATUS)
SELECT @@gtid_executed, @@gtid_purged,
@@binlog_expire_logs_seconds;
Bütünlük Kontrolleri
$ mysqlcheck --all-databases --check -u root -p
$ mysqlbackup --backup-image=/bk/full.mbi validate
$ pt-table-checksum --replicate=percona.checksums h=db1
CHECKSUM TABLE shop.orders;
Alarm Kur
| Son başarılı yedeğin yaşı > 26 saat | Kritik |
| Binlog stream süreci durdu / gecikme > RPO | Kritik |
| Binlog, sonraki yedekten önce purge edildi | Kritik |
| Yedek boyutunda ani ±%30 değişim | Önemli |
| Yedek diski doluluğu > %80 | Önemli |
MySQL 8.4: SHOW MASTER STATUS kaldırıldı → SHOW BINARY LOG STATUS kullan (8.2+). İzleme script'lerini sürüm yükseltmeden önce güncelle.
06
Felaket Senaryoları & Kontrol Listesi
| Senaryo | Çözüm |
| Kazara DROP / DELETE | Binlog PITR (--stop-position / --exclude-gtids) veya gecikmeli replikadan tabloyu al |
| Disk / sunucu kaybı | Replikaya failover → yeni replika: CLONE INSTANCE FROM |
| Fidye yazılımı | Immutable (object lock) off-site kopya + xtrabackup --encrypt + ayrı kimlik bilgileri |
| Bozuk sayfa | CHECK TABLE ile tespit → yedekten geri al; son çare innodb_force_recovery |
| Bölge (region) kaybı | InnoDB ClusterSet / bölgeler arası yedek kopyası + DR runbook |
Gecikmeli Replika (1 saat)
STOP REPLICA SQL_THREAD;
CHANGE REPLICATION SOURCE TO SOURCE_DELAY = 3600;
START REPLICA SQL_THREAD;
-- olay anında: hatalı GTID'in hemen öncesine kadar uygula
START REPLICA SQL_THREAD UNTIL
SQL_BEFORE_GTIDS = '3E11FA47-…:1234';
| RPO / RTO yazılı ve iş birimiyle onaylıSLA → yöntem seçimi | Kritik |
| Binlog arşivi açık ve izleniyorsync_binlog=1 · mysqlbinlog --stop-never | Kritik |
| Otomatik restore testihaftalık · RTO ölçümü | Kritik |
| Off-site + şifreli kopyaxtrabackup --encrypt · S3 object lock | Kritik |
| Retention politikası uygulanıyorbinlog_expire_logs_seconds ≥ yedek yaşı | Önemli |
| Kullanıcılar & yetkiler yedekteutil.dumpInstance · SHOW CREATE USER / SHOW GRANTS | Önemli |
| Config dosyaları versiyonlumy.cnf · mysqld-auto.cnf (SET PERSIST) | Önerilen |
| DR runbook güncel ve tatbik edilmişyılda 2 tatbikat | Önerilen |
Kritik hemen Önemli bu çeyrek Önerilen planla