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.
İç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
# 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
# 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
# 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
# ~/.my.cnf dosyası oluştur
nano ~/.my.cnf
[client]
user=root
password=SIFRENIZ
host=localhost
# 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
# 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
# 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
# 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)
# ~/.pgpass dosyası oluştur
nano ~/.pgpass
# Format: host:port:database:user:password
localhost:5432:*:postgres:SIFRENIZ
# Dosya izinlerini kısıtla
chmod 600 ~/.pgpass
Cron ile Otomatik Yedekleme
MySQL Otomatik Yedekleme Script'i
# /root/scripts/mysql-backup.sh dosyası oluştur
mkdir -p /root/scripts
nano /root/scripts/mysql-backup.sh
#!/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"
# 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
#!/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
# 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
# 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
- Düzenli yedekleme: Kritik veritabanları için günlük, hatta saatlik yedek
- Sıkıştırma: Disk alanı tasarrufu için gzip kullanın
- Uzak depolama: Yedekleri farklı bir sunucuda veya bulutta saklayın
- Saklama politikası: Günlük 7, haftalık 4, aylık 12 yedek saklayın
- Şifreleme: Hassas veriler için yedekleri şifreleyin
- İzleme: Yedekleme başarısızlıklarını e-posta ile bildirin
- 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.
İlgili Makaleler
VDS Sunucuya SSH ile Bağlanma Rehberi (PuTTY & Terminal)
Linux VDS sunucunuza SSH ile bağlanma adımları: PuTTY, Terminal, anahtar tabanlı kimlik doğrulama, Path Panel firewall kuralı ve güvenlik ipuçları.
Windows VDS'e RDP ile Bağlanma ve Güvenlik Rehberi
Windows Server VDS sunucunuza Uzak Masaüstü (RDP) ile bağlanma adımları, NLA güvenlik ayarları, Path Panel firewall kuralı ve sorun giderme rehberi.
VDS Sunucu İşletim Sistemi Değiştirme Rehberi (Reinstall)
REXE panel üzerinden VDS sunucunuzun işletim sistemini değiştirme adımları, yedekleme önerileri, desteklenen Linux ve Windows Server sürümleri.