Süper İndirim HaftasıClaude Skills — %20 İNDİRİM
Glossary

SQLite Dosyaları Açıklandı: Yapı, Kullanım Alanları ve Temel Sınırlar

Powerdrill Bloom·
SQLite Dosyaları Açıklandı: Yapı, Kullanım Alanları ve Temel Sınırlar

Bir SQLite dosyası; tabloları, indeksleri ve şemayı bir arada tutan, ilişkisel bir veritabanının tamamını barındıran tek bir disk dosyasıdır. SQLite'ın kendi dokümantasyonu bunu "ana veritabanı dosyası" olarak adlandırır ve "bir SQLite veritabanının tam durumunun genellikle" bu dosyada bulunduğunu belirtir. Bu cümledeki "genellikle" kelimesi oldukça kritik bir rol oynamaktadır.

Eğer size daha önce bir .db, .sqlite veya .sqlite3 dosyası verildiyse ve tüm verileri alıp almadığınızı merak ettiyseniz, bu formatı doğru bir şekilde anlamanız gerekir.

Bir SQLite dosyası aslında nedir

SQLite kendisini "kendi kendine yeten, sunucusuz, sıfır yapılandırmalı, işlemsel bir SQL veritabanı motoru uygulayan süreç içi bir kütüphane" olarak tanımlar. Aynı sayfada SQLite'ın "ayrı bir sunucu sürecine sahip olmadığı" belirtilir. Bir uygulama bu kütüphaneyi bağlar ve dosyayı okur.

Bundan iki sonuç çıkar. Birincisi, veritabanı tek bir bütün olarak taşınır; bu nedenle pek çok uygulama verilerini bu şekilde dağıtır. İkincisi, bu formatın son derece kararlı olması gerekir, çünkü bu dosyalar kendilerini yazan yazılımlardan daha uzun ömürlüdür. SQLite, "kararlı, kalıcı dosya formatını" öne çıkan özellikleri arasında listeler. Ayrıca kodun kamu malı olduğunu, "ticari veya özel her türlü amaçla kullanımının ücretsiz" olduğunu belirtir.

Bu ölçeği küçümsemek kolaydır. SQLite'ın kendi hakkımızda sayfası, "sayabileceğimizden daha fazla uygulamayla dünyada en yaygın olarak dağıtılan veritabanı" olduğunu belirtir.

Dosyanın içinde ne var

100 baytlık üstbilgi

İlk baytlar formatı tanımlar. Dosya, 0 ofsetinde 16 baytlık bir üstbilgi dizesi taşır: SQLite format 3\000. Araçlar, uzantısı ne olursa olsun dosyayı bu imza sayesinde tanır.

Bir sonraki alan göründüğünden daha önemlidir. 16 ofsetinde, "bayt cinsinden veritabanı sayfa boyutunu" tutan 2 baytlık bir tamsayı bulunur. Dokümantasyon, bunun "512 ile 32768 (dahil) arasında ikinin bir kuvveti veya 65536 sayfa boyutunu temsil eden 1 değeri olması gerektiğini" belirtir. Üstbilgideki tüm çoklu bayt alanları, en anlamlı bayt ilk sırada olacak şekilde saklanır.

18 ve 19 ofsetlerinde iki bayt daha bulunur: dosya formatı yazma sürümü ve okuma sürümü. Dokümantasyon, bu değerin "eski sistemler için 1; WAL için 2" olduğunu belirtir.

Satırlar değil, sayfalar

Üstbilginin altında dosya, sabit boyutlu sayfalardan oluşan bir yığındır. Spesifikasyon oldukça açıktır: "Ana veritabanı dosyası bir veya daha fazla sayfadan oluşur. Bir sayfanın boyutu, 512 ile 65536 (dahil) arasında ikinin bir kuvvetidir. Aynı veritabanı içindeki tüm sayfalar aynı boyuttadır."

Sayfalar 1'den başlayarak numaralandırılır ve maksimum sayfa sayısı 4.294.967.294'tür. Tablolar ve indeksler bu sayfaların içinde B-tree yapıları olarak yaşar; bir metin düzenleyicinin size çok az şey göstermesinin nedeni de budur.

Kimsenin bahsetmediği yardımcı dosyalar

İşte insanları şaşırtan kısım burasıdır. Dokümantasyon, tam durumun "genellikle" tek bir dosyada olduğunu söyler. Ardından istisnayı belirtir. Bir işlem (transaction) sırasında SQLite, "ek bilgileri 'rollback journal' adı verilen ikinci bir dosyada saklar." WAL modunda ise bu ikinci dosya bir write-ahead log dosyasıdır.

Dolayısıyla, uygulama tam yazma işleminin ortasındayken alınan bir kopyada, hala yardımcı dosyada bulunan ve işlenmiş (committed) veriler eksik olabilir. Bir iş arkadaşınız size sadece bir .db dosyası gönderdiyse ve sayılar biraz eski görünüyorsa, kontrol etmeniz gereken ilk şey budur.

Bir SQLite dosyası nasıl açılır

Bunun için üç yol vardır ve doğru olanı bundan sonra ne yapmayı planladığınıza bağlıdır.

Bir görüntüleyici ile okuyun. Masaüstü ve tarayıcı tabanlı SQLite görüntüleyicileri dosyayı açar, tabloları listeler ve satırlar arasında gezinmenizi sağlar. Bu, "burada ne var ki" sorusuna yanıt vermenin en hızlı yoludur ve genellikle ilk bakış için yeterlidir.

Komut satırı veya bir kütüphane ile sorgulayın. sqlite3 kabuğu ve Python, Node ve diğer birçok dildeki standart kütüphane bağlamaları bu formatı doğrudan okur. Şemayı zaten bildiğiniz ve belirli bir sayıya ulaşmak istediğiniz durumlarda bu yol tercih edilir.

Bir tabloyu dışa aktarın ve başka bir yerde analiz edin. Bir tabloyu CSV formatında dışa aktarın ve ekibinizin halihazırda kullandığı herhangi bir araca aktarın. Bunu yaptığınızda, formatın koruduğu tek şey olan tablolar arasındaki ilişkileri kaybedersiniz. Mümkün olduğunda ham tablolar yerine birleştirilmiş (joined) sonucu dışa aktarın.

Bir araç neden dosyanın bir veritabanı olmadığını söyleyebilir

Spesifikasyon bunu açıklamaktadır. Her geçerli dosya 16 baytlık bir üstbilgi dizesiyle başlar: SQLite format 3\000. Bir dosyayı açan ve 0 ofsetinde bu imzayı bulamayan bir okuyucuya bir SQLite veritabanı verilmemiş demektir.

Çoğu durumun arkasında üç yaygın neden yatar. Dosya eksik aktarılmıştır, bu nedenle üstbilgi oradadır ancak geri kalanı kesilmiştir. Dosya şifrelenmiştir veya bir uygulama tarafından sarmalanmıştır, bu yüzden ilk baytlar başka bir şeydir. Ya da uzantı yanıltıcıdır ve aslında aldığınız şey, yardımcı olmaya çalışan biri tarafından yeniden adlandırılmış düz bir dışa aktarma dosyasıdır.

Bir SQLite dosyası ne kadar büyüyebilir

Genellikle bu sorunun ima ettiğinden çok daha büyük. SQLite'ın limitler sayfası, bir veritabanı dosyasının maksimum boyutunun 4.294.967.294 sayfa olduğunu belirtir. Maksimum sayfa boyutu olan 65.536 baytta bu, yaklaşık 281 terabaytlık bir maksimum veritabanı boyutu anlamına gelir.

Sayfa bu rakam konusunda son derece dürüsttür. Geliştiricilerin "bu sınıra ulaşabilecek donanıma erişimi olmadığı için üst sınırın test edilmediğini" belirtmektedir.

Satır sayıları da aynı duvara toslar. Teorik maksimum sınır bir tabloda 2^64 satırdır. Dokümantasyon, "281 terabaytlık maksimum veritabanı boyutuna daha önce ulaşılacağı için bu sınıra ulaşılamayacağını" belirtmektedir.

Pratik çalışmalar için çıkarılacak faydalı ders, bir limitin tam tersidir. Birisi size bir .db dosyası verir ve bunun büyük olduğu konusunda uyarırsa, sizi durduracak olan şey neredeyse kesinlikle bu format olmayacaktır. Dosya oluşturulurken seçilen sayfa boyutu ve indeks taşıyıp taşımadığı, deneyimi belgelenmiş herhangi bir tavan sınırdan çok daha fazla etkileyecektir.

SQLite dosyalarıyla nerede karşılaşırsınız

  • Uygulama dışa aktarmaları. Masaüstü ve mobil uygulamalar genellikle geçmişi, ayarları ve mesaj günlüklerini kopyalayabileceğiniz bir SQLite dosyasında saklar.
  • Analiz paylaşımları. Mühendisler, veritabanı erişimi vermek yerine bir anlık görüntüyü tek bir dosya olarak gönderirler.
  • Cihazlar ve telemetri. Gömülü sistemler, konuşacak bir sunucu olmadığı için yerel olarak yazarlar.
  • Arşivler. Formatın uzun vadeli kararlılığı, yıllarca okunabilir kalması gereken veri kümeleri için onu yaygın bir tercih haline getirir.
  • Tarayıcı ve araç iç yapıları. Birçok yerel araç durum bilgisini bu şekilde tutar, bu nedenle bu uzantı destek taleplerinde sıkça karşımıza çıkar.

WAL ve günlük (journal) dosyaları ne işe yarar

Bir .db dosyasını kopyaladığınızda yanında bir -wal veya -journal dosyası bulmuş olabilirsiniz. Bunlar spesifikasyonun tanımladığı yardımcı dosyalardır ve bunları silmek insanların veri kaybetmesine neden olur.

Rollback journal daha eski bir mekanizmadır. SQLite, bir sayfayı değiştirmeden önce o sayfanın orijinal sürümünü günlüğe yazar. Yazma işlemi kesintiye uğrarsa orijinal sürüm geri yüklenebilir; bu da bir işlemin çökme durumunda hayatta kalmasını sağlar.

Write-ahead log ise bu düzeni tersine çevirir. Değişiklikler önce günlüğe kaydedilir ve ana dosya daha sonra güncellenir. Üstbilgi, veritabanının hangi modda olduğunu belirtir. 18 ofsetindeki dosya formatı yazma sürümü "eski sistemler için 1; WAL için 2" şeklindedir.

Pratik kural, doğrudan tam durumla ilgili cümleden çıkar. Veritabanının WAL modunda olduğunu ve birinin size yalnızca ana dosyayı verdiğini varsayalım. En son işlenen değişiklikler, size ulaşmayan günlük dosyasında kalmış olabilir.

Bu nedenle size bir veritabanı dosyası verildiğinde iki soru sorun. Kopya alınırken uygulama düzgün bir şekilde kapatıldı mı ve yanında başka bir şey geldi mi? Her iki cevabın da genellikle evet olması beklenir; aksi takdirde sayılar canlı ortamdaki verilerle sessizce çelişecektir.

SQLite dosyası vs CSV vs Parquet

SQLite dosyası CSV Parquet
Biçim Çok sayıda tablo, tek bir dosya Tek bir tablo, tek bir dosya Tek bir tablo, tek bir dosya veya klasör
Türler Veriyle birlikte saklanır Okuyucu tarafından tahmin edilir Veriyle birlikte saklanır
İlişkiler Anahtarlar ve indeksler aracılığıyla korunur Kaybolur Kaybolur
İnsan tarafından okunabilir Hayır Evet Hayır
Sorgulanmak üzere yazılmıştır Evet, SQL ile Hayır Evet, analiz motorları tarafından
Yaygın hata Eksik günlük veya WAL yardımcı dosyası Tür ve sınırlayıcı tahmini Araç zinciri desteği

Bu formatlarla düzenli olarak çalışıyorsanız, Parquet dosyaları ve TSV dosyaları hakkındaki açıklayıcı rehberlerimiz bu iki format için de aynı konuları kapsamaktadır.

Ekipler neden bu formatı seçiyor

Çalıştırılacak hiçbir şey yoktur. SQLite "ayrı bir sunucu sürecine sahip olmadığı" için, veri paylaşımı bir kurulum talebi yerine sadece bir dosya kopyalamadan ibarettir.

Veri türleri korunur. Bir tarih sütunu, tarih olarak ulaşır. Bir CSV okuyucusunun bir kimliği bilimsel gösterime dönüştürmesini izleyen herkes bunun değerini anlayacaktır.

İlişkiler de korunur. İlişkili birkaç tablo tek bir bütün içinde bir arada kalır, böylece verileri anlamlı kılan birleştirmeler hala kullanılabilir durumdadır.

Dayanıklılık tasarımında vardır. SQLite, temel özellikleri arasında "güç kaybından sonra bile" işlemleri korumayı listeler; bu nedenle pek çok gömülü yazılım ona güvenir.

Bilinmesi gereken limitler

Aynı anda tek dosya, tek yazıcı. Motor, sunulmak yerine gömülüdür, bu nedenle eşzamanlılık modeli bir istemci-sunucu veritabanından farklıdır. Bu bir kusur değil, bir tasarım seçimidir ancak dosyanın ne için uygun olduğunu belirler.

Sayfa boyutu oluşturulurken sabitlenir. Bir veritabanındaki her sayfa aynı boyuttadır ve bu boyut üstbilgide kaydedilir. Bunu bir kez seçersiniz.

Yine yardımcı dosya kuralı. Yalnızca ana dosyayı alan herhangi bir kopyalama, yedekleme veya yükleme rutini, günlükte veya write-ahead log dosyasında bulunan her şeyi gözden kaçırabilir.

Kapalılık. Bir SQLite dosyası, bir CSV gibi hızlıca gözden geçirilemez. Okunması bir araç gerektirir; bu da birçok analizi sekteye uğratan asıl zorluktur.

Bir SQLite dosyasından nasıl yanıt alınır

Geleneksel yol bir istemci kurmak, dosyayı açmak, şemayı öğrenmek ve SQL yazmaya başlamaktır. Tabloları zaten bildiğinizde bu yöntem iyidir. Ancak dosya size bu sabah verildiyse ve toplantı bu öğleden sonraysa bu süreç yavaştır.

Daha kısa yol ise soruyu doğrudan sormaktır. Powerdrill Bloom, verilerinizle doğal dilde çalışmanıza olanak tanır ve kaynağı eklenmiş bir yanıt döndürür. Ana sayfa, "her sayının arkasındaki sayfa, satır ve rakamla birlikte geri döneceğini" vaat eder. Buradan yola çıkarak aynı çalışma alanı grafikler, tablolar veya kısa bir sunum hazırlayabilir.

Eğer bu sizin düzenli iş akışınızsa, ilgili iki sayfayı bilmenizde fayda var. Chat with Database yapılandırılmış verilere konuşma yoluyla erişimi kapsarken, Text to SQL doğrudan sorgunun kendisini istediğiniz durumları kapsar. Paylaşılan verileriniz düz bir dışa aktarma olarak geldiyse, CSV AI assistant sayfası bu yolu kapsar.

Üstbilginin size söylediği bir şey daha

Sayfa boyutu sabit bir ofsette yer aldığından, dosyayı tam olarak açmadan önce onun hakkında yararlı bir bilgi edinebilirsiniz. 4.096 baytlık bir sayfa ile oluşturulan bir veritabanı, 65.536 baytlık sayfalarla oluşturulan bir veritabanından farklı davranır. Bu seçim, dosya oluşturulurken bir kez yapılmıştır.

Bu, daha sonra rastgele değiştirebileceğiniz bir sayı değildir. Bir ayardan ziyade şema kararıyla aynı zihinsel kategoride yer alır.

Sonuç

Bir SQLite dosyası, tek bir bütün içindeki veritabanının tamamıdır. 16 baytlık bir imza, 16 ofsetinde kaydedilmiş bir sayfa boyutu ve tablolarınızı ile indekslerinizi taşıyan sabit boyutlu sayfalardan oluşan bir yığın barındırır. Kolayca taşınır, veri türlerini korur ve yıllarca okunabilir kalır.

Spesifikasyonun üzerinde titizlikle durduğu tek uyarıyı unutmayın. Tam durum genellikle o dosyadadır. Bir işlem sırasında, bunun bir kısmı yanındaki bir rollback journal veya write-ahead log dosyasında yaşar. Kopyaya güvenmeden önce yardımcı dosyayı kontrol edin.

Dosyaya sahip olduğunuzda ve şemadan ziyade yanıta ihtiyaç duyduğunuzda, Powerdrill Bloom'u deneyin ve sorunuzu doğrudan verilere sorun.

Sıkça sorulan sorular

.db, .sqlite ve .sqlite3 arasındaki fark nedir?

Yapısal olarak hiçbir fark yoktur. Her üçü de aynı format için kullanılan geleneksel uzantılardır ve gerçek tanımlayıcı, dosyanın başındaki 16 baytlık SQLite format 3\000 üstbilgi dizesidir.

Bir SQLite dosyasının hangi sayfa boyutunu kullandığını nasıl anlarım?

Bu bilgi üstbilgide kaydedilir. 16 ofsetindeki 2 baytlık bir tamsayı, bayt cinsinden sayfa boyutunu tutar. Bu değer, 512 ile 32768 arasında ikinin bir kuvveti veya 65536'yı temsil eden 1 değeri olmalıdır.

Bir SQLite dosyası veritabanının tamamı mıdır?

Genellikle evet, ama her zaman değil. Dokümantasyon, bir işlem sırasında SQLite'ın ek bilgileri bir rollback journal dosyasında tuttuğunu belirtir. WAL modunda ise bu bilgiler bunun yerine bir write-ahead log dosyasına gider.

Bir SQLite dosyasını Excel'de açabilir miyim?

Doğrudan açamazsınız, çünkü dosya metin satırları yerine B-tree sayfalarını saklar. Yaygın yöntem, önce bir tabloyu CSV formatında dışa aktarmak veya veritabanı formatını okuyup sonuçları döndüren bir araç kullanmaktır.

SQLite ticari olarak ücretsiz kullanılabilir mi?

Evet. SQLite, kodunun kamu malı olduğunu ve "ticari veya özel her türlü amaçla kullanımının ücretsiz" olduğunu belirtmektedir.