2009-12-11 182 views
24

在嵌入SQLite3并使用内存数据库的应用程序中,是否可以在应用程序的两个正在运行的实例之间复制数据库?我可以用一个自制程序协议来复制所有数据库访问,但它看起来应该在数据库层中完成。SQLite是否支持复制?

回答

12

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

如果您需要细粒度更新(发送复印件各一份高达其他副本),看看sqlite3_update_hook

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

要解决这个问题,请将数据库移至服务器进程并让两个应用程序对话。

+0

好的,所以sqlite3_update_hook将成为我逐层分层的起点。这非常有帮助,谢谢。 为了回应其他要点,我避免了应用程序某些魔术属性无法插入的内容。对于两个单独的实例而不是中央数据库的需求是由分布鲁棒性驱动的,sqlite是由系统资源限制驱动的。 – kdt 2009-12-11 16:37:34

+1

好的。只需确保两个副本同时用完内存/磁盘空间等。 – 2009-12-12 12:41:48

+0

这似乎不是一个认真的答案。是的,你最终可以自己建立它,但它将是一个很大的承诺,使它可靠。 – 2017-12-07 03:41:59

0

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

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

1

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

0

Unison?最好你可以做的事情是热备份,因为SQLite数据库在一个单一的文件。你无法在两个“实例”之间循环。热备用并不坏,你只需拿起其他应用程序+数据库就可以了,而不需要大惊小怪,与MySQL主从或主动 - 被动相比,有一些手动干预并不容易。 MySQL复制传递SQL,不仅仅是像unison/rsync那样的差异。但是,你们拥有主人。

2

Lsyncd - Live Syncing (Mirror) Daemon可能在这里使用。它使用rsync在文件级别进行连续复制。

+0

这可能不是实时运行数据库的好主意。如果从事数据库在事务中复制,它可能会被损坏。 – 2017-12-07 03:43:15

5

有DB层内部实现2种选择:

litereplica(一个方向的复制,实时增量备份)

{ Characteristics: [ 
    "replica db is binary equivalent of main db when synchronized", 
    "replica db is read-only", 
    "all the db is replicated" ], 
Split Brain: "not applicable, as it is single master", 
Additional Features: "Point-in-time recovery, encryption using ChaCha", 
Interface: "native SQLite. Existing wrappers for SQLite can be used", 
Notes: "does not support WAL", 
License: "commercial" } 

litesync(多主复制和同步)

{ Characteristics: [ 
    "can write to the db even when it is off-line", 
    "fast (first write to local db, then synchronize using a worker thread)", 
    "avoids insert id collisions using modified rowids" ], 
Split Brain: "does not occur because it uses a star topology", 
Additional Features: "encryption using ChaCha", 
Interface: "native SQLite. Existing wrappers for SQLite can be used", 
Notes: "use attached db for replication of only some tables", 
License: "commercial" } 
+0

感谢您的回答。我阅读了你提到的有关litereplica的链接并下载了它。但是,没有足够的关于如何设置主从设备的信息(老实说,我以前从来没有做过,所以我有点困惑)..你有更多的信息或有关它的教程的链接?谢谢 – mOna 2016-10-17 07:15:10

+0

检查网站上的视频。 – malhal 2016-12-02 08:22:13

0

开箱即用,没有。 有少数的第三方选件:

SQLite的同步:https://ampliapps.com/sqlite-sync/这一次似乎很有吸引力,因为它可以复制到其他数据库以及SQLite和不修改SQLite的引擎。我还没有尝试过。

Litereplica:http://litereplica.io/单程。似乎已经有一段时间了。

LiteSync:http://litesync.io/双向复制。相当新颖,但Litereplica的演变可能比它看起来更成熟。我已经尝试了一下,看起来确实很顺利,开发人员正在研究一些错误。您必须使用开发人员修改的SQLite引擎,这看起来像是一个关于依赖关系。你也没有太多的控制,例如如果不重新打开数据库,现在不能说复制。