2010-06-27 308 views
5

我试图找出哪些是最安全的策略来保护我的(基于文件的)SQLite数据库免受腐败(在这种情况下,我正在使用Adobe Air,但是这可能会适用于任何使用SQLite的Webkit浏览器,包括Mobile Safari)。如何保护SQLite数据库免受损坏

我正在考虑创建一个数据库连接,只保留它5或10秒左右,然后关闭它,如果它没有在那段时间使用。我的想法是,如果机器崩溃或应用程序异常退出,很可能文件已关闭,因此不太可能受到损坏。但是我知道,打开和关闭基于文件的数据库的频率越高,出现严重错误的可能性就越大。

我确定我在想这个,但对于我的应用程序来说,在发生系统崩溃时,应用程序可以干净而快速地恢复,这意味着我必须尝试保护数据库尽我所能。

有谁知道哪种策略可能更安全?

+1

这里是你如何可以保护您的Sqlite数据库免受损坏:http://blog.systoolsgroup.com/sqlite-corruption-causes/ – 2017-10-27 11:47:30

回答

5

在这个有文件

File Locking And Concurrency In SQLite Version 3

的结束是一个名叫段“6.0如何损坏您的数据库文件”是讨论sqlite的腐败hipotetical curroptions问题。 “Things that can can go wrong”。

+1

这是一个非常有趣的阅读,虽然它不帮助我决定使用哪种方法。我猜即使通过关闭数据库,也不能保证数据已经提交到磁盘,因为这取决于操作系统和硬件,而不是SQLite;所以即使是封闭的数据库也存在相同的腐败风险。但是,通过关闭数据库,您也应该刷新日志文件。因此,不断关闭文件比保持文件持续打开更安全。 – Andrew 2010-06-27 10:57:13

+1

我曾经想过......正如你所说的那样,“这取决于操作系统和硬件”,所以......也许在一个操作系统中最好的解决方法不能成为另一个操作系统中最好的方法。另外,如果我们每隔几秒打开一个文件并关闭(并刷新)文件(在移动平台中),我们可能会遇到性能问题。所以...我不能给你一个答案:( – Jonathan 2010-06-27 12:02:53

+1

只是为了跟进,由于竞争条件我不能摆脱,我不得不放弃持续的开闭式方法,并保持数据库为了处理腐败问题,我正在制作数据库的热备份,这种技术也让我担心了一点(制作一份打开文件的副本),但是因为SQLite使用日志和事务处理,所以应该还是很安全的,你的链接帮助我更好地理解SQLite,所以我正在评价这个答案,谢谢! – Andrew 2010-06-29 01:52:21

1

首先不要使用journal_mode=MEMORY=OFF

我们可以使用这些命令来减少腐败的可能性:

  1. PRAGMA synchronous=FULLPRAGMA synchronous=EXTRA
  2. PRAGMA fullfsync=ON(仅适用于Mac OS X)

但他们是有代价使交易变慢。即使对他们来说,数据库可能会因为其他causes像存储设备或内存中的故障而损坏,所以我们必须准备好解决问题。

我们可以定期backups,但它有2个缺点:

  1. 它复制每个备份整个数据库文件
  2. 我们失去了上次备份后所做的所有交易

我有一个用来在笔驱动器上进行备份的客户,并且笔驱动器总是一直插在计算机上,直到闪电来到并摧毁了计算机,包括笔式驱动器。所有的数据都丢失了。所以备份必须与主计算机保持分离。

更好的选择是使用复制。通过它,主数据库上执行的每个事务都被复制到副本。

对于SQLite我们可以使用litereplica。它支持时间点恢复,我建议将它与复制一起使用,因为如果一些数据意外从主数据库中删除,它将被复制。使用PITR,我们可以将数据库恢复到之前的时间点。

另一个重要的建议是保持复制品在一个单独的设备,并相互分开。至少不在同一栋楼里。

运行PRAGMA integrity_check命令偶尔是一个很好的做法,因为SQLite不会自动执行它,并且它会继续写入某些损坏的db。

如果你的数据库使用外键,你可以使用PRAGMA foreign_key_check