Php İle Cron Job Kullanarak Otomatik Veri Yedekleme Sistemi Nasıl Yapılır?

Php İle Cron Job Kullanarak Otomatik Veri Yedekleme Sistemi Nasıl Yapılır?
Php İle Cron Job Kullanarak Otomatik Veri Yedekleme Sistemi Nasıl Yapılır?

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-transaction parametresini 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.
Bu yazıya tepkinizi paylaşın:
Emre Çelik

Verimlilik ve zaman yönetimi üzerine odaklanan bir yazarım. Günlük hayatı optimize eden ipuçları ve iş akışı optimizasyonu konularında içerikler üretiyorum.

Yorumlar (0)

Yorum Yaz