Ana içeriğe geç
Kategoriye Dön

Veritabanı Yedekleme: MySQL ve PostgreSQL Dump Rehberi

MySQL ve PostgreSQL veritabanı yedekleme (dump & restore), cron ile otomatik yedekleme, geri yükleme prosedürleri ve en iyi uygulamalar. Veri kaybını önleyin.

Okuma süresi: 13 dk Sunucu Yönetimi
mysqlpostgresqlyedeklemedumprestorecronveritabanıbackup

İçindekiler

Veritabanı Yedekleme: MySQL ve PostgreSQL Dump Rehberi

Veritabanı yedekleme, sunucu yönetiminin en kritik görevlerinden biridir. Donanım arızası, insan hatası veya siber saldırı durumunda verilerinizi kurtarabilmek için düzenli yedekleme şarttır. Bu rehberde MySQL ve PostgreSQL için yedekleme ve geri yükleme prosedürlerini ele alacağız.

Neden Veritabanı Yedekleme?

  • Donanım arızası veya disk bozulması
  • Yanlışlıkla silinen veriler
  • Yazılım güncellemesi sonrası sorunlar
  • Siber saldırı veya ransomware
  • Geliştirme/test ortamına veri kopyalama

Yedekleme olmadan veri kaybı geri döndürülemez. 3-2-1 kuralını uygulayın: 3 kopya, 2 farklı medya, 1 uzak konum.

MySQL / MariaDB Yedekleme

mysqldump ile Temel Yedekleme

hljs bash
# Tek veritabanı yedekle
mysqldump -u root -p veritabani_adi > yedek.sql

# Şifre ile (güvenli olmayan yöntem, script için)
mysqldump -u root -pSIFRE veritabani_adi > yedek.sql

# Tüm veritabanlarını yedekle
mysqldump -u root -p --all-databases > tum_veritabanlari.sql

# Belirli tabloları yedekle
mysqldump -u root -p veritabani_adi tablo1 tablo2 > tablolar.sql

# Sıkıştırılmış yedek
mysqldump -u root -p veritabani_adi | gzip > yedek_$(date +%Y%m%d).sql.gz

Gelişmiş mysqldump Seçenekleri

hljs bash
# Büyük veritabanları için (transaction ile tutarlı yedek)
mysqldump -u root -p \
  --single-transaction \
  --routines \
  --triggers \
  --events \
  veritabani_adi > tam_yedek.sql

# Sadece yapı (veri olmadan)
mysqldump -u root -p --no-data veritabani_adi > yapi.sql

# Sadece veri (yapı olmadan)
mysqldump -u root -p --no-create-info veritabani_adi > veri.sql

# Uzak sunucudan yedek
mysqldump -h uzak_sunucu -u kullanici -p veritabani_adi > uzak_yedek.sql

MySQL Geri Yükleme

hljs bash
# SQL dosyasından geri yükle
mysql -u root -p veritabani_adi < yedek.sql

# Sıkıştırılmış yedekten geri yükle
gunzip -c yedek.sql.gz | mysql -u root -p veritabani_adi

# Yeni veritabanı oluşturup geri yükle
mysql -u root -p -e "CREATE DATABASE yeni_veritabani;"
mysql -u root -p yeni_veritabani < yedek.sql

# Tüm veritabanlarını geri yükle
mysql -u root -p < tum_veritabanlari.sql

MySQL Kimlik Bilgilerini Güvenli Saklama

hljs bash
# ~/.my.cnf dosyası oluştur
nano ~/.my.cnf
hljs ini
[client]
user=root
password=SIFRENIZ
host=localhost
hljs bash
# Dosya izinlerini kısıtla
chmod 600 ~/.my.cnf

# Artık şifre girmeden kullanabilirsiniz
mysqldump veritabani_adi > yedek.sql

PostgreSQL Yedekleme

pg_dump ile Temel Yedekleme

hljs bash
# Tek veritabanı yedekle
pg_dump -U postgres veritabani_adi > yedek.sql

# Sıkıştırılmış format (önerilen)
pg_dump -U postgres -Fc veritabani_adi > yedek.dump

# Dizin formatı (paralel geri yükleme için)
pg_dump -U postgres -Fd veritabani_adi -f yedek_dizini/

# Tüm veritabanlarını yedekle (roller dahil)
pg_dumpall -U postgres > tum_pg.sql

# Sıkıştırılmış yedek
pg_dump -U postgres veritabani_adi | gzip > yedek_$(date +%Y%m%d).sql.gz

Gelişmiş pg_dump Seçenekleri

hljs bash
# Belirli şemayı yedekle
pg_dump -U postgres -n public veritabani_adi > public_sema.sql

# Belirli tabloları yedekle
pg_dump -U postgres -t tablo1 -t tablo2 veritabani_adi > tablolar.sql

# Sadece yapı
pg_dump -U postgres -s veritabani_adi > yapi.sql

# Sadece veri
pg_dump -U postgres -a veritabani_adi > veri.sql

# Uzak sunucudan yedek
pg_dump -h uzak_sunucu -U postgres -p 5432 veritabani_adi > uzak_yedek.sql

PostgreSQL Geri Yükleme

hljs bash
# SQL formatından geri yükle
psql -U postgres veritabani_adi < yedek.sql

# Özel format (.dump) geri yükle
pg_restore -U postgres -d veritabani_adi yedek.dump

# Paralel geri yükleme (daha hızlı)
pg_restore -U postgres -d veritabani_adi -j 4 yedek.dump

# Yeni veritabanı oluşturup geri yükle
psql -U postgres -c "CREATE DATABASE yeni_veritabani;"
pg_restore -U postgres -d yeni_veritabani yedek.dump

# Sıkıştırılmış yedekten geri yükle
gunzip -c yedek.sql.gz | psql -U postgres veritabani_adi

PostgreSQL Şifresiz Erişim (.pgpass)

hljs bash
# ~/.pgpass dosyası oluştur
nano ~/.pgpass
# Format: host:port:database:user:password
localhost:5432:*:postgres:SIFRENIZ
hljs bash
# Dosya izinlerini kısıtla
chmod 600 ~/.pgpass

Cron ile Otomatik Yedekleme

MySQL Otomatik Yedekleme Script'i

hljs bash
# /root/scripts/mysql-backup.sh dosyası oluştur
mkdir -p /root/scripts
nano /root/scripts/mysql-backup.sh
hljs bash
#!/bin/bash

# Yapılandırma
DB_USER="root"
DB_PASS="SIFRENIZ"
DB_NAME="veritabani_adi"
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# Yedekleme dizini oluştur
mkdir -p $BACKUP_DIR

# Yedek al
mysqldump -u $DB_USER -p$DB_PASS \
  --single-transaction \
  --routines \
  --triggers \
  $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz

# Eski yedekleri sil
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete

echo "Yedekleme tamamlandı: ${DB_NAME}_${DATE}.sql.gz"
hljs bash
# Script'i çalıştırılabilir yap
chmod +x /root/scripts/mysql-backup.sh

# Test et
/root/scripts/mysql-backup.sh

# Crontab'a ekle (her gece 02:00'de)
crontab -e
0 2 * * * /root/scripts/mysql-backup.sh >> /var/log/mysql-backup.log 2>&1

PostgreSQL Otomatik Yedekleme Script'i

hljs bash
#!/bin/bash

# Yapılandırma
DB_USER="postgres"
DB_NAME="veritabani_adi"
BACKUP_DIR="/var/backups/postgresql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# Yedekleme dizini oluştur
mkdir -p $BACKUP_DIR

# Yedek al
pg_dump -U $DB_USER -Fc $DB_NAME > $BACKUP_DIR/${DB_NAME}_${DATE}.dump

# Sıkıştır
gzip $BACKUP_DIR/${DB_NAME}_${DATE}.dump

# Eski yedekleri sil
find $BACKUP_DIR -name "*.dump.gz" -mtime +$RETENTION_DAYS -delete

echo "PostgreSQL yedekleme tamamlandı: ${DB_NAME}_${DATE}.dump.gz"

Uzak Sunucuya Yedek Gönderme

hljs bash
# rsync ile uzak sunucuya kopyala
rsync -avz /var/backups/mysql/ kullanici@uzak-sunucu:/backup/mysql/

# scp ile tek dosya gönder
scp /var/backups/mysql/yedek.sql.gz kullanici@uzak-sunucu:/backup/

# rclone ile bulut depolamaya gönder (S3, Google Drive, vb.)
rclone copy /var/backups/mysql/ remote:bucket-adi/mysql/

Yedekleme Doğrulama

hljs bash
# MySQL yedek dosyasını kontrol et
mysqldump --check veritabani_adi

# Yedek dosyasının boyutunu kontrol et
ls -lh /var/backups/mysql/

# Test veritabanına geri yükleyerek doğrula
mysql -u root -p -e "CREATE DATABASE test_restore;"
mysql -u root -p test_restore < yedek.sql
mysql -u root -p -e "SHOW TABLES;" test_restore
mysql -u root -p -e "DROP DATABASE test_restore;"

Yedekleri düzenli olarak test edin. Geri yükleme yapamadığınız bir yedek işe yaramaz. Ayda en az bir kez test geri yüklemesi yapın.

En İyi Uygulamalar

  1. Düzenli yedekleme: Kritik veritabanları için günlük, hatta saatlik yedek
  2. Sıkıştırma: Disk alanı tasarrufu için gzip kullanın
  3. Uzak depolama: Yedekleri farklı bir sunucuda veya bulutta saklayın
  4. Saklama politikası: Günlük 7, haftalık 4, aylık 12 yedek saklayın
  5. Şifreleme: Hassas veriler için yedekleri şifreleyin
  6. İzleme: Yedekleme başarısızlıklarını e-posta ile bildirin
  7. Test: Yedekleri düzenli olarak geri yükleyerek doğrulayın

Sonuç

Düzenli veritabanı yedeklemesi, veri kaybına karşı en önemli savunma hattıdır. MySQL ve PostgreSQL için otomatik yedekleme script'leri kurarak ve yedekleri uzak konumda saklayarak verilerinizi güvende tutabilirsiniz.