1 puan yazan GN⁺ 2025-05-02 | 1 yorum | WhatsApp'ta paylaş
  • SQLite veritabanını bilgisayarlar arasında daha hızlı kopyalamanın bir yöntemi açıklanıyor
  • Veritabanındaki indeksler, kopyalama hızını yavaşlatan başlıca etken
  • SQLite'ın .dump komutu kullanılarak veritabanı bir metin dosyasına dökülebilir
  • Metin dosyası, özgün veritabanından daha küçük olabilir; sıkıştırıldığında ise daha da küçülür
  • Bu yöntem, büyük veritabanlarını daha hızlı ve daha güvenilir biçimde kopyalamayı sağlar

SQLite veritabanını bilgisayarlar arasında daha hızlı kopyalamanın yolu

  • Uzak bir sunucuda saklanan SQLite veritabanını yerel bilgisayara kopyalama yöntemi anlatılıyor
  • İlk aşamadaki projelerde rsync komutuyla basitçe kopyalama yapılabilir
  • Veritabanı büyüdükçe kopyalama yavaşlar ve güvenilirlik düşer

Veritabanı dökümünü metin dosyasına dönüştürmek

  • SQLite, .dump komutuyla veritabanını bir metin dosyasına dökebilir
  • Bu metin dosyası SQL ifadelerinden oluşur ve özgün veritabanından daha küçük olabilir
  • İndeksler, metin dosyasında tek satıra indirgenerek depolama alanından tasarruf sağlayabilir

Sıkıştırmayla depolama alanı kazanmak

  • Metin dosyası sıkıştırıldığında daha da küçülür
  • Örneğin özgün SQLite veritabanı 3.4GB ise, gzip ile sıkıştırılmış metin dosyası 240MB'ye kadar düşebilir
  • Sıkıştırılmış metin dosyasını indirerek veritabanı kopyalama işlemi çok daha hızlı hale gelir

Yeni ssh+rsync komutu

  • Sunucuda gzip ile sıkıştırılmış bir metin dosyası oluşturulup yerel bilgisayara kopyalanır, ardından veritabanı yeniden oluşturulur
  • Sunucuda sıkıştırılmış metin dosyası oluşturma: ssh username@server "sqlite3 my_remote_database.db .dump | gzip -c > my_remote_database.db.txt.gz"
  • Dosyayı yerel bilgisayara kopyalama: rsync --progress username@server:my_remote_database.db.txt.gz my_local_database.db.txt.gz
  • Sıkıştırmayı açıp veritabanını yeniden oluşturduktan sonra yerel dosya silinir

Veritabanı dökümü güvenilir bir kopyalama kaynağıdır

  • Kopyalama sırasında veritabanı güncellenirse, rsync bozuk bir veritabanı dosyası oluşturabilir
  • Metin dökümü oluşturarak kararlı bir kopyalama kaynağı sağlamak bu sorunu çözer
  • Bu yöntem, büyük veritabanlarıyla çalışırken zaman kazandırır ve indirmeleri daha hızlı, daha güvenilir hale getirir

1 yorum

 
GN⁺ 2025-05-02
Hacker News görüşü
  • SQLite resmi bir araç sunuyor. Sayfa düzeyinde çalışıyor; replika her sayfanın kriptografik hash’ini kaynak tarafa gönderiyor ve hash’i eşleşmeyen sayfaların tam içeriği kaynak tarafından yeniden gönderiliyor
  • Çalışmakta olan bir veritabanı dosyasını kopyalamak bozulmaya yol açabilir. Güvenli çoğaltma için Litestream kullanılabilir
  • Veritabanını bilgisayarlar arasında kopyalamanın bir yolu, seed’i gönderip geri kalan kısmı yok saymaktır
    • Artımlı rsync daha hızlıdır, ancak SQL ifadelerini göndermenin veritabanının kendisini göndermekten daha hızlı olduğu iddiasına katılmıyorum. SQL ifadelerinin çalıştırılması, optimizasyon ve vacuum işlemlerinin yapılması gerekir
    • Bir CSV dosyasından veritabanını "artımlı olarak yeniden inşa etmek" gereken senaryolar vardır. Veritabanını sıfırdan yeniden oluşturmak daha optimaldir, ancak bellekteki boş bir veritabanına toplu ekleme çalıştırmak bile 30 dakika sürüyor
  • Kısa süre önce yayımlanan sqlite_rsync yardımcı programı, SQLite veritabanının iç yapısına optimize edilmiş bir rsync algoritması sürümü kullanıyor. İç veri sayfalarını verimli şekilde karşılaştırıyor ve yalnızca değişen veya eksik sayfaları senkronize ediyor
  • Metin dosyası olarak saklamak verimsizdir. sqlite veritabanını saklamak için VACUUM INTO kullanılıyor
    • VACUUM komutu, yedekleme API’sine bir alternatiftir ve ortaya çıkan yedek veritabanı en küçük boyutta olduğundan dosya sistemi I/O’su azalır
  • rsync’in sunduğu sıkıştırma özelliğinin kullanılmamış olması şaşırtıcı. gzip ile sıkıştırıp ardından aktarmak daha hızlı olabilir
  • DuckDB’de veri boyutunu küçültmek için Parquet’e aktarılabilir. Aktarım ve yükleme daha hızlı olur
  • SQLite, tabloların değişikliklerini izlemek ve SQLite veritabanının önceki bir sürümüne yama uygulayabilmek için change set/patch set üreten bir session extension sunuyor
  • gzip’in "--rsyncable" seçeneği kullanılarak optimizasyon yapılabilir. Sıkıştırmayı biraz azaltır, ancak farkları yerelleştirerek tüm sıkıştırılmış çıktıyı etkilemez
    • Dump çıktısının sıkıştırılması atlanabilir ve rsync’in önceki sıkıştırılmamış dump ile mevcut dump arasındaki farkları hesaplamasına izin verildikten sonra, rsync’in ağ üzerinden gönderdiği change set sıkıştırılabilir
  • 2008’de Postgres kullanarak yedekleri birden fazla makineye göndermek zorunda kaldığım bir deneyimim oldu. Ağ doygunluğa ulaştığı için yedekleri aynı anda tüm hedeflere göndermek üzere udpcast kullandım