Sunucu Yönetimi & Linux

    SQLite Nedir ve Nasıl Kullanılır

    Sunucu gerektirmeyen dosya tabanlı SQLite veritabanının kullanımını ve hangi projelere uygun olduğunu anlatan rehber.

    12 dk okuma Güncellendi: 10 Temmuz 2026

    Bir veritabanı deyince çoğu kişinin aklına ayrı bir sunucu süreci, bağlantı portları, kullanıcı yetkileri ve düzenli bakım gelir. Oysa dünyanın en yaygın kullanılan veritabanı motoru olan SQLite bunların hiçbirini gerektirmez. Telefonunuzdaki uygulamalardan tarayıcınıza, uçaklardaki uçuş sistemlerinden akıllı televizyonlara kadar milyarlarca cihazda sessizce çalışan SQLite, tek bir dosyanın içinde tam teşekküllü bir SQL veritabanı barındırır. Ne bir servisi başlatmanız ne de bir porta bağlanmanız gerekir; uygulamanız dosyayı açar ve doğrudan sorgu çalıştırır.

    Bu rehberde SQLite'ın sunucusuz mimarisini, tek dosya mantığının nasıl işlediğini, sqlite3 komut satırıyla tablo oluşturup sorgulamayı, hangi projelerde parladığını ve hangi durumlarda yetersiz kaldığını adım adım ele alacağız. Ayrıca MySQL ve PostgreSQL gibi istemci-sunucu mimarisine sahip motorlarla arasındaki farkları netleştirerek, yeni bir proje başlatırken doğru kararı verebilmeniz için ihtiyaç duyduğunuz zemini kuracağız. Amacımız, SQLite'ı "oyuncak veritabanı" olarak gören yaygın yanılgıyı düzeltip onu doğru yerde profesyonelce kullanmanızı sağlamak.

    SQLite Nedir ve Neden Sunucusuzdur#

    SQLite, 2000 yılında Richard Hipp tarafından yazılmış, C diliyle geliştirilmiş, kamuya açık (public domain) bir gömülü veritabanı motorudur. "Gömülü" (embedded) olması, ayrı bir program olarak çalışmak yerine doğrudan kullandığınız uygulamanın içine bir kütüphane olarak dahil edilmesi anlamına gelir. Yani MySQL'de olduğu gibi arka planda dinleyen bir mysqld süreci yoktur; SQLite, uygulamanızın kendi belleği ve işlem alanı içinde çalışır.

    Bu "sunucusuz" (serverless) yaklaşımın pratikteki karşılığı şudur: bir SQLite veritabanı, aslında disk üzerinde duran tek bir dosyadır. Uygulamanız bu dosyayı açtığında SQLite kütüphanesi devreye girer, SQL komutlarınızı çözümler ve sonuçları geri döndürür. Kurulum, yapılandırma, ağ ayarı, kullanıcı yönetimi gibi adımların hiçbiri yoktur. Bir metin dosyasını açıp kaydetmek ne kadar basitse, bir SQLite veritabanını taşımak, kopyalamak veya yedeklemek de o kadar basittir.

    SQLite'ın yaygınlığının temel nedeni de budur. Standart SQL desteği, ACID uyumlu işlemler (transaction) ve son derece küçük ayak izi bir aradadır. Derlenmiş kütüphane bir megabaytın altındadır ve neredeyse her işletim sistemi, programlama dili ve platformla uyumludur. Python, PHP, Node.js, Go gibi popüler dillerin çoğu SQLite desteğini ya çekirdek kütüphanesinde ya da standart bir paketle sunar.

    Dosya Tabanlı Mimari Nasıl Çalışır#

    SQLite'ın kalbi, tüm verilerin tek bir dosyada saklanmasıdır. Tablolar, indeksler, tetikleyiciler (trigger), görünümler (view) ve verilerin tamamı bu tek dosyanın içinde sayfalar (page) halinde organize edilir. Varsayılan sayfa boyutu 4096 bayttır ve dosya, B-tree veri yapısıyla düzenlenerek hızlı arama ve sıralama sağlar. Bu sayede yüz milyonlarca satırlık bir veritabanı bile tek bir .db dosyasında rahatça yaşayabilir.

    Eşzamanlılık yönetimi için SQLite, dosya kilitleri kullanır. Varsayılan modda (rollback journal) bir yazma işlemi olurken tüm veritabanı dosyası kilitlenir; bu, aynı anda tek bir yazıcıya izin verir ancak okuma işlemleri de bu sırada beklemek zorunda kalabilir. Bu davranışı iyileştirmek için modern kullanımda WAL (Write-Ahead Logging) modu önerilir. WAL modunda yazma işlemleri ayrı bir günlük dosyasına yazılır ve okuyucular yazma sürerken bloke olmadan çalışmaya devam edebilir.

    WAL modunu açmak tek bir komutla mümkündür ve genellikle bir veritabanı için ömür boyu geçerli olacak şekilde kalıcıdır:

    PRAGMA journal_mode = WAL;
    PRAGMA synchronous = NORMAL;
    

    Bu ayarlarla birlikte SQLite dizininde ana .db dosyasının yanında -wal ve -shm uzantılı iki yardımcı dosya görürsünüz. Bu üçü bir bütündür; veritabanını yedeklerken veya taşırken üçünü de aynı anda değerlendirmeniz gerekir. Yine de en temiz yöntem, aşağıda göreceğimiz .backup komutunu kullanmaktır çünkü o, dosyaları tutarlı bir anlık görüntü olarak birleştirir.

    sqlite3 Komut Satırı ile Başlangıç#

    SQLite ile çalışmanın en pratik yolu, birlikte gelen sqlite3 komut satırı aracıdır. Çoğu Linux dağıtımında paket yöneticisiyle kolayca kurulur:

    # Debian / Ubuntu
    sudo apt update && sudo apt install -y sqlite3
    
    # RHEL / AlmaLinux / Rocky
    sudo dnf install -y sqlite
    
    # Sürümü doğrulama
    sqlite3 --version
    

    Bir veritabanı oluşturmak için dosya adını vererek aracı başlatmanız yeterlidir. Dosya yoksa ilk yazma işleminde otomatik oluşturulur:

    sqlite3 magaza.db
    

    Artık interaktif bir kabuktasınız. Standart SQL komutlarıyla tablo oluşturup veri ekleyebilirsiniz. Aşağıda basit bir ürün ve sipariş şeması kuruyoruz:

    CREATE TABLE urunler (
        id       INTEGER PRIMARY KEY AUTOINCREMENT,
        ad       TEXT NOT NULL,
        fiyat    REAL NOT NULL DEFAULT 0,
        stok     INTEGER NOT NULL DEFAULT 0,
        olusturuldu TEXT DEFAULT (datetime('now'))
    );
    
    INSERT INTO urunler (ad, fiyat, stok) VALUES
        ('Kahve 250g', 89.90, 120),
        ('Çay 500g',   64.50, 80),
        ('Bal 850g',  199.00, 30);
    
    SELECT ad, fiyat, stok FROM urunler WHERE stok < 100 ORDER BY fiyat DESC;
    

    sqlite3 kabuğunun asıl gücü, nokta ile başlayan yönetim komutlarındadır. Bunlar SQL değil, aracın kendi komutlarıdır. En sık kullandıklarınız şunlardır:

    .tables            # Veritabanındaki tabloları listeler
    .schema urunler    # Bir tablonun oluşturma SQL'ini gösterir
    .mode column       # Sonuçları hizalı sütunlar halinde gösterir
    .headers on        # Sonuçlarda sütun başlıklarını gösterir
    .import veri.csv urunler   # CSV dosyasını tabloya aktarır
    .output rapor.txt  # Çıktıyı bir dosyaya yönlendirir
    .quit              # Kabuktan çıkar
    

    Örneğin okunabilir bir çıktı almak için genellikle önce görüntü modunu ayarlarsınız:

    sqlite3 magaza.db
    sqlite> .mode column
    sqlite> .headers on
    sqlite> SELECT * FROM urunler;
    

    Bir CSV dosyasını içe aktarmak da oldukça yaygın bir ihtiyaçtır. Diyelim elinizde stok.csv var; onu doğrudan tabloya alabilir, ardından tek satırda bir sorgu çalıştırıp kabuğa hiç girmeden sonucu görebilirsiniz:

    sqlite3 magaza.db ".import --csv stok.csv urunler"
    sqlite3 magaza.db "SELECT COUNT(*), SUM(stok) FROM urunler;"
    

    Bu tek satırlık kullanım biçimi, betiklerle (shell scripting) otomasyon kurarken paha biçilmezdir. SQLite'ı bir cron görevinden çağırıp rapor üretmek, günlük verileri toplamak veya küçük ölçekli ETL işleri yapmak son derece pratiktir.

    SQLite Ne Zaman İdeal Bir Seçimdir#

    SQLite, "her yerde çalışan ama hafif" felsefesiyle belirli senaryolarda rakipsizdir. Öncelikle küçük ve orta ölçekli web uygulamaları için mükemmel bir başlangıç noktasıdır. Günde on binlerce ziyaretçi alan, okuma ağırlıklı bir blog, dokümantasyon sitesi veya kurumsal tanıtım sitesi SQLite ile sorunsuz çalışır. Aslında SQLite'ın kendi belgelerine göre, sitenizin trafiği çoğu blogunkiyle benzerse SQLite fazlasıyla yeterlidir.

    İkinci güçlü alan prototipleme ve geliştirme ortamlarıdır. Yeni bir fikri hayata geçirirken MySQL veya PostgreSQL kurup yapılandırmakla uğraşmak yerine tek bir dosyayla başlayıp veri modelinizi hızlıca test edebilirsiniz. Proje büyüdüğünde daha güçlü bir motora geçiş yapmak, standart SQL kullandığınız sürece zor değildir. Bu yüzden birçok geliştirici yerel ortamda SQLite ile başlar.

    Üçüncü ve belki en yaygın alan gömülü sistemler ve masaüstü/mobil uygulamalardır. Bir masaüstü uygulamasının ayarlarını, bir mobil uygulamanın çevrimdışı verilerini ya da bir IoT cihazının ölçüm kayıtlarını saklamak için ideal seçenektir. Ağ bağlantısı, kurulum veya bakım gerektirmemesi, son kullanıcının cihazında kusursuz çalışmasını sağlar. Ayrıca dosya formatı platformlar arası taşınabilir olduğundan aynı .db dosyasını Windows, Linux ve macOS arasında değiştirmeden kullanabilirsiniz.

    Kısaca SQLite'ın parladığı durumlar şunlardır:

    • Tek sunucuda çalışan, okuma ağırlıklı web uygulamaları ve API'ler
    • Prototipler, demo projeler ve geliştirme/test ortamları
    • Masaüstü, mobil ve gömülü uygulamaların yerel verisi
    • Yapılandırma dosyalarının yerine geçen uygulama içi veri saklama
    • Küçük ölçekli analiz, raporlama ve betikle otomasyon işleri

    SQLite Ne Zaman Yetersiz Kalır#

    SQLite ne kadar güçlü olsa da her problem için doğru araç değildir. En temel sınırı yüksek eşzamanlı yazma yüküdür. SQLite bir seferde yalnızca tek bir yazma işlemine izin verir; WAL modu okuma-yazma çakışmasını büyük ölçüde azaltsa da eşzamanlı iki yazıcı hâlâ sıraya girmek zorundadır. Saniyede yüzlerce hatta binlerce yeni kayıt yazan bir sipariş sistemi, yoğun bir mesajlaşma platformu ya da çok kullanıcılı bir SaaS ürünü söz konusuysa yazma darboğazına takılırsınız. Bu tür yükler için istemci-sunucu mimarisine sahip MySQL veya PostgreSQL çok daha uygundur.

    İkinci sınır ağ üzerinden erişim ve ölçeklendirmedir. SQLite bir dosyadır ve o dosyanın bulunduğu makinede yaşar. Birden fazla uygulama sunucusunun aynı veritabanına ağ üzerinden bağlanması, yük dengeleme arkasında birden çok kopya çalıştırmak veya veritabanını ayrı bir makineye taşımak SQLite'ın tasarım felsefesine terstir. Ağ dosya sistemleri (NFS gibi) üzerinden paylaşım, kilitleme sorunları yüzünden veri bozulmasına yol açabilir ve kesinlikle önerilmez. Yatay ölçeklendirme gerektiren mimarilerde SQLite'ı zorlamak yerine baştan sunucu tabanlı bir motor seçmek doğrudur.

    Üçüncü olarak, ayrıntılı erişim denetimi, kullanıcı rolleri ve sunucu tarafı yetkilendirme ihtiyacınız varsa SQLite bunları sunmaz. Güvenlik, veritabanı dosyasının işletim sistemi düzeyindeki dosya izinlerine bağlıdır; tabloya özel yetki, satır düzeyi güvenlik veya ayrı veritabanı kullanıcıları kavramı yoktur. Bu tür kurumsal gereksinimler için PostgreSQL çok daha zengin bir yetki modeli sağlar. Uygulamanız gerçekten çok kullanıcılı ve yazma yoğunsa, MySQL yönetimi konusundaki MySQL veritabanı yönetimi rehberimize göz atarak sağlam bir başlangıç yapabilirsiniz.

    SQLite MySQL ve PostgreSQL Karşılaştırması#

    Bu üç motor da SQL konuşur ama mimari felsefeleri temelden farklıdır. SQLite gömülü ve sunucusuzdur; MySQL ile PostgreSQL ise istemci-sunucu modelinde çalışan, ağ üzerinden erişilen tam ölçekli veritabanı sunucularıdır. Aşağıdaki tablo temel farkları özetliyor:

    ÖzellikSQLiteMySQLPostgreSQL
    MimariGömülü, sunucusuzİstemci-sunucuİstemci-sunucu
    KurulumYok, tek dosyaSunucu kurulumu gerekirSunucu kurulumu gerekir
    Eşzamanlı yazmaTek yazıcı (kilitli)Yüksek, satır kilidiYüksek, MVCC
    Ağ erişimiHayırEvetEvet
    Kullanıcı/rol yönetimiYokVarGelişmiş
    Yatay ölçeklendirmeUygun değilReplikasyon/shardingReplikasyon
    Tipik kullanımUygulama içi, prototipWeb uygulamalarıKarmaşık, kurumsal
    Ayak iziÇok küçük (<1 MB)OrtaOrta-büyük

    Pratik karar şu şekilde özetlenebilir: eğer veritabanınıza tek bir uygulama erişecekse, yazma yoğunluğunuz düşükse ve basitlik istiyorsanız SQLite mükemmeldir. Eğer birden çok sunucu, yüksek eşzamanlı yazma, kullanıcı yönetimi ve ölçeklenebilirlik gerekiyorsa MySQL ya da PostgreSQL tercih edin. Birçok başarılı proje SQLite ile başlar, gerçek bir ölçeklenme ihtiyacı doğduğunda daha büyük bir motora geçer; bu geçiş, standart SQL yazdığınız sürece sanıldığından çok daha kolaydır.

    Hangi motoru seçerseniz seçin, uygulamanızın çalıştığı ortam da en az veritabanı kadar önemlidir. WordPress gibi hazır uygulamalar için genellikle MySQL/MariaDB gereklidir ve bunlar bizim WordPress hosting ve web hosting paketlerimizde hazır gelir. Kendi sunucunuzda tam kontrol istiyorsanız VDS sunucu çözümlerimiz PostgreSQL veya yüksek trafikli SQLite dağıtımları için esneklik sunar.

    Performans, Güvenlik ve Yedekleme İpuçları#

    SQLite küçük görünse de doğru yapılandırıldığında şaşırtıcı performans verir. İlk yapılacak iş, yukarıda değindiğimiz WAL modunu açmaktır; bu, okuma-yazma çakışmalarını dramatik biçimde azaltır. İkincisi, sık sorguladığınız sütunlara indeks eklemektir. İndekssiz bir tabloda arama, satır sayısı arttıkça yavaşlar:

    CREATE INDEX idx_urunler_ad ON urunler(ad);
    CREATE INDEX idx_urunler_stok ON urunler(stok);
    
    -- Sorgunun indeks kullanıp kullanmadığını görmek için
    EXPLAIN QUERY PLAN SELECT * FROM urunler WHERE ad = 'Bal 850g';
    

    Toplu veri eklerken her INSERT'i ayrı ayrı çalıştırmak yerine bir işlem (transaction) içine almak performansı yüzlerce kat artırabilir. SQLite her bağımsız yazmada diske senkronize olmaya çalışır; işlem kullandığınızda tüm ekleme tek seferde diske yazılır:

    BEGIN TRANSACTION;
    INSERT INTO urunler (ad, fiyat, stok) VALUES ('Ürün A', 10, 5);
    INSERT INTO urunler (ad, fiyat, stok) VALUES ('Ürün B', 20, 8);
    -- binlerce satır...
    COMMIT;
    

    Güvenlik tarafında SQLite'ın erişim denetimi tamamen dosya izinlerine dayanır, bu yüzden veritabanı dosyasını yalnızca uygulama kullanıcısının okuyup yazabildiği bir konumda tutun. Dosyayı web kök dizininin (public_html) dışına yerleştirmek kritik önemdedir; aksi halde tarayıcıdan indirilme riski oluşur. Uygulama içinde ise SQL enjeksiyonuna karşı her zaman parametreli sorgular (prepared statements) kullanın. PHP tarafında PDO ile SQLite kullanıyorsanız, doğru PHP sürümü ve eklentileri için PHP sürüm yönetimi rehberimizden faydalanabilirsiniz.

    Yedekleme, SQLite'ın en keyifli yanlarından biridir çünkü veritabanı tek dosyadır. Yine de aktif olarak yazılan bir veritabanını doğrudan cp ile kopyalamak bozuk yedek üretebilir; bunun yerine tutarlı bir anlık görüntü alan yerleşik komutları kullanın:

    # Canlı veritabanından tutarlı yedek almanın doğru yolu
    sqlite3 magaza.db ".backup '/yedek/magaza-$(date +%F).db'"
    
    # Metin tabanlı (SQL) döküm — sürüm bağımsız arşiv
    sqlite3 magaza.db .dump > magaza-yedek.sql
    
    # Bütünlük kontrolü
    sqlite3 magaza.db "PRAGMA integrity_check;"
    

    Bu yedekleri düzenli bir dış konuma kopyalamak, veri kaybına karşı en sağlam korumadır. Otomatik ve dış merkezli yedekleme için yedekleme çözümlerimizi inceleyebilir, sunucunuzu bakım ve güvenlik yükünden kurtarmak için sunucu yönetimi hizmetimize göz atabilirsiniz. Zamanla veritabanınız büyüdükçe VACUUM; komutuyla dosyayı sıkıştırıp silinen kayıtların bıraktığı boşluğu geri kazanabilirsiniz.

    Sıkça Sorulan Sorular#

    SQLite üretim ortamında kullanılabilir mi?#

    Evet, SQLite kesinlikle üretim ortamı için uygundur ve dünya çapında milyarlarca cihazda üretimde çalışmaktadır. Doğru senaryoda, yani okuma ağırlıklı ve tek sunucuda çalışan uygulamalarda son derece güvenilirdir. Yüksek eşzamanlı yazma ihtiyacı olan çok kullanıcılı sistemlerde ise MySQL ya da PostgreSQL gibi sunucu tabanlı bir motoru tercih etmek daha doğru olur. Yani mesele "üretime uygun mu" değil, "sizin iş yükünüze uygun mu" sorusudur.

    SQLite ile MySQL arasındaki en temel fark nedir?#

    En temel fark mimaridir. SQLite gömülü ve sunucusuzdur; veritabanı tek bir dosyadır ve uygulamanızın içinde çalışır, ayrı bir servis gerektirmez. MySQL ise istemci-sunucu modelinde çalışan, arka planda sürekli çalışan bir sunucu süreci olan ve ağ üzerinden birden fazla istemciye hizmet veren bir sistemdir. Bu fark, kurulum, ölçeklendirme, kullanıcı yönetimi ve eşzamanlı yazma kapasitesi gibi her şeyi belirler.

    SQLite veritabanı ne kadar büyüyebilir?#

    Teorik olarak bir SQLite veritabanı dosyası 281 terabayta kadar büyüyebilir, dolayısıyla boyut çoğu proje için asla gerçek bir sınır olmaz. Pratikte performansı belirleyen şey dosya boyutundan çok eşzamanlı erişim deseni ve indekslemedir. Onlarca gigabaytlık veritabanları, doğru indekslerle SQLite'ta gayet hızlı çalışır. Sorun genellikle boyut değil, aynı anda kaç yazma işleminin gerçekleştiğidir.

    SQLite dosyamı nasıl güvenli şekilde yedeklerim?#

    Aktif kullanılan bir veritabanını doğrudan kopyalamak yerine yerleşik .backup komutunu kullanmalısınız çünkü bu, yazma işlemleri sürerken bile tutarlı bir anlık görüntü üretir. sqlite3 veritabani.db ".backup yedek.db" komutu bunun için idealdir. Alternatif olarak .dump ile SQL metni formatında sürüm bağımsız bir arşiv de alabilirsiniz. Aldığınız yedekleri mutlaka sunucu dışında bir konumda saklayın ki donanım arızasında veriniz güvende kalsın.

    Paylaşımlı hosting üzerinde SQLite çalıştırabilir miyim?#

    Evet, çoğu paylaşımlı hosting ortamı SQLite'ı destekler çünkü ayrı bir veritabanı sunucusu ya da özel yetki gerektirmez; yalnızca yazılabilir bir dizin yeterlidir. PHP tabanlı uygulamalarda PDO SQLite eklentisi genellikle hazır gelir. Tek dikkat etmeniz gereken, veritabanı dosyasını web kök dizininin dışına yerleştirmek ve dosya izinlerini doğru ayarlamaktır. Bu sayede küçük projelerinizi ek maliyet olmadan çalıştırabilirsiniz.

    SQLite'tan MySQL veya PostgreSQL'e geçiş zor mu?#

    Standart SQL kullandığınız sürece geçiş sanıldığından çok daha kolaydır. Genellikle şemanızı hedef motorun söz dizimine küçük düzenlemelerle uyarlar, ardından verilerinizi bir SQL dökümü veya bir taşıma aracı yardımıyla aktarırsınız. Tarih fonksiyonları, otomatik artan anahtarların tanımı ve bazı veri tipleri gibi motora özgü ayrıntılar farklılık gösterebilir. Projeye SQLite ile başlayıp ihtiyaç doğduğunda büyümek, birçok geliştirmenin izlediği son derece sağlıklı bir yoldur.

    Kapanış#

    SQLite, "basit olan güçlü olamaz" önyargısını yıkan nadir araçlardan biridir. Tek dosyalık mimarisi, sıfır kurulum ihtiyacı ve platform bağımsızlığıyla küçük projelerden gömülü sistemlere, prototiplerden okuma ağırlıklı web uygulamalarına kadar geniş bir alanda ilk tercih olmayı hak eder. Sınırlarını, yani yüksek eşzamanlı yazma ve ağ üzerinden çok sunuculu erişim gibi durumları bildiğiniz sürece, SQLite size sadelik ve güvenilirliği bir arada sunar. Doğru araç, en güçlü araç değil; işinize en uygun olandır.

    Projeniz büyüdüğünde ve sunucu tabanlı bir veritabanına ya da tam kontrol sağlayan bir altyapıya ihtiyaç duyduğunuzda Clou.TR yanınızda. Yüksek performanslı web hosting ve WordPress hosting paketlerimizle küçük uygulamalarınızı, esnek sanal sunucu ve VDS sunucu çözümlerimizle büyüyen projelerinizi güvenle barındırabilirsiniz. Kurulum ve bakımla uğraşmadan işinize odaklanmak isterseniz sunucu yönetimi ve yedekleme hizmetlerimiz veri güvenliğinizi üstlenir. Hangi ölçekte olursanız olun, doğru veritabanı ve doğru barındırma kararını birlikte verelim.

    SQLiteVeritabanıLinux

    Uygulamaya geçmeye hazır mısınız?

    NVMe SSD, ücretsiz SSL ve %99.9 uptime garantisiyle Clou.TR hosting ve sunucu çözümleriyle projenizi hayata geçirin.