Laravel İle Dinamik Bir Veritabanı Yedekleme Ve Sıkıştırma Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Sistemi kurmadan önce sunucunuzda ve Laravel projenizde bazı ön koşulların sağlanması gerekir. Özellikle veritabanı yedeğini almak için kullanılan mysqldump veya pg_dump gibi araçların sunucuda yüklü olması şarttır.

  • Laravel 11 veya 12 sürümü (2026 güncel sürüm).
  • Sunucuda mysqldump (MySQL/MariaDB için) veya ilgili veritabanı istemcisinin kurulu olması.
  • PHP 8.3+ sürümü.
  • Dosya sistemi yönetimi için league/flysystem paketinin yapılandırılmış olması.

Projenizde config/database.php dosyasında veritabanı kimlik bilgilerinizin doğru tanımlandığından emin olun. Yedekleme işlemi sırasında veritabanı şifrelerinin komut satırı argümanlarında açıkça görünmemesi için .env dosyasını kullanacağız.

Adım 1: Yedekleme İçin Özel Bir Artisan Komutu Oluşturma

Laravel'de yedekleme sürecini tetiklemek için özel bir Artisan komutu oluşturmak, süreci yönetilebilir kılar. Bu komut, veritabanını dışa aktaracak, ardından bir arşiv dosyasına dönüştürecektir.

php artisan make:command DatabaseBackupCommand

Bu komut, app/Console/Commands/DatabaseBackupCommand.php dosyasını oluşturur. Şimdi bu dosyanın içine yedekleme mantığını ekleyelim.


namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;

class DatabaseBackupCommand extends Command
{
    protected $signature = 'db:backup';
    protected $description = 'Veritabanını yedekle ve sıkıştır';

    public function handle()
    {
        $filename = "backup-" . now()->format('Y-m-d_H-i-s') . ".sql";
        $path = storage_path("app/backups/" . $filename);

        $command = sprintf(
            'mysqldump -u%s -p%s %s > %s',
            config('database.connections.mysql.username'),
            config('database.connections.mysql.password'),
            config('database.connections.mysql.database'),
            $path
        );

        exec($command);
        $this->info("Yedekleme başarıyla oluşturuldu: " . $filename);
    }
}

Adım 2: Verileri Sıkıştırma ve Güvenli Depolama

Ham SQL dosyaları oldukça büyük boyutlara ulaşabilir. Bu nedenle, ZipArchive sınıfını kullanarak dosyayı sıkıştırmalıyız. Bu, hem depolama maliyetini düşürür hem de transfer hızını artırır.


public function compressBackup($path, $filename)
{
    $zip = new \ZipArchive();
    $zipPath = $path . '.zip';

    if ($zip->open($zipPath, \ZipArchive::CREATE) === TRUE) {
        $zip->addFile($path, $filename);
        $zip->close();
    }
    
    // Orijinal .sql dosyasını sil
    unlink($path);
    return $zipPath;
}

Yukarıdaki metot, oluşturulan SQL dosyasını bir ZIP arşivi haline getirir ve yer kaplamaması için orijinal dosyayı sistemden kaldırır. Bu işlem, sunucu disk alanını verimli kullanmanızı sağlar.

Adım 3: Uzak Depolama Birimine Aktarım

Yedekleri sadece yerel sunucuda tutmak risklidir. Laravel'in Storage facade'ini kullanarak bu dosyaları AWS S3, Google Cloud Storage veya başka bir uzak sunucuya aktarabiliriz.


use Illuminate\Support\Facades\Storage;

public function uploadToCloud($filePath)
{
    $fileContents = file_get_contents($filePath);
    Storage::disk('s3')->put('backups/' . basename($filePath), $fileContents);
}

Bu kod bloğu, sıkıştırılmış yedek dosyasını S3 bulut depolama alanına yükler. config/filesystems.php dosyasında S3 yapılandırmanızın doğru olduğundan emin olun.

Yedekleme Yöntemlerinin Karşılaştırılması

Yöntem Avantaj Dezavantaj
Yerel Yedekleme Hızlı ve kolay Sunucu çökmesinde veri kaybı riski
Bulut (S3) Yedekleme Güvenli ve felaket kurtarma uyumlu İnternet hızı ve maliyet
Dış Servisler (Spatie vb.) Kurulum gerektirmez, kapsamlı Üçüncü taraf bağımlılığı

Adım 4: Yedekleme Sürecini Otomatikleştirme

Yedekleme işleminin manuel değil, belirli aralıklarla otomatik yapılması gerekir. Laravel'in app/Console/Kernel.php (veya yeni sürümlerde routes/console.php) dosyasında zamanlanmış görevleri (scheduler) tanımlayabilirsiniz.


use Illuminate\Support\Facades\Schedule;

Schedule::command('db:backup')->dailyAt('03:00');

Bu kod, her gece saat 03:00'te veritabanı yedekleme komutunun çalışmasını sağlar. Sunucunuzda * * * * * cd /proje-yolu && php artisan schedule:run >> /dev/null 2>&1 cron işinin tanımlı olduğundan emin olun.

Adım 5: Güvenlik Uyarıları ve Kritik Önlemler

Güvenlik Uyarısı: Veritabanı yedekleri, projenizin tüm hassas verilerini (kullanıcı bilgileri, şifre hash'leri vb.) içerir. Bu dosyaları asla halka açık (public) dizinlerde saklamayın. Dosya izinlerini 600 (sadece sahibi okuyup yazabilir) olarak ayarlayın.

Ayrıca, yedekleme dosyalarını şifrelemek (Encryption) profesyonel bir yaklaşımdır. PHP'nin openssl_encrypt fonksiyonunu kullanarak yedek dosyasını şifreleyebilir ve sadece sizin sahip olduğunuz bir anahtar ile açılmasını sağlayabilirsiniz.

Sıkça Sorulan Sorular

Yedekleme işlemi sırasında veritabanı kilitlenir mi?

mysqldump komutu varsayılan olarak --lock-tables seçeneğini kullanır. Büyük veritabanlarında kesinti yaşamamak için --single-transaction parametresini ekleyerek veritabanının kilitlenmesini önleyebilirsiniz.

Eski yedekleri nasıl otomatik silerim?

Laravel Storage facade'i ile Storage::disk('local')->delete('backups/' . $oldFile) komutunu kullanarak belirli bir günden eski dosyaları temizleyen bir temizlik komutu yazabilirsiniz.

Yedeğin başarılı olduğunu nasıl anlarım?

Komutunuzun içine bir try-catch bloğu ekleyerek, işlem başarısız olduğunda Slack veya e-posta üzerinden bildirim gönderen bir Notification servisi entegre etmeniz önerilir.

Yedekleme için neden harici kütüphane kullanmıyoruz?

Harici kütüphaneler (örneğin Spatie Backup) çok güçlüdür ancak temel mantığı anlamak, projenizin özel gereksinimlerine göre (örneğin sadece belirli tabloları yedeklemek) özelleştirme yapmanıza olanak tanır.

Veritabanı yedeği geri yükleme nasıl yapılır?

Geri yükleme işlemi için mysql -u kullanıcı -p veritabanı < yedek.sql komutu kullanılır. Otomatik bir geri yükleme sistemi kurarken, mevcut veritabanını temizlemek için DB::statement('SET FOREIGN_KEY_CHECKS=0;') komutunu kullanmanız gerekebilir.

Yedekleme Stratejilerinde Performans Optimizasyonu

Büyük ölçekli veritabanlarında yedekleme süreci, sunucu kaynaklarını yoğun bir şekilde kullanabilir. Özellikle mysqldump işlemi sırasında veritabanı tablolarının kilitlenmesi veya CPU kullanımının tavan yapması, canlı sistemlerde performans düşüklüğüne neden olur. Bu durumu minimize etmek için aşağıdaki stratejileri uygulayabilirsiniz.

Düşük Öncelikli Yedekleme İşlemleri

Linux tabanlı sunucularda nice ve ionice komutlarını kullanarak yedekleme işleminin sistem kaynakları üzerindeki baskısını azaltabilirsiniz. Bu komutlar, yedekleme sürecinin işletim sistemi tarafından "düşük öncelikli" olarak işaretlenmesini sağlar.

// Artisan komutunuz içerisinde process'i şu şekilde çalıştırabilirsiniz:
use Symfony\Component\Process\Process;

$process = new Process([
    'nice', '-n', '19', 
    'ionice', '-c', '3', 
    'mysqldump', '-u', 'user', '-psecret', 'database_name'
]);
$process->run();

Burada nice -n 19 değeri, işlemin CPU üzerinde en düşük önceliğe sahip olmasını sağlar. ionice -c 3 ise diske erişim sırasında işlemin sadece sistem boştayken I/O yapmasına izin verir.

Yedekleme Süreçlerinde Hata Ayıklama ve Loglama

Otomatik yedekleme sistemlerinde en büyük sorun, sürecin sessizce başarısız olmasıdır. Yedekleme komutunuzun her aşamasını Laravel'in Log sınıfı ile izlemek, olası bir felaket anında sorunun kaynağını hızlıca bulmanızı sağlar.

Başarısızlık Durumunda Bildirim Mekanizması

Yedekleme komutunuzun içine bir try-catch bloğu ekleyerek, hata durumunda Slack, Telegram veya e-posta üzerinden anlık bildirim alabilirsiniz. Aşağıdaki örnek, Laravel'in Notification sistemini kullanarak bir hata yönetimi kurgusunu göstermektedir.

public function handle()
{
    try {
        // Yedekleme mantığı burada çalışır...
        $this->performBackup();
    } catch (\Exception $e) {
        Log::error('Yedekleme başarısız: ' . $e->getMessage());
        
        // Hata bildirimini tetikle
        Notification::route('mail', 'admin@example.com')
            ->notify(new BackupFailedNotification($e->getMessage()));
            
        return 1; // Hata kodu döndür
    }
}

Yedek Dosyası Bütünlük Testi

Yedeğin alınmış olması, yedeğin "çalışabilir" olduğu anlamına gelmez. Belirli aralıklarla (örneğin ayda bir) yedek dosyasının boyutunu kontrol edin ve boş (0 byte) olup olmadığını doğrulayın. Ayrıca, gzip -t backup.sql.gz komutunu kullanarak sıkıştırılmış dosyanın bozulup bozulmadığını sistem üzerinden otomatik olarak denetleyebilirsiniz.

Kontrol Yöntemi Amaç Kritiklik
Dosya Boyutu Kontrolü Boş yedekleri tespit etmek Yüksek
Gzip Testi Arşivin bozulmadığını doğrulamak Orta
Restore Simülasyonu Veri tutarlılığını test etmek Çok Yüksek

Sonuç

Laravel ile dinamik bir veritabanı yedekleme ve sıkıştırma sistemi kurmak, projenizin sürdürülebilirliği için attığınız en önemli adımlardan biridir. Bu rehberde, bir Artisan komutu ile başlayıp, dosyayı sıkıştırarak buluta aktaran ve bunu zamanlanmış bir görevle otomatize eden bir yapı kurduk. Bir sonraki adım olarak, bu yedekleme sistemine "Geri Yükleme" (Restore) özelliğini ekleyerek felaket kurtarma senaryolarınızı tamamlayabilirsiniz.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim (production) ortamında kullanmadan önce yedekleme dosyalarınızın bütünlüğünü test edin ve veritabanı kimlik bilgilerinizin güvenliğinden emin olun. Yanlış yapılandırılmış yedekleme sistemleri veri kaybına yol açabilir.

Bu yazıya tepkinizi paylaşın:
Emre Çelik

Eğitici içerik tasarımı ve yapılandırılmış metin oluşturma konusunda deneyimliyim. Kullanıcıların doğrudan sonuca ulaşmasını sağlayan net ve yalın bir anlatım tarzım var.

Yorumlar (0)

Yorum Yaz