Gereksinimler ve Ön Hazırlık
Sistemi kurmadan önce sunucu ortamınızın aşağıdaki gereksinimleri karşıladığından emin olmalısınız. Modern PHP uygulamaları için bu araçlar standart kabul edilir.
- PHP 8.2 veya üzeri: Performans ve güvenlik iyileştirmeleri için güncel sürüm şarttır.
- MySQL/MariaDB: Veritabanı yedeği alacağımız sistem.
- mysqldump: Veritabanı yedeği almak için kullanılan komut satırı aracı.
- SSH Erişimi: Cron Job tanımlayabilmek için sunucu erişimi.
- Yazma İzni: PHP scriptinin yedekleri kaydedeceği klasörün yazılabilir (chmod 755 veya 775) olması gerekir.
Veritabanı Yedekleme Scriptini Hazırlama
İlk adımımız, veritabanını dışa aktaran (export) bir PHP dosyası oluşturmaktır. Bu dosya, mysqldump komutunu kullanarak veritabanı içeriğini bir .sql dosyasına dönüştürecektir. Güvenlik nedeniyle veritabanı şifrelerini kodun içine yazmak yerine bir yapılandırma dosyasında tutmalıyız.
// config.php - Veritabanı bilgileri
Yukarıdaki yapılandırma dosyası, veritabanı erişim bilgilerini merkezi bir noktada tutmamızı sağlar. Şimdi ise yedekleme işlemini gerçekleştirecek ana scripti yazalım.
// backup.php
Burada escapeshellarg() fonksiyonunu kullanarak komut satırı enjeksiyonu riskini engelliyoruz. Bu, güvenlik için kritik bir adımdır.
Cron Job İle Otomasyonu Sağlama
Scriptimiz hazır olduğuna göre, bunu belirli zamanlarda çalıştıracak Cron Job ayarını yapmalıyız. Cron, Unix tabanlı sistemlerde zamanlanmış görevleri yöneten bir servistir.
SSH üzerinden crontab -e komutunu girerek zamanlayıcıyı düzenleyin. Aşağıdaki örnek, yedekleme işlemini her gün gece saat 03:00'te çalıştırır.
0 3 * * * /usr/bin/php /var/www/html/yedekleme/backup.php
Komut satırındaki 0 3 * * * ifadesi, görevin her gün 03:00'te tetikleneceğini belirtir. PHP yolunuzu which php komutu ile doğruladığınızdan emin olun.
Yedekleme Stratejileri ve Karşılaştırma
Yedekleme yaparken hangi yöntemi seçeceğiniz, projenizin ölçeğine bağlıdır. Aşağıdaki tablo, farklı yaklaşımları özetlemektedir.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| PHP + mysqldump | Hızlı, basit, özelleştirilebilir. | Büyük veritabanlarında zaman aşımı riski. |
| Panel (cPanel/Plesk) | Arayüz üzerinden kolay yönetim. | Daha az esneklik. |
| Bulut Senkronizasyonu | Felaket kurtarma için ideal. | Ek maliyet ve API entegrasyonu gerektirir. |
Eski Yedekleri Otomatik Temizleme
Sürekli yedek almak disk alanınızı hızla doldurabilir. 7 günden eski yedekleri silen bir temizlik mekanizması eklemek, sunucu sağlığı için zorunludur.
// cleanup.php
Bu scripti de Cron Job'a ekleyerek haftalık olarak çalıştırabilirsiniz. Bu sayede disk alanınız her zaman kontrol altında kalır.
Kritik Uyarı: Veritabanı yedeklerinizi asla web tarayıcısı üzerinden erişilebilecek (public_html içinde) bir klasörde tutmayın. Yedek dosyalarınızın çalınması, tüm verilerinizin ifşa olmasına neden olur. Yedek klasörünü web kök dizininin bir üst seviyesine taşıyın veya .htaccess ile erişimi engelleyin.
Sıkça Sorulan Sorular
Yedekleme sırasında veritabanı kilitlenir mi?
mysqldump komutu varsayılan olarak tablo kilitleme yapar. Çok büyük veritabanlarında --single-transaction parametresini ekleyerek kilitleme yapmadan yedek alabilirsiniz.
Yedeğin başarılı olduğunu nasıl anlarım?
Scriptin içine e-posta gönderen bir fonksiyon ekleyebilir veya log dosyalarına çıktı yazdırarak süreci takip edebilirsiniz.
Yedek dosyasını şifreleyebilir miyim?
Evet, yedekleme sonrasında openssl kütüphanesini kullanarak dosyayı şifreleyebilir ve güvenliği bir üst seviyeye taşıyabilirsiniz.
Cron Job çalışmazsa ne yapmalıyım?
Sunucunuzdaki /var/log/syslog veya /var/log/cron dosyalarını kontrol ederek hata mesajlarını inceleyin. Genellikle dosya yolu hataları veya izin sorunları yaşanır.
Veritabanı yedeği geri yükleme işlemi nasıl yapılır?
Geri yükleme için mysql -u kullanıcı -p veritabanı_adı < yedek.sql komutu kullanılır. Bu işlem mevcut verileri sileceği için çok dikkatli yapılmalıdır.
Yedekleme Süreçlerinde Performans Optimizasyonu
Büyük ölçekli veritabanlarında, mysqldump komutu tüm tabloları kilitlediği için sistem performansında geçici yavaşlamalara neden olabilir. Özellikle yüksek trafikli e-ticaret sitelerinde bu durum kullanıcı deneyimini olumsuz etkiler. Performansı artırmak için aşağıdaki stratejileri uygulayabilirsiniz:
- Single-Transaction Kullanımı: InnoDB tabloları için
--single-transactionparametresini ekleyerek, yedekleme sırasında tablonun kilitlenmesini önleyebilir ve tutarlı bir snapshot alabilirsiniz. - Tablo Bazlı Yedekleme: Çok büyük veritabanlarında tüm veritabanını tek seferde yedeklemek yerine, kritik tabloları ayrı, log tablolarını ayrı zamanlarda yedekleyin.
- Zamanlama: Yedekleme işlemini sunucu trafiğinin en düşük olduğu gece saatlerinde (örneğin 03:00) gerçekleştirin.
// Performans odaklı örnek komut yapısı
$command = sprintf(
'mysqldump --user=%s --password=%s --host=%s --single-transaction --quick --lock-tables=false %s > %s',
escapeshellarg($dbUser),
escapeshellarg($dbPass),
escapeshellarg($dbHost),
escapeshellarg($dbName),
escapeshellarg($backupFile)
);
exec($command);
Gelişmiş Hata Ayıklama ve Loglama Mekanizması
Otomatik sistemlerin en büyük sorunu, hata oluştuğunda sistem yöneticisinin bundan haberdar olmamasıdır. Basit bir error_log kullanımı yerine, yedekleme sürecini adım adım izleyen bir loglama yapısı kurmalısınız.
Adım Adım İzleme (Logging)
Yedekleme scriptinizin her aşamasını bir log dosyasına yazdırarak, işlemin nerede kesildiğini tespit edebilirsiniz. Aşağıdaki örnek, işlemin başarı durumunu ve hata mesajlarını bir dosyaya kaydeder:
function logMessage($message) {
$timestamp = date('Y-m-d H:i:s');
file_put_contents('backup_log.txt', "[$timestamp] $message" . PHP_EOL, FILE_APPEND);
}
// Kullanım örneği
if (exec($command . ' 2>&1', $output, $returnCode) !== false) {
if ($returnCode === 0) {
logMessage("Yedekleme başarıyla tamamlandı: " . $backupFile);
} else {
logMessage("HATA: Yedekleme başarısız oldu. Kod: $returnCode. Detay: " . implode(' ', $output));
}
}
E-posta Bildirimleri ile Anlık Takip
Sadece log dosyasına yazmak yeterli olmayabilir. Kritik bir hata oluştuğunda sistemin size e-posta göndermesini sağlamak için PHP'nin mail() fonksiyonunu veya daha profesyonel olan PHPMailer kütüphanesini kullanabilirsiniz.
| Hata Durumu | Öncelik | Aksiyon |
|---|---|---|
| Veritabanı bağlantı hatası | Kritik | Anında E-posta Gönder |
| Disk alanı yetersiz | Yüksek | Uyarı Gönder ve İşlemi Durdur |
| Başarılı Yedekleme | Düşük | Haftalık Özet Raporu Gönder |
Bu yapı sayesinde, yedekleme sisteminiz sadece sessizce çalışan bir script olmaktan çıkıp, yönetilebilir ve izlenebilir bir kurumsal araca dönüşecektir.
Sonuç
PHP ile Cron Job kullanarak oluşturduğunuz bu otomatik yedekleme sistemi, verilerinizin güvenliği için attığınız en önemli adımlardan biridir. 2026 yılı itibarıyla, verilerinizi periyodik olarak yedeklemek bir seçenek değil, zorunluluktur. Şimdi bu sistemi kurduktan sonra, bir sonraki adım olarak yedeklerinizi Amazon S3 veya Google Cloud Storage gibi harici bir depolama servisine otomatik olarak yükleyen bir yapı geliştirmeyi düşünebilirsiniz.
Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında kullanmadan önce yedekleme scriptlerinizi mutlaka test edin. Veri kaybı veya güvenlik ihlallerinden doğabilecek zararlardan geliştirici sorumludur.


Yorumlar (0)
Yorum Yaz