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.

Yayınlanma: 01.02.2024 Güncellenme: 20.11.2024

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

Etiketler

mysql backup veritabanı yedekleme mysqldump otomatik yedekleme