在嵌入SQLite3并使用内存数据库的应用程序中,是否可以在应用程序的两个正在运行的实例之间复制数据库?我可以用一个自制程序协议来复制所有数据库访问,但它看起来应该在数据库层中完成。SQLite是否支持复制?
回答
蛮力办法:发送它“.dump”命令来创建数据的文本表示。将数据读入第二个数据库。不确定你可以使用它。
如果您需要细粒度更新(发送复印件各一份高达其他副本),看看sqlite3_update_hook
但你打算如何处理错误?例如,当app2中的数据库副本由于某种原因无法进行更新时会发生什么情况?
要解决这个问题,请将数据库移至服务器进程并让两个应用程序对话。
不,因为项目的范围是一个简单的进程内数据库。但是因为数据库只是一个文件,你可以根据纯文件复制操作,rsync或类似的东西编写你自己的复制脚本。
如果你真的想要一个基于SQLite的客户/服务器类型的RDBMS,你可以看看SQLiteDBMS。
如果要在内存数据库中进行复制,则需要查看berkeley DB (BDB)。然而BDB的数据模型是字符串字典,所以你放松了SQL的灵活性。再加上它有三个条款的许可证,所以如果你的项目是商业的,你需要获得许可证。
Unison?最好你可以做的事情是热备份,因为SQLite数据库在一个单一的文件。你无法在两个“实例”之间循环。热备用并不坏,你只需拿起其他应用程序+数据库就可以了,而不需要大惊小怪,与MySQL主从或主动 - 被动相比,有一些手动干预并不容易。 MySQL复制传递SQL,不仅仅是像unison/rsync那样的差异。但是,你们拥有主人。
Lsyncd - Live Syncing (Mirror) Daemon可能在这里使用。它使用rsync在文件级别进行连续复制。
这可能不是实时运行数据库的好主意。如果从事数据库在事务中复制,它可能会被损坏。 – 2017-12-07 03:43:15
有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" }
开箱即用,没有。 有少数的第三方选件:
SQLite的同步:https://ampliapps.com/sqlite-sync/这一次似乎很有吸引力,因为它可以复制到其他数据库以及SQLite和不修改SQLite的引擎。我还没有尝试过。
Litereplica:http://litereplica.io/单程。似乎已经有一段时间了。
LiteSync:http://litesync.io/双向复制。相当新颖,但Litereplica的演变可能比它看起来更成熟。我已经尝试了一下,看起来确实很顺利,开发人员正在研究一些错误。您必须使用开发人员修改的SQLite引擎,这看起来像是一个关于依赖关系。你也没有太多的控制,例如如果不重新打开数据库,现在不能说复制。
- 1. SQLite是否支持“datareader”?
- 2. SQLite是否支持SCOPE_IDENTITY?
- 3. Git是否支持“复制到”标签?
- 4. 是否支持SSDT复制环境?
- 5. mysql是否支持双向复制?
- 6. clipboard.js是否支持复制锚文本?
- 7. 是否支持Android的SQLite事务?
- 8. SQLite是否支持参照完整性?
- 9. sqlite是否支持linq-to-SQL?
- 10. sencha touch2是否支持SQLite数据库?
- 11. SQLite是否支持“从...删除”
- 12. SQLite的dotConnect是否支持Mono?
- 13. Postgres复制(本机)是否支持每数据库级复制?
- 14. 是否支持sqlite-net异步API支持?
- 15. iPhone的SQLite实现是否支持完整的SQLite 3标准?
- 16. Svelte是否支持复选框绑定?
- 17. 教义是否支持复合实体?
- 18. 是否netpeertcpbinding支持请求/答复
- 19. 是否支持groovvy
- 20. 是否支持SSI?
- 21. 是否支持DataGrid?
- 22. 是否支持MSNP9?
- 23. 是否支持ARC?
- 24. 如何确定SQL Server是否支持复制
- 25. 复制时,CouchDB是否支持附件上的文件差异?
- 26. mongodb是否支持时间触发复制?
- 27. AppleScript中的系统事件是否支持复制文件?
- 28. EHCache 3.x是否支持使用JGroups进行复制缓存?
- 29. SVN是否支持非递归复制文件夹?
- 30. SQL Server复制是否支持这种情况?
好的,所以sqlite3_update_hook将成为我逐层分层的起点。这非常有帮助,谢谢。 为了回应其他要点,我避免了应用程序某些魔术属性无法插入的内容。对于两个单独的实例而不是中央数据库的需求是由分布鲁棒性驱动的,sqlite是由系统资源限制驱动的。 – kdt 2009-12-11 16:37:34
好的。只需确保两个副本同时用完内存/磁盘空间等。 – 2009-12-12 12:41:48
这似乎不是一个认真的答案。是的,你最终可以自己建立它,但它将是一个很大的承诺,使它可靠。 – 2017-12-07 03:41:59