Merhaba arkadaşlar, bugün sizlere sunucu yönetiminin en kritik konularından birini, veritabanı yedeklemeyi anlatacağım. Özellikle MySQL veya MariaDB kullanan arkadaşlar için, `mysqldump` ile nasıl güvenli ve otomatik yedekleme alabileceğinizi, bu yedekleri nasıl düzenleyip saklayabileceğinizi ve en önemlisi bu işlemi her gün otomatik yapacak bir `cron job`'ı nasıl kuracağınızı adım adım göstereceğim. Benim sunucularda da kullandığım, kurşun gibi sağlam bir yöntem bu. Unutmayın, yedek almayanın verisi, kaderine terk edilmiş demektir!
1. Adım: mysqldump Nedir ve Temel Kullanımı
`mysqldump`, MySQL/MariaDB'nin bize sunduğu, bir veritabanının yapısını ve içeriğini SQL formatında dışa aktarmamızı sağlayan harika bir araçtır. Oluşturduğu `.sql` dosyası, veritabanınızı tamamen yeniden oluşturmak için gereken tüm komutları içerir.
Temel kullanımı çok basit. Tek bir veritabanını yedeklemek için şu komutu kullanırız:
Örnek: `forumdb` adlı veritabanını `forum_backup.sql` olarak yedekleyelim.
Burada dikkat ettiyseniz, dosya adına `$(date +\%Y\%m\%d)` ekleyerek yedek dosyasının adını `forum_backup_20241015` gibi tarihli hale getirdim. Bu, yedekleri takip etmek için çok önemli bir alışkanlıktır. Parolayı `-p`'den hemen sonra boşluksuz yazdığıma dikkat edin. Güvenlik için bu yöntem yerine aşağıda anlatacağım konfigürasyon dosyası yöntemini öneririm.
2. Adım: Güvenli Kimlik Doğrulama ve .my.cnf Dosyası
Komut satırında parola göstermek güvenlik riskidir. Bunun yerine, kullanıcı ev dizininde (örn: /root/.my.cnf) bir konfigürasyon dosyası oluşturabiliriz. Bu dosyaya kimlik bilgilerimizi yazarak, `mysqldump` komutunu parola girmeden çalıştırabiliriz.
Önce .my.cnf dosyasını oluşturalım:
İçine aşağıdaki satırları ekleyip kaydedelim (`kullanici_adi` ve `parola` kısımlarını kendi bilgilerinizle değiştirin):
Son olarak, bu dosyanın yetkilerini sadece sahibinin okuyabileceği şekilde ayarlayalım. Bu adım kesinlikle atlanmamalıdır.
Artık `mysqldump` komutunu daha basit ve güvenli bir şekilde çalıştırabiliriz:
3. Adım: Gelişmiş mysqldump Seçenekleri ve Optimize Yedek Scripti
Temel yedekleme işe yarar ama profesyonel bir yedek için birkaç önemli parametre daha kullanmalıyız. İşte benim tüm sunucularımda kullandığım, oldukça sağlam bir yedekleme komutu:
Şimdi bu parametreler ne işe yarıyor, kısaca açıklayayım:
- `--single-transaction`: Yedek alırken veritabanını kilitlemez, çalışan uygulamanızı (forumunuzu) durdurmaz. InnoDB tabloları için çok önemli.
- `--quick`: Büyük tabloları daha verimli bir şekilde yedekler.
- `--routines --events --triggers`: Saklı yordamları, event'ları ve tetikleyicileri de yedeğe dahil eder.
- `--add-drop-database`: Yedeği geri yüklerken, önce veritabanını silip yeniden oluşturur. Temiz bir kurulum sağlar.
- `| gzip`: Yedek dosyasını anında sıkıştırır, disk alanından ciddi tasarruf ettirir.
Bu komutu bir script haline getirelim. `/usr/local/bin/db_backup.sh` dosyasını oluşturalım:
Script'e çalıştırma yetkisi verelim:
Artık sadece `./db_backup.sh` yazarak tüm bu işlemleri tek seferde yapabilirsiniz.
4. Adım: Dikkat Edilmesi Gereken Kritik Noktalar
1. Yedekleri Test Edin! Ayda en az bir kere, aldığınız bir yedeği test bir sunucuda veya yerel ortamda geri yükleyerek çalıştığını doğrulayın. Yedek alıp geri yüklemeyi bilmemek, yedek almamakla aynı şeydir.
2. Yedekleri Farklı Bir Yerde Saklayın. Yedekleriniz sunucu ile aynı diskte duruyorsa, disk arızasında her şeyi kaybedersiniz. Mümkünse başka bir sunucuya, object storage'a (S3 gibi) veya en azından farklı bir mount point'e kopyalayan bir mekanizma ekleyin.
3. .my.cnf Dosyasının Güvenliği: Bu dosyanın izinlerinin `600` olduğundan ve içindeki kullanıcının yedekleme için gerekli minimum yetkilere sahip olduğundan emin olun.
5. Adım: Cron Job ile Yedeklemeyi Otomatikleştirme
Artık her şey hazır. Sıra, bu script'in her gün kendiliğinden çalışmasını sağlamaya geldi. Bunun için `cron` kullanacağız.
Cron tablosunu düzenlemek için:
Açılan dosyaya, script'imizin her gün gece 03:00'te çalışması için aşağıdaki satırı ekleyelim:
Bu ayarla, script her gece 03:00'te çalışacak ve çıktıları `/var/log/db_backup.log` dosyasına yazılacak. Bu log dosyasını düzenli kontrol etmeyi unutmayın.
Eğer haftalık yedek almak isterseniz (Pazar günü 03:00'te), şu satırı kullanabilirsiniz:
`mysqldump`, MySQL/MariaDB'nin bize sunduğu, bir veritabanının yapısını ve içeriğini SQL formatında dışa aktarmamızı sağlayan harika bir araçtır. Oluşturduğu `.sql` dosyası, veritabanınızı tamamen yeniden oluşturmak için gereken tüm komutları içerir.
Temel kullanımı çok basit. Tek bir veritabanını yedeklemek için şu komutu kullanırız:
Bash:
mysqldump -u [KULLANICI_ADI] -p[PAROLA] [VERITABANI_ADI] > [YEDEK_DOSYA_ADI].sql
Örnek: `forumdb` adlı veritabanını `forum_backup.sql` olarak yedekleyelim.
Bash:
mysqldump -u root -pSifrem123 forumdb > /root/backups/forum_backup_$(date +\%Y\%m\%d).sql
Burada dikkat ettiyseniz, dosya adına `$(date +\%Y\%m\%d)` ekleyerek yedek dosyasının adını `forum_backup_20241015` gibi tarihli hale getirdim. Bu, yedekleri takip etmek için çok önemli bir alışkanlıktır. Parolayı `-p`'den hemen sonra boşluksuz yazdığıma dikkat edin. Güvenlik için bu yöntem yerine aşağıda anlatacağım konfigürasyon dosyası yöntemini öneririm.
Komut satırında parola göstermek güvenlik riskidir. Bunun yerine, kullanıcı ev dizininde (örn: /root/.my.cnf) bir konfigürasyon dosyası oluşturabiliriz. Bu dosyaya kimlik bilgilerimizi yazarak, `mysqldump` komutunu parola girmeden çalıştırabiliriz.
Önce .my.cnf dosyasını oluşturalım:
Bash:
nano /root/.my.cnf
İçine aşağıdaki satırları ekleyip kaydedelim (`kullanici_adi` ve `parola` kısımlarını kendi bilgilerinizle değiştirin):
INI:
[client]
user = kullanici_adi
password = "guclu_parolaniz_buraya"
Son olarak, bu dosyanın yetkilerini sadece sahibinin okuyabileceği şekilde ayarlayalım. Bu adım kesinlikle atlanmamalıdır.
Bash:
chmod 600 /root/.my.cnf
Artık `mysqldump` komutunu daha basit ve güvenli bir şekilde çalıştırabiliriz:
Bash:
mysqldump forumdb > /root/backups/forum_backup.sql
Temel yedekleme işe yarar ama profesyonel bir yedek için birkaç önemli parametre daha kullanmalıyız. İşte benim tüm sunucularımda kullandığım, oldukça sağlam bir yedekleme komutu:
Bash:
mysqldump --single-transaction --quick --lock-tables=false \
--routines --events --triggers --add-drop-database \
forumdb | gzip > /root/backups/forumdb_$(date +\%Y\%m\%d_\%H\%M).sql.gz
Şimdi bu parametreler ne işe yarıyor, kısaca açıklayayım:
- `--single-transaction`: Yedek alırken veritabanını kilitlemez, çalışan uygulamanızı (forumunuzu) durdurmaz. InnoDB tabloları için çok önemli.
- `--quick`: Büyük tabloları daha verimli bir şekilde yedekler.
- `--routines --events --triggers`: Saklı yordamları, event'ları ve tetikleyicileri de yedeğe dahil eder.
- `--add-drop-database`: Yedeği geri yüklerken, önce veritabanını silip yeniden oluşturur. Temiz bir kurulum sağlar.
- `| gzip`: Yedek dosyasını anında sıkıştırır, disk alanından ciddi tasarruf ettirir.
Bu komutu bir script haline getirelim. `/usr/local/bin/db_backup.sh` dosyasını oluşturalım:
Bash:
#!/bin/bash
# Yedeklerin kaydedileceği dizin
BACKUP_DIR="/root/backups"
# Yedeklenecek veritabanı adı
DB_NAME="forumdb"
# Yedek dosyası adı (Tarih ve saat bilgisi ile)
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_$(date +\%Y\%m\%d_\%H\%M).sql.gz"
# Yedek dizini yoksa oluştur
mkdir -p $BACKUP_DIR
# Yedekleme komutunu çalıştır
mysqldump --single-transaction --quick --lock-tables=false \
--routines --events --triggers --add-drop-database \
$DB_NAME | gzip > $BACKUP_FILE
# 30 günden eski yedekleri sil (Opsiyonel, disk alanı için)
find $BACKUP_DIR -name "${DB_NAME}_.sql.gz" -mtime +30 -delete
echo "[$(date)] Yedekleme tamamlandı: $BACKUP_FILE"
Script'e çalıştırma yetkisi verelim:
Bash:
chmod +x /usr/local/bin/db_backup.sh
Artık sadece `./db_backup.sh` yazarak tüm bu işlemleri tek seferde yapabilirsiniz.
1. Yedekleri Test Edin! Ayda en az bir kere, aldığınız bir yedeği test bir sunucuda veya yerel ortamda geri yükleyerek çalıştığını doğrulayın. Yedek alıp geri yüklemeyi bilmemek, yedek almamakla aynı şeydir.
2. Yedekleri Farklı Bir Yerde Saklayın. Yedekleriniz sunucu ile aynı diskte duruyorsa, disk arızasında her şeyi kaybedersiniz. Mümkünse başka bir sunucuya, object storage'a (S3 gibi) veya en azından farklı bir mount point'e kopyalayan bir mekanizma ekleyin.
3. .my.cnf Dosyasının Güvenliği: Bu dosyanın izinlerinin `600` olduğundan ve içindeki kullanıcının yedekleme için gerekli minimum yetkilere sahip olduğundan emin olun.
Artık her şey hazır. Sıra, bu script'in her gün kendiliğinden çalışmasını sağlamaya geldi. Bunun için `cron` kullanacağız.
Cron tablosunu düzenlemek için:
Bash:
crontab -e
Açılan dosyaya, script'imizin her gün gece 03:00'te çalışması için aşağıdaki satırı ekleyelim:
Bash:
# Her gün saat 03:00'te veritabanı yedekleme scriptini çalıştır
0 3 /usr/local/bin/db_backup.sh > /var/log/db_backup.log 2>&1
Bu ayarla, script her gece 03:00'te çalışacak ve çıktıları `/var/log/db_backup.log` dosyasına yazılacak. Bu log dosyasını düzenli kontrol etmeyi unutmayın.
Eğer haftalık yedek almak isterseniz (Pazar günü 03:00'te), şu satırı kullanabilirsiniz:
Bash: