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
Yazar
REXE Teknoloji Ağ ve Güvenlik Ekibi
Editör
REXE Teknoloji Teknik Yayın Editörü
İlk yayın
Son güncelleme

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.

Sık Sorulan Sorular

mysqldump ile pg_dump arasındaki fark nedir?

mysqldump, MySQL ve MariaDB için kullanılan yedekleme aracıdır. pg_dump ise PostgreSQL'e özgüdür. Her ikisi de SQL formatında çıktı üretir, ancak pg_dump ayrıca özel binary format (-Fc) ve dizin formatı (-Fd) destekler. Binary format daha hızlı geri yükleme ve paralel işlem imkânı sunar.

Büyük veritabanlarını nasıl yedeklerim?

MySQL için --single-transaction flag'i ile InnoDB tablolarını tutarlı şekilde yedekleyin. PostgreSQL için -Fc (özel format) kullanın ve pg_restore -j ile paralel geri yükleme yapın. Çok büyük veritabanları için Percona XtraBackup (MySQL) veya pg_basebackup (PostgreSQL) gibi araçları değerlendirin.

Yedekleme ne sıklıkla yapılmalı?

Kritiklik düzeyine göre değişir: E-ticaret veya finansal veriler için saatlik; blog veya içerik siteleri için günlük yedek yeterlidir. RPO (Recovery Point Objective) hedeflerinize göre belirleyin. Genel öneri: günlük tam yedek + saatlik artımlı yedek.

Yedekleri nerede saklamalıyım?

3-2-1 kuralını uygulayın: 3 kopya, 2 farklı medya türü, 1 uzak konum. Yerel disk + uzak sunucu + bulut depolama (S3, Backblaze B2) ideal kombinasyondur. Aynı sunucuda saklanan yedekler, sunucu arızasında işe yaramaz.

Yedekleme sırasında veritabanı kilitlenir mi?

MySQL'de --single-transaction flag'i ile InnoDB tabloları kilitlenmez. MyISAM tabloları için kısa süreli kilit gerekebilir. PostgreSQL'de pg_dump MVCC sayesinde kilitleme yapmaz. Yoğun saatlerde yedekleme yapmaktan kaçının.

İlgili Makaleler

Ağ TrafiğiGelen GbpsGiden Gbps