我在某些系统上有一个sqlite3数据库,我需要在正在进行的操作中下载它。停止或暂停访问进程不是一种选择。因此,据我所知,我需要在下载期间将数据库中的SHARED锁(如http://www.sqlite.org/lockingv3.html中所述)保存到数据库,以避免数据库更改和下载过程中的损坏。我如何明确获得这样的锁定?下载是从C ++程序控制的,所以我需要锁定它。
编辑:thkala建议进行数据库转储。但我更愿意找到一个带锁定的解决方案,因为我不确定是否有足够的内存可用于完整的数据库副本。答案 0 :(得分:8)
不,不。不,不!
手动锁定和复制文件是处理事情的旧方法。 SQLite现在有一个适当的backup API可以使用。这是执行SQLite数据库的在线副本的推荐方法 - 您可以使用它来创建数据库的副本,然后可以在方便时下载。
编辑:
如果你绝对 使用锁定,你可以使用概述here的方法 - 可能在翻译成C之后:
打开数据库
使用BEGIN IMMEDIATE
语句获取共享锁。
手动复制/下载文件 - 确保您不会错过任何文件。至少有DB文件,日志文件和可能的WAL文件。您可能希望将DB放在单独的目录中以简化操作。
ROLLBACK
您刚刚开始的交易。
我理解这种方法在某些情况下如何有用,但我必须重复一遍,不再是推荐的方法。
答案 1 :(得分:2)
我忽略了解决方案: 使用
开始交易BEGIN IMMEDIATE TRANSCTION
并以
结束END TRANSACTION
获取锁定。 IMMEDIATE
关键字不是默认值,并且在调用返回时db已被锁定(已获取RESERVED锁定)。
答案 2 :(得分:-3)
这里的解决方案是错误的,留给后人和人们了解为什么这是一个坏主意。
我认为您也可以将数据库与日志一起复制。(将db和journal复制到tmp文件然后下载它们)然后在远程端尝试打开这个数据库,它将修复本身。这是应用程序使用正确的交易。
请阅读以下评论,解释为何错误:
它的要点是,你可以复制db&期刊,但只有你 可以在同一时刻完全同时获得。
这或多或少是不可能的。