Otomatik yedekleme (pgBackRest/Barman/Xtrabackup/cron)
Belirti
Amaç: Veritabanı yedeklerini otomatikleştir; zamanlanmış full+incremental+WAL/binlog arşivi, saklama (retention), doğrulama ve offsite kopya ile güvenilir bir kurtarma zinciri kur.
1. Doğru yedek aracını seç
Motora göre araç seç: PostgreSQL için pgBackRest veya Barman (fiziksel yedek + WAL arşivi + PITR); MySQL/MariaDB için Percona XtraBackup (online fiziksel yedek) veya küçük veriler için mysqldump/mydumper (mantıksal). Fiziksel araçlar büyük veritabanlarında hızlı ve tutarlı yedek + point-in-time recovery sağlar; mantıksal dökümler taşınabilir ama büyük veride yavaştır.
PostgreSQL
# pgBackRest veya BarmanMySQL
# fiziksel: xtrabackup
# mantıksal: mysqldump / mydumper2. Full + incremental + sürekli arşiv zincirini kur
Haftalık/günlük tam (full) yedek, aralarda artımlı (incremental/differential) yedek ve sürekli WAL (PostgreSQL) veya binlog (MySQL) arşivi ile point-in-time recovery kur. pgBackRest tam/diff/artımlı yedek tiplerini ve WAL arşivini yönetir; PostgreSQL'de archive_command'ı pgBackRest'e yönlendirirsin. Artımlı yedek + arşiv, herhangi bir ana dönebilmeni sağlar.
PostgreSQL
# postgresql.conf
archive_mode = on
archive_command = 'pgbackrest --stanza=uygulama archive-push %p'
# tam yedek
pgbackrest --stanza=uygulama --type=full backup
# artımlı
pgbackrest --stanza=uygulama --type=incr backupMySQL
# tam
xtrabackup --backup --target-dir=/yedek/full
# artımlı
xtrabackup --backup --target-dir=/yedek/incr1 \
--incremental-basedir=/yedek/full3. Yedeği cron/timer ile zamanla
Yedek komutlarını cron veya systemd timer ile düzenli çalıştır: örneğin Pazar gece tam, diğer geceler artımlı. Zamanlamayı iş dışı saate al ve çakışmayı önlemek için full ve incr işlerinin üst üste binmediğinden emin ol. Çıktı loglarını bir yere yaz ve başarısızlıkta uyarı üret.
PostgreSQL
# crontab
0 1 * * 0 pgbackrest --stanza=uygulama --type=full backup
0 1 * * 1-6 pgbackrest --stanza=uygulama --type=incr backup4. Saklama (retention) politikası tanımla
Sonsuza dek yedek biriktirme; kaç tam yedek ve kaç günlük arşiv tutulacağını ayarla, araç eskiyeni otomatik temizlesin. pgBackRest'te repo1-retention-full ve arşiv saklama ayarlarıyla; Barman'da retention_policy ile yönetilir. Saklama süresi, kurtarma hedeflerinle (kaç gün geriye dönebilmen gerekiyor) uyumlu olmalı.
PostgreSQL
# pgbackrest.conf
[global]
repo1-retention-full=4
repo1-retention-archive=8MySQL
# eski yedekleri cron ile temizle (örnek)
find /yedek -type d -mtime +14 -exec rm -rf {} +5. Yedeği offsite / S3'e kopyala
Yedek, veritabanıyla aynı makinede/aynı bölgede kalmamalı; başka bir konuma veya nesne depolamaya (S3, GCS) kopyala. pgBackRest doğrudan S3 uyumlu depolamaya yazabilir; aksi halde rsync/rclone ile offsite bir hedefe senkronla. Felaket senaryosunda (yerel disk/bölge kaybı) yalnızca offsite kopya seni kurtarır.
PostgreSQL
# pgbackrest.conf S3 deposu
[global]
repo1-type=s3
repo1-s3-bucket=sirket-yedek
repo1-s3-region=eu-central-1
repo1-s3-endpoint=s3.eu-central-1.amazonaws.com6. Yedeği doğrula
Yedeğin var olması geri yüklenebildiği anlamına gelmez; bütünlüğü düzenli doğrula. pgBackRest'te 'verify' ve arşiv tutarlılığı kontrolleri, XtraBackup'ta hazırlama (--prepare) adımının başarısı yedeğin sağlamlığını gösterir. Otomatik bir işle her yedekten sonra doğrulama çalıştır ve başarısızlıkta alarm üret.
PostgreSQL
pgbackrest --stanza=uygulama verifyMySQL
# yedeği tutarlı hale getir (doğrulama)
xtrabackup --prepare --target-dir=/yedek/full7. Düzenli restore tatbikatı yap
En kritik adım: yedeği ayrı bir sunucuya periyodik olarak GERÇEKTEN geri yükle ve veritabanının açıldığını, verinin tutarlı olduğunu doğrula. Bu tatbikat kurtarma süreni (RTO) ölçmeni ve prosedürdeki boşlukları test dışında yakalamanı sağlar. Test edilmemiş yedek, yedek sayılmaz.
PostgreSQL
# ayrı sunucuda geri yükleme + PITR
pgbackrest --stanza=uygulama \
--type=time --target="2026-07-01 03:00:00" restoreMySQL
# hazırlanmış yedeği veri dizinine geri koy
xtrabackup --copy-back --target-dir=/yedek/full