gpt4 book ai didi

SQLite 备份策略

转载 作者:行者123 更新时间:2023-12-03 17:35:50 29 4
gpt4 key购买 nike

我正在尝试从以 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 和一个很好的旧版 cp mydb.sqlite mybackup.sqlite 有什么区别?

[edit] 我在嵌入式系统上运行 nodejs,所以如果有人建议 sqlite online backup api有一些 ruby 包装 - 没有机会;(

最佳答案

如果您想在查询运行时进行备份,您需要使用备份 API。 The documentation有一个正在运行的数据库的在线备份示例(示例 2)。我不了解 Ruby 引用,您可以将它集成到您​​的程序中,或者将它作为一个小的 C 程序在实际应用程序之外运行——我都做过。

对备份进行显式的 integrity_check 是多余的。备份 API 保证目标数据库是一致的和最新的。 (该硬币的另一面是,如果您在备份运行时过于频繁地更新数据库,则备份可能永远不会完成。)

可以使用“cp”来备份,但不能备份正在运行的数据库。您需要在整个备份期间拥有一个独占锁,因此它不是真正的“实时”。您还需要小心复制所有 sqlite 的临时文件以及主数据库。

我希望 sqlite3“.backup”命令使用备份 API。

关于SQLite 备份策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16105662/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com