トランザクション メッセージ キューが必要なようです。
これがどのように機能するかは簡単です。マスター データベースを更新すると、任意の数のキューに送信できるメッセージ ブローカー (更新内容に関係なく) にメッセージを送信できます。各スレーブデータベースは独自のキューを持つことができ、キューの順序が保持されるため、プロセスは最終的に正しく同期する必要があります (皮肉なことに、これはほとんどの RDBMS が内部でレプリケーションを行う方法の一種です)。
メッセージ キューは、一種の SCM 変更リストまたはパッチ リスト データベースと考えてください。つまり、ほとんどの場合、マスターに送信された同じ (またはほぼ同じ) SQL ステートメントは、最終的に他のデータベースに複製される必要があります。ほとんどのメッセージ キューは持続性とトランザクションをサポートしているため、メッセージが失われる心配はありません。
この質問にspring-batch のタグを付けたので、特にspring-amqpおよび/またはspring-integrationを確認することをお勧めします。
あなたのコメントに基づいて:
ところでNOT IN
、パフォーマンスの問題であるというあなたの懸念は、多くの回避策があるため、あまり良いものではありませんが、DB 固有のこと (トリガーやレプリケーションなど) を実行したくないことを考えると、メッセージ キューが最善の選択肢であると感じています。
編集 - 非 MQ ルート
この質問をするのに苦労したので、引き続きお手伝いします。メッセージ キューのほかに、以前に試みたように、ある種の XML ファイルを実行できます。スキーマで必要な重要な機能は、マスター データベースの CREATE TIMESTAMP 列です。これにより、システムの稼働中にバッチ処理を実行できます (そうしないと、システムを停止する必要があります)。このルートに行く場合SELECT * WHERE CREATE_TIME < ?
は、現在の時間よりも短くしたいと思うでしょう。基本的に、スナップショットで行を取得するだけです。
inner joining
削除のために他のデータベースで、IDテーブルで行を削除しようとしていますが、 !=
(つまり、の代わりに JOINS を使用できます slow NOT IN
)。ids
幸いなことに、すべてのfor deleteだけが必要で、他の列は必要ありません。更新タイム スタンプ列に基づいてデルタを使用できるその他の列 (更新用、別名挿入用)。