MySQL Otomatik Yedekleme
MySQL veritabanlarınızı otomatik olarak yedekleyen ve eski yedekleri temizleyen script. Sıkıştırma ve tarih damgası desteği ile gelir.
Detaylı Bilgi
Bu script, MySQL/MariaDB veritabanlarınızı otomatik olarak yedekler, sıkıştırır ve eski yedekleri temizler. Veri kaybına karşı koruma sağlayan kritik bir araçtır ve özellikle production ortamlarında vazgeçilmezdir.
Script Ne İşe Yarar?
Bu script, MySQL veritabanlarınızın güvenli bir şekilde yedeklenmesini sağlar. Her veritabanı için ayrı bir yedek dosyası oluşturur ve şunları yapar:
- Tüm veritabanlarını otomatik olarak yedekler
- Yedekleri gzip ile sıkıştırarak disk alanı tasarrufu sağlar
- Her yedeğe tarih damgası ekler
- Belirlenen süreden eski yedekleri otomatik olarak siler
- Stored procedures, triggers ve events dahil tüm veritabanı nesnelerini yedekler
Neden Kullanmalısınız?
Veritabanı yedekleme, herhangi bir veri kaybı durumunda sisteminizi kurtarabilmeniz için kritik öneme sahiptir. Bu script sayesinde:
- Düzenli ve otomatik yedekleme yapabilirsiniz
- Disk alanını verimli kullanırsınız (sıkıştırma ile)
- Eski yedekler otomatik temizlenir
- Her veritabanı için ayrı yedek dosyası oluşturulur
- Cron job ile tam otomasyon sağlanır
Güvenlik Özellikleri
- InnoDB tabloları için tutarlı yedekleme (--single-transaction)
- Sistem veritabanları otomatik olarak hariç tutulur
- Yedek dosyaları sıkıştırılarak korunur
- Hata durumunda detaylı raporlama
Nasıl Kullanılır?
Adım Adım Kullanım Kılavuzu
1. Script Dosyasını Oluşturun
Script kodunu bir dosyaya kaydedin:
nano mysql_backup.sh
Script kodunu yapıştırın ve kaydedin.
2. Yapılandırma Ayarları
Script başındaki değişkenleri düzenleyin:
BACKUP_DIR="/backup/mysql" # Yedeklerin kaydedileceği dizin
MYSQL_USER="root" # MySQL kullanıcı adı
MYSQL_PASSWORD="your_password" # MySQL şifresi
RETENTION_DAYS=7 # Kaç günlük yedekler saklanacak
3. Güvenli Şifre Saklama (Önerilen)
Şifreyi script içinde saklamak yerine .my.cnf dosyası kullanın:
# ~/.my.cnf dosyası oluştur
[client]
user=root
password=your_password
# İzinleri kısıtla
chmod 600 ~/.my.cnf
# Script içinde şifreyi kaldırın, sadece kullanıcı adını kullanın
mysqldump -u"$MYSQL_USER" ...
4. Yedekleme Dizini Oluşturun
sudo mkdir -p /backup/mysql
sudo chown $USER:$USER /backup/mysql
5. Scripti Çalıştırılabilir Yapın
chmod +x mysql_backup.sh
6. Test Çalıştırması
./mysql_backup.sh
7. Cron Job ile Otomatikleştirin
# Crontab düzenle
crontab -e
# Her gün saat 02:00'de çalıştır
0 2 * * * /path/to/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
Yedek Geri Yükleme
Yedeği geri yüklemek için:
# Sıkıştırılmış yedeği aç
gunzip database_name_20240201_020000.sql.gz
# Veritabanını geri yükle
mysql -u root -p database_name < database_name_20240201_020000.sql Gereksinimler
Gereksinimler
- MySQL/MariaDB: Veritabanı sunucusu kurulu ve çalışıyor olmalı
- mysqldump: MySQL yedekleme aracı kurulu olmalı
- gzip: Sıkıştırma için gerekli (genellikle varsayılan kurulu)
- Yazma İzni: Yedekleme dizini için yazma yetkisi
- Yeterli Disk Alanı: Yedekler için yeterli alan
- MySQL Erişim Yetkisi: Veritabanlarına okuma yetkisi
Kurulum Kontrolü
Gerekli araçların kurulu olup olmadığını kontrol edin:
# MySQL/MariaDB kontrolü
mysql --version
# mysqldump kontrolü
mysqldump --version
# gzip kontrolü
gzip --version
MySQL Kullanıcı Yetkileri
Yedekleme için gerekli yetkiler:
# MySQL'e bağlan
mysql -u root -p
# Yedekleme kullanıcısı oluştur (önerilen)
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES; Kullanım Senaryoları
Kullanım Senaryoları
1. Günlük Otomatik Yedekleme
Production veritabanlarınızı her gün otomatik olarak yedekleyin. Cron job ile tam otomasyon sağlayın.
2. Disaster Recovery Hazırlığı
Sunucu çökmesi, donanım arızası veya veri bozulması durumunda hızlıca geri yükleme yapabilmek için düzenli yedekler alın.
3. Veri Göçü
Veritabanını başka bir sunucuya taşırken yedek alıp geri yükleyebilirsiniz.
4. Test Ortamları
Test ortamlarında production verilerinin kopyasını oluşturmak için yedekleri kullanabilirsiniz.
5. Veri Analizi
Production verilerini analiz etmek için yedekleri kullanabilir, böylece production sunucusuna yük bindirmezsiniz.
6. Uyumluluk ve Denetim
Bazı sektörlerde düzenli yedekleme zorunludur. Bu script ile uyumluluk sağlayabilirsiniz.
Örnekler
Kullanım Örnekleri
Örnek 1: Temel Kullanım
# Scripti çalıştır
./mysql_backup.sh
# Çıktı:
# ======================================
# MYSQL BACKUP PROCESS
# ======================================
# Backup directory: /backup/mysql
# Date: 20240201_020000
# Retention: 7 days
#
# 📦 Backing up database: myapp
# ✓ Backup completed: /backup/mysql/myapp_20240201_020000.sql.gz
# 📊 Size: 15M
Örnek 2: Cron Job ile Otomatikleştirme
# Crontab düzenle
crontab -e
# Her gün saat 02:00'de çalıştır
0 2 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
# Her 6 saatte bir çalıştır
0 */6 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
Örnek 3: Uzak Sunucuya Yedekleme
# Scripti düzenleyerek rsync ekleyin
rsync -avz /backup/mysql/ user@remote-server:/remote/backup/mysql/
Örnek 4: E-posta Bildirimi
# Script sonuna ekleyin
if [ $? -eq 0 ]; then
echo "Backup completed successfully" | mail -s "MySQL Backup Success" [email protected]
else
echo "Backup failed!" | mail -s "MySQL Backup Failed" [email protected]
fi Kod
#!/bin/bash
# MySQL Automated Backup Script
BACKUP_DIR="/backup/mysql"
MYSQL_USER="root"
MYSQL_PASSWORD="your_password"
RETENTION_DAYS=7
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
echo "======================================"
echo " MYSQL BACKUP PROCESS"
echo "======================================"
echo "Backup directory: $BACKUP_DIR"
echo "Date: $DATE"
echo "Retention: $RETENTION_DAYS days"
echo ""
DATABASES=$(mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")
for DB in $DATABASES; do
echo "📦 Backing up database: $DB"
BACKUP_FILE="$BACKUP_DIR/${DB}_${DATE}.sql"
mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" \
--single-transaction \
--routines \
--triggers \
--events \
"$DB" > "$BACKUP_FILE"
if [ $? -eq 0 ]; then
gzip "$BACKUP_FILE"
echo " ✓ Backup completed: ${BACKUP_FILE}.gz"
SIZE=$(du -h "${BACKUP_FILE}.gz" | cut -f1)
echo " 📊 Size: $SIZE"
else
echo " ✗ Backup failed for database: $DB"
echo " ⚠️ Check MySQL credentials and permissions"
fi
echo ""
done
echo "🧹 Cleaning backups older than $RETENTION_DAYS days..."
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "✓ Cleanup completed"
echo ""
echo "======================================"
echo " BACKUP SUMMARY"
echo "======================================"
echo "Total backup files:"
ls -lh "$BACKUP_DIR"/*.gz 2>/dev/null | wc -l
echo ""
echo "Total disk usage:"
du -sh "$BACKUP_DIR"
echo ""
echo "Latest 5 backups:"
ls -lth "$BACKUP_DIR"/*.gz 2>/dev/null | head -n 5
echo ""
echo "======================================"
echo "Backup process completed at $(date)"
echo "======================================"
Kullanım
# Scripti düzenle ve bilgilerinizi girin
nano mysql_backup.sh
# Çalıştırılabilir yap
chmod +x mysql_backup.sh
# Manuel çalıştır
sudo ./mysql_backup.sh
# Crontab ile otomatikleştir (her gün 2:00)
sudo crontab -e
# Ekle: 0 2 * * * /path/to/mysql_backup.sh
Sorun Giderme
Sorun Giderme
Problem: "Access denied for user" Hatası
Çözüm: MySQL kullanıcı adı ve şifresini kontrol edin. .my.cnf dosyası kullanıyorsanız izinlerini kontrol edin:
chmod 600 ~/.my.cnf
Problem: "mysqldump: command not found"
Çözüm: mysqldump kurulu değil. Kurun:
# Ubuntu/Debian
sudo apt-get install mysql-client
# CentOS/RHEL
sudo yum install mysql
Problem: "No space left on device"
Çözüm: Disk alanını kontrol edin ve eski yedekleri temizleyin:
df -h
du -sh /backup/mysql
# Eski yedekleri manuel silin veya RETENTION_DAYS değerini azaltın
Problem: Yedekleme Çok Yavaş
Çözüm: Büyük veritabanları için:
- --single-transaction yerine --lock-tables kullanın (MyISAM için)
- Büyük tabloları ayrı ayrı yedekleyin
- Yedekleme zamanını düşük trafik saatlerine ayarlayın
Problem: Yedek Dosyası Bozuk
Çözüm: Yedek dosyasını kontrol edin:
# Sıkıştırılmış dosyayı test et
gunzip -t backup_file.sql.gz
# SQL dosyasını kontrol et
head -n 20 backup_file.sql