sunucuhataları
teknik çözüm merkezi
Ara Giriş Yap Üye Ol
🏠 Ana Sayfa 📚 Kurulum Rehberleri
Kategoriler
🌐 Web Sunucuları 🐧 İşletim Sistemleri 📦 Sanallaştırma & VPS 🖥️ Kontrol Panelleri 🔒 SSL & Güvenlik 📝 CMS & Uygulamalar 🗄️ Veritabanı 📧 Mail Sunucusu 🗨️ Forum ℹ️ Hakkımızda 📧 İletişim
Giriş Yap Üye Ol
Ana Sayfa Veritabanı MySQL Kurulumu MySQL Veritabanı Yedekleme: mysqldump ve Otomat...
🐬 MySQL Kurulumu

MySQL Veritabanı Yedekleme: mysqldump ve Otomatik cron

mysqldump ile MySQL veritabanı yedekleme: gzip sıkıştırma, .my.cnf ile güvenli kimlik doğrulama ve cron ile otomasyonu.

📅 18 Mayıs 2025 👁 5 görüntülenme ⏱ 4 dk okuma
𝕏 Paylaş
📋 İçindekiler göster/gizle

mysqldump Nedir?

mysqldump, MySQL ve MariaDB veritabanlarının mantıksal yedeklerini (SQL dump) almak için kullanılan standart komut satırı aracıdır. Yedek dosyası, veritabanını yeniden oluşturmak için gereken CREATE TABLE, INSERT ve diğer SQL ifadelerini içerir; bu sayede farklı MySQL sürümleri ve sunucular arasında veri aktarımı kolaylaşır.

mysqldump ile; tek veritabanı, birden fazla veritabanı veya tüm veritabanları yedeklenebilir. Sıkıştırma, uzak sunucuya aktarım ve cron ile otomasyonu destekler. InnoDB tabloları için --single-transaction parametresi, tablo kilitleme olmaksızın tutarlı yedek alınmasını sağlar.

Temel mysqldump Kullanımı

# Tek veritabanı yedekleme
mysqldump -u root -p mydb > /backup/mydb.sql

# Şifre komut satırında (cron için, güvenlik riski taşır)
mysqldump -u root -p"SIFRE" mydb > /backup/mydb.sql

# Belirli tablolar
mysqldump -u root -p mydb users posts > /backup/mydb_tables.sql

# Tüm veritabanları
mysqldump -u root -p --all-databases > /backup/all_dbs.sql

Üretim için Önerilen Parametreler

mysqldump -u root -p \
  --single-transaction \
  --routines \
  --triggers \
  --events \
  --set-gtid-purged=OFF \
  --compress \
  mydb > /backup/mydb_$(date +%Y%m%d_%H%M%S).sql

Parametre açıklamaları:

  • --single-transaction: InnoDB için tablo kilidi olmadan tutarlı anlık görüntü
  • --routines: Stored procedure ve function'ları dahil et
  • --triggers: Trigger'ları dahil et
  • --events: Event Scheduler olaylarını dahil et

Sıkıştırılmış Yedek Alma

# gzip ile sıkıştırma (en yaygın)
mysqldump -u root -p mydb | gzip > /backup/mydb_$(date +%Y%m%d).sql.gz

# bzip2 ile (daha iyi sıkıştırma, daha yavaş)
mysqldump -u root -p mydb | bzip2 > /backup/mydb.sql.bz2

# pigz ile çok çekirdekli sıkıştırma (büyük veritabanları için)
sudo apt install pigz -y
mysqldump -u root -p mydb | pigz > /backup/mydb.sql.gz

MySQL Yedek Kullanıcısı Oluşturma

mysql -u root -p
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'BackupSifre2024!';
GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES, EVENT ON *.* TO 'backup_user'@'localhost';
GRANT RELOAD, REPLICATION CLIENT ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;

.my.cnf ile Güvenli Kimlik Doğrulama

Cron scriptlerinde şifreyi açık yazmamak için .my.cnf kullanın:

sudo nano /root/.my.cnf
[mysqldump]
user=backup_user
password=BackupSifre2024!

[mysql]
user=backup_user
password=BackupSifre2024!
sudo chmod 600 /root/.my.cnf
# Artık şifre girmeden:
mysqldump mydb > /backup/mydb.sql

Otomatik Yedek Script

sudo nano /usr/local/bin/mysql-backup.sh
#!/bin/bash
BACKUP_DIR="/backup/mysql"
RETENTION_DAYS=7
DATE=$(date +%Y-%m-%d_%H-%M-%S)
LOG="/var/log/mysql-backup.log"

mkdir -p "$BACKUP_DIR"

echo "[$DATE] Yedekleme basliyor..." >> "$LOG"

# Tüm veritabanlarını listele (sistem DB'leri hariç)
DATABASES=$(mysql -e "SHOW DATABASES;" | grep -Ev "information_schema|performance_schema|mysql|sys")

for DB in $DATABASES; do
    DOSYA="$BACKUP_DIR/${DB}_${DATE}.sql.gz"
    mysqldump --single-transaction --routines --triggers "$DB" | \
      gzip > "$DOSYA"
    if [ $? -eq 0 ]; then
        echo "[$DATE] OK: $DB -> $DOSYA" >> "$LOG"
    else
        echo "[$DATE] HATA: $DB yedeklenemedi!" >> "$LOG"
    fi
done

# Eski yedekleri sil
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "[$DATE] $RETENTION_DAYS gun'den eski yedekler silindi." >> "$LOG"
echo "[$DATE] Yedekleme tamamlandi." >> "$LOG"
sudo chmod +x /usr/local/bin/mysql-backup.sh

Cron ile Otomatik Çalıştırma

sudo crontab -e
# Her gece 02:30'da MySQL yedekle
30 2 * * * /usr/local/bin/mysql-backup.sh

# Her hafta Pazar sabahı tam yedek (uzak sunucuya rsync)
0 3 * * 0 rsync -avzq /backup/mysql/ backup@10.0.0.2:/remote-backup/mysql/

Uzak Sunucuya Yedek Aktarma

# SCP ile
scp /backup/mydb.sql.gz user@backup-server.com:/backup/

# Doğrudan pipe ile uzak sunucuya
mysqldump mydb | gzip | ssh user@backup.com "cat > /backup/mydb_$(date +%Y%m%d).sql.gz"

Geri Yükleme

# SQL dosyasından geri yükleme
mysql -u root -p mydb < /backup/mydb.sql

# Sıkıştırılmış dosyadan geri yükleme
gunzip < /backup/mydb_20240101.sql.gz | mysql -u root -p mydb

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

Sık Karşılaşılan Sorunlar

Error: "Access denied"

mysql -u root -p -e "SHOW GRANTS FOR 'backup_user'@'localhost';"

Büyük Veritabanı - Timeout

mysqldump --net-buffer-length=16384 --max-allowed-packet=512M mydb > backup.sql

Sonuç

mysqldump ile güvenli, otomatik MySQL yedekleme sistemini kurduğunuz. .my.cnf ile şifre güvenliği, retention politikası ile disk yönetimi ve cron ile tam otomasyon sağladınız. Düzenli yedekleme testleri yaparak geri yükleme sürecinin çalıştığını doğrulamayı unutmayın.

🤔 Bu kurulumda sorun mu yaşıyorsunuz?

Hata mesajınızı kopyalayıp foruma konu açın. Topluluğumuz size özel durumunuza göre yardımcı olacaktır.

🗨️ Foruma Katıl & Yardım Al

Yorumlar

Henüz yorum yok. İlk yorumu siz yapın!

Yorum Yap

Yorumunuz onaylandıktan sonra yayınlanır.