2009-12-11 114 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引擎,這看起來像是一個關於依賴關係。你也沒有太多的控制,例如如果不重新打開數據庫,現在不能說複製。