我正在尝试从一个5分钟一次运行的cron作业中备份sqlite数据库。数据库是“活动的”,所以在我想要执行备份的时候会运行查询。
我想确定的是,当我备份数据库时,数据库状态良好,这样我就可以依赖备份了。
当前策略(以伪代码表示):
function backup()
{
#try to acquire the lock for 2 seconds, then check the database integrity
sqlite3 mydb.sqlite '.timeout 2000' 'PRAGMA integrity_check;'
if (integrity is ok and database was not locked)
{
#perform the backup to backup.sqlite
sqlite3 mydb.sqlite '.timeout 2000' '.backup backup.sqlite'
if (backup could be performed)
{
#Check the consistency of the backup database
sqlite3 backup.sqlite 'PRAGMA integrity_check;'
if (ok)
{
return true;
}
}
}
return false;
}现在,我的策略有一些问题:
PRAGMA integrity_check;和备份之间出了什么问题,我就被搞砸了。有什么想法吗?顺便问一下,sqlite3 .backup和一个好的旧cp mydb.sqlite mybackup.sqlite有什么区别?
编辑我正在嵌入式系统上运行nodejs,所以如果有人建议使用红宝石包装器sqlite在线备份api --不可能;(
发布于 2013-04-19 19:20:37
如果不能使用备份API,则必须使用另一种机制来防止在复制数据库文件时修改它。
使用立即开始启动事务
在开始立即之后,其他数据库连接将无法写入数据库或执行开始立即或开始独占。但是,其他进程可以继续从数据库中读取。
发布于 2013-04-19 13:49:24
如果要在运行查询时进行备份,则需要使用备份API。文献资料有一个正在运行的数据库的联机备份示例(示例2)。我不明白Ruby的引用,你可以把它集成到你的程序中,或者把它作为一个小的C程序来运行,除了真正的应用程序--我已经做了这两件事。
备份上的显式integrity_check是过分的。备份API保证目标数据库是一致的和最新的.(问题的另一面是,如果在备份运行时更新DB太频繁,备份可能永远不会完成。)
可以使用“cp”进行备份,但不能使用正在运行的数据库。您需要在整个备份期间拥有一个独占锁,所以它并不是真正的“实时”。您还需要小心地复制sqlite的所有临时文件以及主数据库。
我希望sqlite3 ".backup“命令使用备份API。
https://stackoverflow.com/questions/16105662
复制相似问题