首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLite备份策略

SQLite备份策略
EN

Stack Overflow用户
提问于 2013-04-19 13:22:37
回答 2查看 6.2K关注 0票数 2

我正在尝试从一个5分钟一次运行的cron作业中备份sqlite数据库。数据库是“活动的”,所以在我想要执行备份的时候会运行查询。

我想确定的是,当我备份数据库时,数据库状态良好,这样我就可以依赖备份了。

当前策略(以伪代码表示):

代码语言:javascript
复制
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 --不可能;(

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-19 19:20:37

如果不能使用备份API,则必须使用另一种机制来防止在复制数据库文件时修改它。

使用立即开始启动事务

在开始立即之后,其他数据库连接将无法写入数据库或执行开始立即或开始独占。但是,其他进程可以继续从数据库中读取。

票数 3
EN

Stack Overflow用户

发布于 2013-04-19 13:49:24

如果要在运行查询时进行备份,则需要使用备份API。文献资料有一个正在运行的数据库的联机备份示例(示例2)。我不明白Ruby的引用,你可以把它集成到你的程序中,或者把它作为一个小的C程序来运行,除了真正的应用程序--我已经做了这两件事。

备份上的显式integrity_check是过分的。备份API保证目标数据库是一致的和最新的.(问题的另一面是,如果在备份运行时更新DB太频繁,备份可能永远不会完成。)

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16105662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档