DBAtlas · Veritabanı operasyon atlası

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 Barman

MySQL

# fiziksel: xtrabackup
# mantıksal: mysqldump / mydumper

2. 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 backup

MySQL

# tam
xtrabackup --backup --target-dir=/yedek/full
# artımlı
xtrabackup --backup --target-dir=/yedek/incr1 \
  --incremental-basedir=/yedek/full

3. 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 backup

4. 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=8

MySQL

# 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.com

6. 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 verify

MySQL

# yedeği tutarlı hale getir (doğrulama)
xtrabackup --prepare --target-dir=/yedek/full

7. 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" restore

MySQL

# hazırlanmış yedeği veri dizinine geri koy
xtrabackup --copy-back --target-dir=/yedek/full
DBAtlas'ta aç →