Veritabanı Yedekleme Otomasyonu - pg_dump, mysqldump ve Object Storage

Veritabanı Yedekleme Otomasyonu - pg_dump, mysqldump ve Object Storage

Veritabanı yedeklemesi yapılmayan her sistem potansiyel bir felaket senaryosudur. Disk arızası, yanlış bir DROP TABLE komutu veya ransomware saldırısı dakikalar içinde yılların verisini silebilir. Manuel yedekleme unutulur, atlanır veya tutarsız olur. Bu rehberde PostgreSQL, MySQL ve MongoDB için ot

E

Elif Demir

Cloud Solutions Architect

21 Mart 202612 dk okuma0

Veritabanı yedeklemesi yapılmayan her sistem potansiyel bir felaket senaryosudur. Disk arızası, yanlış bir DROP TABLE komutu veya ransomware saldırısı dakikalar içinde yılların verisini silebilir. Manuel yedekleme unutulur, atlanır veya tutarsız olur. Bu rehberde PostgreSQL, MySQL ve MongoDB için otomatik yedekleme scriptleri oluşturmayı, yedekleri Object Storage'a güvenli şekilde göndermeyi ve retention policy ile disk alanını yönetmeyi somut örneklerle açıklıyoruz.

Yedekleme Stratejisi: 3-2-1 Kuralı

Güvenilir bir yedekleme stratejisi 3-2-1 kuralına uymalıdır:

  • 3 Kopya Verinin en az 3 kopyası olmalı: orijinal veri + 2 yedek. Tek yedek yeterli değildir - yedek dosyası da bozulabilir.
  • 2 Farklı Ortam Yedekler en az 2 farklı depolama ortamında tutulmalı: yerel disk + Object Storage veya farklı sunucu.
  • 1 Offsite Kopya En az 1 kopya fiziksel olarak farklı lokasyonda olmalı. Aynı veri merkezindeki yedek, veri merkezi çapında bir arızada kaybolur.

PostgreSQL Otomatik Yedekleme

backup-postgres.sh
#!/bin/bash
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups/postgresql"
DB_NAME="production_db"
S3_BUCKET="s3://my-backups/postgresql"
RETENTION_DAYS=30

# Dizin olustur
mkdir -p $BACKUP_DIR

# Custom format ile yedekle (sikistirmali, paralel restore destekli)
pg_dump -Fc -j 4 -d $DB_NAME \
  -f $BACKUP_DIR/$DB_NAME_$TIMESTAMP.dump

# Yedek boyutunu kontrol et (bos dosya kontrolu)
if [ -s $BACKUP_DIR/$DB_NAME_$TIMESTAMP.dump ]; then
  # Object Storage'a gonder
  aws s3 cp $BACKUP_DIR/$DB_NAME_$TIMESTAMP.dump $S3_BUCKET/
  echo "[OK] Yedek basarili: $DB_NAME_$TIMESTAMP.dump"
else
  echo "[HATA] Yedek dosyasi bos!" >&2
  exit 1
fi

# Eski yedekleri temizle (retention policy)
find $BACKUP_DIR -name "*.dump" -mtime +$RETENTION_DAYS -delete

MySQL Otomatik Yedekleme

backup-mysql.sh
#!/bin/bash
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups/mysql"
DB_NAME="production_db"

mkdir -p $BACKUP_DIR

# Single-transaction ile tutarli yedek (InnoDB)
mysqldump --single-transaction --routines --triggers \
  --quick --lock-tables=false \
  $DB_NAME | gzip > $BACKUP_DIR/$DB_NAME_$TIMESTAMP.sql.gz

# S3'e gonder
aws s3 cp $BACKUP_DIR/$DB_NAME_$TIMESTAMP.sql.gz \
  s3://my-backups/mysql/

# 30 gunluk retention
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete

Cron ile Zamanlama

crontab -e
# Her gun saat 03:00'te PostgreSQL yedekle
0 3 * * * /opt/scripts/backup-postgres.sh >> /var/log/backup-pg.log 2>&1

# Her gun saat 03:30'da MySQL yedekle
30 3 * * * /opt/scripts/backup-mysql.sh >> /var/log/backup-mysql.log 2>&1

# Haftalik full backup (Pazar 02:00)
0 2 * * 0 /opt/scripts/backup-full.sh >> /var/log/backup-full.log 2>&1

⚠️ Kritik: Yedekleme scriptinizi yazdıktan sonra mutlaka restore testi yapın. Restore edilemeyen yedek, yedek değildir. Ayda en az bir kez test ortamında restore testi yapın ve süresini ölçün - bu süre RTO (Recovery Time Objective) hesabınızın temelidir.

💡 Restore Komutu: PostgreSQL: pg_restore -j 4 -d mydb backup.dump | MySQL: gunzip < backup.sql.gz | mysql mydb | MongoDB: mongorestore --gzip --archive=backup.gz

Veritabanı güvenliği için Veritabanı Güvenliği rehberimizi, snapshot stratejileri için Snapshot ve Yedekleme Stratejileri rehberimizi, Object Storage için Object Storage rehberimizi inceleyin. PostgreSQL Backup Dokümantasyonu ve mysqldump Referansı ek kaynak olarak faydalıdır.

Sıkça Sorulan Sorular

Logical backup mı physical backup mı kullanmalıyım?

Logical backup (pg_dump, mysqldump) taşınabilir ve farklı sürümlere restore edilebilir ancak büyük veritabanlarında yavaştır. Physical backup (pg_basebackup, Percona XtraBackup) daha hızlıdır ancak aynı sürüm ve mimariye restore gerektirir. Küçük-orta veritabanları için logical, büyük veritabanları için physical backup tercih edin.

Yedekleme sırasında veritabanı kilitlenir mi?

PostgreSQL pg_dump MVCC kullanır ve okuma/yazma işlemlerini engellemez. MySQL mysqldump --single-transaction ile InnoDB tablolarını kilitlemeden yedekler. MongoDB mongodump --oplog ile tutarlı yedek alır. Production'da bu parametreleri mutlaka kullanın.

Yedekleri şifrelemeli miyim?

Evet, özellikle offsite yedekler için şifreleme zorunludur. gpg veya openssl ile yedek dosyasını şifreleyin. Object Storage'a gönderirken server-side encryption (SSE) de etkinleştirin. Şifreleme anahtarını yedek dosyasından ayrı ve güvenli bir yerde saklayın.

Ne sıklıkla yedek almalıyım?

RPO (Recovery Point Objective) hedefinize bağlıdır. Günlük yedek = maksimum 24 saatlik veri kaybı. Saatlik yedek = maksimum 1 saatlik kayıp. Sıfır veri kaybı için WAL archiving (PostgreSQL) veya binlog replication (MySQL) kullanın.

Sonuç

Otomatik veritabanı yedeklemesi production ortamının vazgeçilmez parçasıdır. 3-2-1 kuralına uyun, cron ile zamanlayın, Object Storage'a offsite kopya gönderin ve en önemlisi düzenli restore testi yapın. Yedekleme scriptiniz çalışıyor olsa bile restore edilemeyen bir yedek sizi korumaz.

Verilerinizi Güvende Tutun

Hosted Cloud'un otomatik yedekleme ve Object Storage çözümleri ile verilerinizi koruyun.

Bulut Sunucu Planlarını İncele →
E

Elif Demir

Cloud Solutions Architect

Kurumsal bulut geçiş projeleri ve hibrit altyapı tasarımı konusunda uzman. AWS, Azure ve özel bulut ortamlarında 8 yıllık deneyime sahiptir.

Yorumlar yakında