Bloğa Geri Dön

Laravel ile Sqlite Backup Alma ve Otomatikleştirme İşlemleri.

Laravel

20 Eyl, 2025, 08:20 Cumartesi

Ortalama okuma süresi 4 dakika

Laravel projelerinde SQLite veritabanınızı otomatik yedeklemek için Artisan komutu, günlük zamanlama ve opsiyonel bildirim entegrasyonu ile pratik bir çözüm örneği.

Laravel ile Sqlite Backup Alma ve Otomatikleştirme İşlemleri.
Laravel ile Sqlite Backup Alma ve Otomatikleştirme İşlemleri.

Laravel ile SQLite Database Backup Alma

Laravel'in default olarak SQLite database ile gelmesi ve Aaron Francis’in High Performance SQLite eğitimleri ile YouTube videolarından sonra, SQLite'a bir şans verdim ve projelerime başlarken SQLite kullanmaya alıştım.

Ufak bir not: SQLite yabana atılacak bir veritabanı değil. Gerçekten büyük production sistemlerinde aktif rol oynuyor ve oldukça performanslı çalışıyor. Buna örnek olarak, Nuno Maduro tarafından geliştirilen ve daha sonra açık kaynak olarak yayınlanan Pinkary projesi gösterilebilir. Pinkary, Twitter benzeri bir sosyal medya platformu ve tamamen SQLite üzerinde çalışıyor. İlgili kaynak: Pinkary GitHub Repository Hatta bu proje, yazının ilerleyen kısmında anlatacağım backup sistemine benzer bir yapı da içeriyor: PerformDatabaseBackupCommand.php

Özellikle ufak ve yan projelerimde SQLite tercih ediyorum. Doğal olarak bazı backup yöntemlerini araştırmam gerekti. SQLite dosya tabanlı bir veritabanı olduğu için teoride sadece dosyayı kopyalamak yeterli olur.

Fakat transaction anlarında data bozulması ihtimali beni endişelendiriyordu. Araştırmalarımda, bu durumun kullanılan database modlarına göre farklılık gösterebildiğini fark ettim. Asıl mesele ise veritabanı büyüdükçe kopyalama sürelerinin artmasıydı.

Derken SQLite’ın backup için kullanılan küçük ama etkili bir komutunu keşfettim 👇

VACUUM INTO 'dizin/sql_yedek.sqlite';

Bu kadar basit bir senaryoyla data bozulmadan backup alınabiliyor. Detaylı bilgi için: SQLite Vacuum.

Yukarıdaki notuma istinaden: Buradaki kaygılarım, aslında Pinkary örneğinde görüldüğü gibi, dosya bazlı yedekleme ile de gayet başarılı şekilde aşılabiliyormuş. Dolayısıyla benim ufak/yan projelerde SQLite kullanma sebebim “yetersizlik” değil, daha çok alışma–tanışma–kaynaşma süreci.

O halde bu komutu Laravel ile birleştirip, üzerine bir zamanlayıcı eklersek (Laravel’de bu gerçekten çok kolay), problemsiz bir backup sistemi kurabiliriz. Şimdi adım adım bakalım 👇


1. Artisan Command Oluşturma

Öncelikle bir artisan command oluşturalım:

php artisan make:command DbBackupCommand

👉 Laravel Docs: Generating Commands

Bu komut ile App\Console\Commands klasörü içinde DbBackupCommand.php dosyamız oluşacak. Dosya içindeki handle() metodunu şu şekilde güncelliyoruz:

public function handle(): void
{
    $backupPath = Storage::disk("db_backup")
        ->path('database_' . now()->timezone('Europe/Istanbul')->format('Y-m-d_H-i-s') . ".sqlite");

    DB::connection()->getPdo()->exec("VACUUM INTO '$backupPath'");

    $this->info("Backup oluşturuldu: $backupPath");
}

2. Filesystem Disk Tanımlama

config/filesystems.php dosyasına yeni bir disk ekliyoruz:

'db_backup' => [
    'driver' => 'local',
    'root' => storage_path('app/private/backups/database'),
    'visibility' => 'private',
    'throw' => false,
    'report' => false,
],

Burada önemli olan kısım root ayarı. Backup’lar şu dizine kaydedilecek: projeniz/storage/app/private/backups/database

Artık terminalde şu komutu çalıştırabilirsiniz:

php artisan db:backup

Sonuç: Ayarladığınız dizine otomatik backup alınmış olacak. ✅


3. Backup’ı Otomatik Hale Getirme

routes/console.php dosyasına gidin ve şunu ekleyin:

Schedule::command('db:backup')->hourly();

Bu sayede her saat başında otomatik backup alınacak. Farklı zamanlamalar için Task Scheduling Docs sayfasına bakabilirsiniz.

Arka planda zamanlayıcıyı çalıştırmak için:

php artisan schedule:work

4. Eski Backup’ları Silme

Eğer bu şekilde bırakırsak günde 24 backup, haftada 168 backup oluşacak. Diskin dolmaması için eski backup’ları silmek gerekiyor.

DbBackupCommand.php dosyasında handle() metodunu şu şekilde güncelleyin:

public function handle(): void
{
    $backupPath = Storage::disk("db_backup")
        ->path('database_' . now()->timezone('Europe/Istanbul')->format('Y-m-d_H-i-s') . ".sqlite");

    DB::connection()->getPdo()->exec("VACUUM INTO '$backupPath'");

    $this->info("Backup created: $backupPath");

    // Eski backup'ları sil
    collect(Storage::disk("db_backup")->listContents(".", true))->each(
        function ($file) {
            if (
                $file["type"] === "file" &&
                $file["lastModified"] <
                now()->timezone('Europe/Istanbul')->subDay()->getTimestamp()
            ) {
                Storage::disk("db_backup")->delete($file["path"]);
                $this->warn("Deleted file: {$file['path']}");
            }
        }
    );
}

Burada Laravel’in collect() helper’ını kullandık. Tüm dosyaları listeliyor ve lastModified tarihine bakıyoruz. Eğer dosya 24 saatten eskiyse otomatik olarak siliyoruz.


5. Bildirim Gönderme (Opsiyonel)

Son olarak, backup alındığında kullanıcıya bildirim göndermek için routes/console.php dosyasında ufak bir ekleme yapabilirsiniz:

->onSuccess(function () {
    \App\Models\User::first()
        ->notify(new BackupSuccessNotification());
})

Ayrıca hata durumlarında farklı bildirimler de tanımlayabilirsiniz. 👉 Laravel Task Hooks


Sonuç

Artık elimizde:

  • Manuel çalıştırabileceğimiz backup komutu
  • Saatlik çalışan otomatik backup sistemi
  • Eski backup’ları temizleyen yapı
  • İsteğe bağlı bildirim sistemi

var. 🎉

Bu yapı sayesinde SQLite kullanan projelerinizde disk dostu, otomatik ve güvenli backup sistemi kurabilirsiniz.

Fullstack Web Developper & Laravel Dev & SysAdmin

Kategoriden Yazılar
Yazardan Yazılar
[Paket] - Laravel Eloquent Query Cache

Bu paket, kullanılan SQL sorgularını izleyip önbellekte anahtar olarak kullanabilme yeteneğine sahiptir. Bu sayede, sorguya özel önbellekleme oldukça kolay hale gelir ve ORM kullanımınızdan bağımsız çalışır.

Laravel Eloquent Query Cache
Laravel Projeleri Nasıl Yayınlanır? LaraSail ile DigitalOcean ve Ubuntu Deploy Rehberi

Laravel projenizi yayına almak için Nginx kurulumu, PHP sürüm ayarları veya SSL yapılandırmasıyla uğraşmak zorunda değilsiniz. LaraSail, tüm bu teknik süreçleri otomatikleştirerek deploy işlemini oldukça basit hale getirir.

LaraSail ile DigitalOcean ve Ubuntu Deploy Rehberi
SAP B1 Entegre Mesai ve İzin Takip Sistemi ile İnsan Kaynaklarında Dijital Dönüşüm

Kurumsal işletmeler için geliştirilen SAP entegre mesai ve izin takip sistemi, hem üretim hem idari alanlarda süreçleri dijitalleştiriyor. Anlık raporlama, mobil uyumlu kullanım, resmi belge ve imza yönetimi, gelişmiş filtreleme ve PKDS entegrasyonu ile insan kaynakları yönetimini hızlandırıyor ve şeffaflaştırıyor.

SAP B1 Entegre Mesai ve İzin Takip Sistemi ile İnsan Kaynaklarında Dijital Dönüşüm
Talaşlı İmalatta SAP ile Elmas Takibi: ERP Destekli Kesici Takım Yönetimi

Talaşlı imalat süreçlerinde kesici elmasların hangi personel, hangi departman ve hangi proje için ne kadar tüketildiğini anlık olarak izlemek artık mümkün. SAP Business One üzerine geliştirdiğimiz Elmas Analiz ekranı; stok optimizasyonu, maliyet kontrolü ve proje bazlı raporlama ihtiyaçlarını tek bir ekranda birleştirerek üretim sahasında şeffaflık ve hız sağlıyor.

SAP’de ISO 9001’e Uygun Onaylı Tedarikçi Skorlama ve Performans Yönetimi

SAP Business One üzerinde geliştirdiğimiz onaylı tedarikçi yönetim sistemi; kalite, teslimat, fiyat ve miktar kriterlerini ağırlıklı skor kartı ile izleyerek ISO 9001:2015’in 8.4 maddesine tam uyum sağlıyor. Bu yazıda tedarikçi performansını puanlayan ekranlar, raporlama araçları ve denetime hazır süreçlerin nasıl kurulduğunu detaylı olarak inceleyebilirsiniz.

SAP’de ISO 9001’e Uygun Onaylı Tedarikçi Skorlama ve Performans Yönetimi