2010-06-27 23 views
5

Benim (dosya tabanlı) SQLite veritabanını yolsuzluktan korumak için en güvenli strateji hangisi olduğunu anlamaya çalışıyorum (bu durumda, Adobe Air ile çalışıyorum ama bu Mobil Safari dahil, SQLite kullanan herhangi bir web tarayıcıya uygulanır.Nasıl SQLite veritabanı yolsuzluktan korunur

Bir veritabanı bağlantısı oluşturmayı, yalnızca 5 veya 10 saniye bekletmeyi ve bu süre zarfında kullanılmadığında kapatmayı düşünüyorum. Benim düşüncem, makinenin çökmesi veya uygulama çıktısının anormal olması durumunda, dosyanın zaten kapalı ve dolayısıyla bozulma olasılığının düşük olması ihtimali yüksektir. Ancak, daha çok, filme dayalı bir DB'yi açıp kapattığınızı biliyorum. Bu, büyük olasılıkla kritik bir hatadır.

Eminim bu konuda fazla düşünmüyorum, fakat benim uygulama için bir sistem çökmesi durumunda uygulamanın temiz ve hızlı bir şekilde kurtabilmesi ve DB'yi korumaya çalışmam gerektiği anlamına geliyor. yapabileceğim kadar.

Hangi stratejinin daha güvenli olabileceğini bilen var mı? Bu belgede

File Locking And Concurrency In SQLite Version 3

Orada sonunda

+1

Sqlite veritabanınızı yolsuzluktan nasıl koruyabileceğinizi buradan öğrenebilirsiniz: http://blog.systoolsgroup.com/sqlite-corruption-causes/ –

cevap

5

adında bir bölüm vardır "6.0 Nasıl Bozuk Kişisel Veritabanı Dosyalar" sqlite yolsuzluk hipotetical curroptions sorunlarını tartışmak. "Things that can can go wrong".

+1

Çok ilginç bir okumadır, ancak hangi yöntemin kullanılacağına karar vermeme yardımcı olmaz. . Veritabanını kapatarak bile, verilerin diske bağlı olduğunu garanti etmiyorsunuz, çünkü bu işletim sistemi, donanım ve SQLite'ye değil; Bu nedenle, kapalı bir veritabanıyla bile aynı yolsuzluk riski vardır. Ancak, veritabanını kapatarak da günlük dosyasını temizlemelisiniz. Bu nedenle, dosyayı sürekli olarak açık tutmaktan ziyade sürekli kapatmak için biraz daha güvenlidir. – Andrew

+1

Bunu düşünmüştüm ... ve dediğin gibi, "bu işletim sistemi ve donanım için geçerliydi" ... belki de bir işletim sistemindeki en iyi yaklaşım, diğerinin en iyi yaklaşımı olamazdı. Buna ek olarak, eğer dosyayı açıp kapatırsak (ve/veya flushing ederek) her birkaç saniyede bir (mobil plataformlarda) performans sorunları yaşayabiliriz. Yani ... Size bir cevap veremiyorum :( – Jonathan

+1

Sadece takip edemem, yarış koşullarından dolayı alamıyorum, sürekli açık-kapalı yaklaşımını terk etmek ve DB'yi tutmak zorunda kaldım Uygulamanın ömrü boyunca daimi olarak açık, yolsuzlukla başa çıkmak için veri tabanının sıcak kopyalarını hazırlıyorum.Bu teknik beni biraz endişelendiriyor (açık bir dosyanın bir kopyasını yapmak), ancak SQLite günlük kaydı ve işlemleri kullanıyorsa Bağlantınız SQLite'yi çok daha iyi anlamanıza yardımcı oldu, bu yüzden ben de bunu cevapladım. Teşekkürler! – Andrew

1

İlk olarak journal_mode=MEMORY veya =OFF'u KULLANMAYIN.

Biz yolsuzluk olasılığını azaltmak için bu komutları kullanabilirsiniz:

  1. PRAGMA synchronous=FULL veya
  2. PRAGMA fullfsync=ONPRAGMA synchronous=EXTRA (sadece Mac OS X üzerinde çalışır)

Ama bir maliyetle geliyor İşlemlerin daha yavaş yapılması. Ve bunlarla bile db, diğer causes depolama aygıtında veya bellekte arızaya bağlı olarak bozulabilir, bu yüzden soruna hazır olmalıyız.

Biz normal backups yapabilir, ancak 2 dezavantajları vardır:

    her yedekleme üzerinde
  1. kopyalar tüm db dosyası Biz son yedekleme sonrasında yapılan tüm işlemleri gevşek

Bir kalem sürücüsünde yedeklemesini yapmak için kullanılan bir müşterim var ve kalem sürücüsü, bir şimşek gelene ve pen drive da dahil olmak üzere bilgisayarı yok edene kadar daima bilgisayara takılı halde tutuldu. Tüm veriler kayboldu. Böylece yedek ana bilgisayardan ayrı tutulmalıdır.

Daha iyi bir alternatif çoğaltma kullanmaktır. Bununla birlikte, ana db üzerinde yürütülen her işlem kopyalara çoğaltılır.

SQLite için litereplica'u kullanabiliriz. Point-in-Time Recovery'yi destekliyor ve ben çoğaltma ile kullanmayı öneririm çünkü eğer bazı veriler yanlışlıkla ana db'den silinirse çoğaltılacaktır. PITR ile db'yi bir önceki noktaya geri yükleyebiliriz.

Diğer önemli bir öneri, kopyalamayı ayrı bir aygıtta ve birbirinden ayrı tutmaktır. En azından aynı binada değil.

PRAGMA integrity_check komutunu çalıştırmak, SQLite'nin otomatik olarak yapmaması ve bazı tür bozulmalarda db'ye yazmaya devam etmesi nedeniyle iyi bir uygulamadır.

Ve eğer db'niz yabancı anahtarlar kullanıyorsa, PRAGMA foreign_key_check ile aynısını yapabilirsiniz.

İlgili konular