30

在嵌入 SQLite3 并使用内存数据库的应用程序中,是否可以在应用程序的两个运行实例之间复制数据库?我可以使用自制协议手动完成此操作,复制我所有的数据库访问,但这似乎应该在数据库层内完成。

4

7 回答 7

14

蛮力方法:向其发送“.dump”命令以创建数据的文本表示。将该数据读入第二个数据库。不确定你可以使用它。

如果您需要细粒度更新(将每个副本发送到另一个副本),请查看sqlite3_update_hook

但是您打算如何处理错误?例如,当app2中的数据库副本由于某种原因无法进行更新时会发生什么?

要解决此问题,请将数据库移动到服务器进程并让两个应用程序与之对话。

于 2009-12-11T14:08:30.053 回答
8

开箱即用,没有。有少量第三方选项:

SQLite 同步:https ://ampliapps.com/sqlite-sync/这个看起来很有吸引力,因为它可以复制到其他数据库以及 SQLite,并且不修改 SQLite 引擎。我还没试过。

Litereplica:http ://litereplica.io/只有一种方式。好像有点过了。

LiteSync:http ://litesync.io/双向复制。相当新,但 Litereplica 的演变可能比看起来更成熟。我已经尝试了一点,它似乎运行顺利,开发人员正在查看一些错误。您必须使用开发人员修改过的 SQLite 引擎,这似乎是一个令人担忧的依赖项。您也没有得到太多控制,例如,如果不重新打开数据库,您就不能说现在复制。

于 2018-01-18T22:02:23.390 回答
3

Lsyncd - 实时同步(镜像)守护程序可能在这里使用。它使用 rsync 在文件级别进行连续复制。

于 2015-04-07T15:34:39.610 回答
2

如果要在内存数据库中进行复制,则需要查看berkeley DB (BDB)。但是 BDB 的数据模型是字符串-字符串字典,因此您失去了 SQL 的灵活性。加上它有一个三条款许可证,所以如果你的项目是商业的,你需要获得许可证。

于 2009-12-11T14:15:26.503 回答
0

不,不是因为项目的范围是一个简单的进程内数据库。但是因为数据库只是一个文件,你可以根据普通文件复制操作、rsync 或类似的东西编写自己的复制脚本。

如果你真的想要一个基于 SQLite 的客户端/服务器类型的 RDBMS,你可以看看SQLiteDBMS

于 2009-12-11T14:09:36.747 回答
0

齐声?虽然你能做的最好的是热备用,因为 SQLite db 在一个整体文件中。你不能在两个“实例”之间循环。热备也不错,你只需拿起另一个app+db就可以了,相比之下MySQL主从或主动-被动需要一些人工干预,这并不容易。MySQL 复制传递 SQL,而不仅仅是像 unison/rsync 这样的差异。但是随着一致,你就有了大师-大师。

于 2012-02-21T22:24:48.807 回答
0

我们仍然没有原生支持,虽然我们在备份、检查文档方面做了一些改进,但是我们有更多的第三方选项:欢迎Litestream,它的发布和开发方式与 SQLite 类似。

于 2021-08-27T22:36:51.847 回答