我正在试图找出保护我的(基于文件的)SQLite数据库免受损坏的最安全的策略(在这种情况下,我正在使用Adobe Air,但这适用于任何使用的webkit浏览器SQLite,包括Mobile Safari)。
我正在考虑创建一个数据库连接,保持它只有5或10秒,然后关闭它,如果在那段时间内没有使用它。我的想法是,如果机器崩溃或应用程序异常退出,则文件已经关闭并因此不太可能被破坏的可能性很大。但我知道,打开和关闭基于文件的数据库的频率越高,就越有可能出现严重错误。
我确信我对此过度思考,但对于我的应用程序而言,在系统崩溃的情况下,应用程序可以干净而快速地恢复,这意味着我必须尽可能多地保护数据库,这一点至关重要。我可以。
有谁知道哪种策略可能更安全?
答案 0 :(得分:6)
本文末尾
File Locking And Concurrency In SQLite Version 3
有一个名为“6.0如何破坏您的数据库文件”的部分讨论了sqlite中的破坏性的curottion curroptions问题。 “Things that can can go wrong”。
答案 1 :(得分:1)
首先请勿使用journal_mode=MEMORY
或=OFF
。
我们可以使用这些命令来降低损坏的可能性:
PRAGMA synchronous=FULL
或PRAGMA synchronous=EXTRA
PRAGMA fullfsync=ON
(仅适用于Mac OS X)但他们的成本使得交易变慢。即使使用它们,db也会因存储设备或内存中的其他causes故障而损坏,因此我们必须为此问题做好准备。
我们可以定期backups,但它有两个缺点:
我有一个客户用于在笔式驱动器上进行备份,并且笔式驱动器始终保持插入计算机,直到闪电来袭并破坏计算机,包括笔式驱动器。所有数据都丢失了。因此备份必须与主计算机分开。
更好的选择是使用复制。有了它,主db上执行的每个事务都被复制到副本。
对于SQLite,我们可以使用litereplica。它支持时间点恢复,我建议将其与复制一起使用,因为如果从主数据库中意外删除了某些数据,它将被复制。使用PITR,我们可以将db恢复到之前的某个时间点。
另一个重要的建议是将副本保存在单独的设备中,并且彼此分开。至少不在同一栋楼里。
偶尔运行PRAGMA integrity_check
命令是一种很好的做法,因为SQLite不会自动执行它并且在某些类型的损坏中继续写入数据库。
如果您的数据库使用外键,您可以使用PRAGMA foreign_key_check
执行相同的操作。