在嵌入 SQLite3 并使用内存数据库的应用程序中,是否可以在应用程序的两个运行实例之间复制数据库?我可以使用自制协议手动完成此操作,复制我所有的数据库访问,但这似乎应该在数据库层内完成。
7 回答
蛮力方法:向其发送“.dump”命令以创建数据的文本表示。将该数据读入第二个数据库。不确定你可以使用它。
如果您需要细粒度更新(将每个副本发送到另一个副本),请查看sqlite3_update_hook
但是您打算如何处理错误?例如,当app2中的数据库副本由于某种原因无法进行更新时会发生什么?
要解决此问题,请将数据库移动到服务器进程并让两个应用程序与之对话。
开箱即用,没有。有少量第三方选项:
SQLite 同步:https ://ampliapps.com/sqlite-sync/这个看起来很有吸引力,因为它可以复制到其他数据库以及 SQLite,并且不修改 SQLite 引擎。我还没试过。
Litereplica:http ://litereplica.io/只有一种方式。好像有点过了。
LiteSync:http ://litesync.io/双向复制。相当新,但 Litereplica 的演变可能比看起来更成熟。我已经尝试了一点,它似乎运行顺利,开发人员正在查看一些错误。您必须使用开发人员修改过的 SQLite 引擎,这似乎是一个令人担忧的依赖项。您也没有得到太多控制,例如,如果不重新打开数据库,您就不能说现在复制。
Lsyncd - 实时同步(镜像)守护程序可能在这里使用。它使用 rsync 在文件级别进行连续复制。
如果要在内存数据库中进行复制,则需要查看berkeley DB (BDB)。但是 BDB 的数据模型是字符串-字符串字典,因此您失去了 SQL 的灵活性。加上它有一个三条款许可证,所以如果你的项目是商业的,你需要获得许可证。
不,不是因为项目的范围是一个简单的进程内数据库。但是因为数据库只是一个文件,你可以根据普通文件复制操作、rsync 或类似的东西编写自己的复制脚本。
如果你真的想要一个基于 SQLite 的客户端/服务器类型的 RDBMS,你可以看看SQLiteDBMS。
齐声?虽然你能做的最好的是热备用,因为 SQLite db 在一个整体文件中。你不能在两个“实例”之间循环。热备也不错,你只需拿起另一个app+db就可以了,相比之下MySQL主从或主动-被动需要一些人工干预,这并不容易。MySQL 复制传递 SQL,而不仅仅是像 unison/rsync 这样的差异。但是随着一致,你就有了大师-大师。
我们仍然没有原生支持,虽然我们在备份、检查文档方面做了一些改进,但是我们有更多的第三方选项:欢迎Litestream,它的发布和开发方式与 SQLite 类似。