我正在尝试从每隔 5 分钟运行的 cronjob 备份我的 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
顺便说一句,the和 a good old 有什么区别cp mydb.sqlite mybackup.sqlite
?
[编辑]我在嵌入式系统上运行 nodejs,所以如果有人建议使用一些 ruby 包装器的sqlite 在线备份 api - 没有机会;(