2009-12-11 66 views
24

SQLite3を組み込み、メモリ内のデータベースを使用するアプリケーションでは、アプリケーションの実行中の2つのインスタンス間でデータベースを複製できますか?私はすべての私のDBアクセスを複製する自作プロトコルで手作業でこれを行うことができましたが、それはDBレイヤー内で行うべきもののようです。SQLiteはレプリケーションをサポートしていますか?

答えて

12

ブルートフォースアプローチ: ".dump"コマンドを送信して、データのテキスト表現を作成します。そのデータを2番目のデータベースに読み込みます。あなたはそれを使うことができるかどうかはわかりません

あなたがきめの細かいアップデート(他のコピー件までそれぞれのコピーを送信する)必要がある場合は、sqlite3_update_hook

を見ている。しかし、どのようにエラーを処理することを計画していますか?たとえば、app2のDBのコピーが何らかの理由で更新できない場合はどうなりますか?

この問題を解決するには、データベースをサーバープロセスに移動して、2つのアプリケーションでそのプロセスと通信させます。

+0

さて、sqlite3_update_hookは、行単位で階層化するための私の出発点になります。それはとても役に立ちます、ありがとうございます。 他の点に応じて、私はアプリケーションの特定の魔法の性質によって挿入できないものは避けます。中央DBではなく2つの別々のインスタンスに対する欲求は、堅牢性ごとの要件によってもたらされ、sqliteはシステムリソースの制限によって決まります。 – kdt

+1

両方のコピーに同時にメモリ/ディスク領域が不足していることを確認してください。 –

+0

これは重大な答えのようではありません。はい、最終的にはそれを自分で作ることができますが、それを信頼できるものにする大きな仕事になります。 –

0

いいえプロジェクトのスコープが単純なインプロセス・データベースであるため、そうではありません。しかし、データベースは単なるファイルなので、普通のファイルコピー操作、rsyncなどに基づいて独自の複製スクリプトを作成することができます。

本当にSQLiteベースのクライアント/サーバータイプのRDBMSが必要な場合は、SQLiteDBMSをご覧ください。

1

メモリ内のデータベースにレプリケートする場合は、berkeley DB (BDB)を参照する必要があります。しかし、BDBのデータモデルは文字列の辞書なので、SQLの柔軟性が失われます。それに3つの節のライセンスがあるので、プロジェクトが商用であれば、ライセンスを取得する必要があります。

0

ユニゾン? SQLite dbが1つのモノリシックファイルになっているため、最高のパフォーマンスを発揮できました。 2つの「インスタンス」の間でラウンドロビンすることはできませんでした。ホットスペアは悪くないですが、MySQLマスタースレーブやアクティブパッシブと比較して簡単にはできない手動介入がある場合に比べて、他のアプリ+ dbを簡単に拾うことができます。 MySQLレプリケーションは、unison/rsyncのような差分だけでなく、SQLを回します。しかし、調和するとマスターマスターになります。

2

Lsyncd - Live Syncing (Mirror) Daemonここで使用できます。 rsyncを使用してファイルレベルで連続レプリケーションを実行します。

+0

これはおそらくライブ実行中のデータベースにとっては良い考えではありません。スレーブデータベースがトランザクション中に複製されると、スレーブデータベースが破損する可能性があります。 –

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

+0

ウェブサイトのビデオを確認してください。 – malhal

0

すぐに、いいえ。 少数のサードパーティ製のオプションがあります。

SQLite sync:https://ampliapps.com/sqlite-sync/これは他のデータベースやSQLiteにレプリケートでき、SQLiteエンジンを変更しないので魅力的です。私はまだそれを試していない。

Litereplica:http://litereplica.io/片道のみです。少し周りにいたようだ。

LiteSync:http://litesync.io/双方向レプリケーション。かなり新しいですが、Litereplicaの進化はおそらくそれが現れるよりも成熟しています。私はこれをちょっと試してみましたが、開発者が見ているいくつかのバグがあってスムーズに動作するようです。開発者が変更したSQLiteエンジンを使用する必要があります。これは依存関係のようです。あなたはまた、多くのコントロールを得ることはありません。データベースを再オープンすることなく今すぐ複製することはできません。

関連する問題