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/flysystempaketinin 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.


Yorumlar (0)
Yorum Yaz