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.
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.
Yorumlar
Henüz yorum yok. İlk yorumu siz yapın!