まず第一に、あなたたちの誰もがこの男の質問に答えないのはなぜですか?セキュリティ制限/コンプライアンス/レガシーシステムのために、これを行わなければならない場合があります。
ここで擬似コードを使用して作成するオプションがいくつかあります。データベースがどの程度リアルタイムであるかわからないため、すべての場合に機能するとは限りません。
要件
これが機能するには、データベースが同じサーバーインスタンスにある必要があります。そうでない場合は、リモートデータにアクセスするためにフェデレーションストレージエンジンをセットアップする必要があります。別の人が述べたように、MySQLレプリケーションは、少なくとも同じサーバーにデータを取得して、フェデレーションストレージを設定しなくても同期を高速化するのに役立つ可能性があります。参照: https://dev.mysql.com/doc/refman/5.7/en/federated-storage-engine.html
同期タイミング
MySQLでは、特定のスケジュールでイベントを作成して作業を実行できます(外部のジョブスケジューリングツールがない場合)。
ある種の変更日があるといいのですが、modified_at
があるすべてのフィールドで、1日1回またはより狭い間隔でクエリを実行できます。> =DATE_SUB(NOW()、INTERVAL?HOUR)
列を追加できる場合は、synced_at
という列を作成できます。 これは、サーバーのクロックの違いに対してもう少し耐性があります。次に、synced_at
の場所を簡単に照会できます。 ISNULLまたはsynced_at
<=modified_at
MySQLは、INSERT / UPDATE/DELETEなどのBEFOREおよびAFTERトリガーをサポートしています...これらを使用してロジックをトリガーできます。トランザクションごとにパフォーマンスが少し低下することに注意してください。これにより、非常にアクティブな本番サーバーが簡単に圧倒される可能性があります。
BEFOREスタイルのトリガーを使用する場合、両方のテーブルを高度に同期することが重要な場合は、sqlstateをスローしてソーステーブルへの挿入を防ぐことができることを除いて、BEFOREとAFTERの間に大きな違いはありません。
同期ロジック
これは擬似コードですが...
# new and updated records
INSERT ... ON DUPLICATE KEY UPDATE ...
SELECT FROM source_table
JOIN target_table.id
WHERE target_table.id IS NULL or modified_at > DATE_SUB(NOW(), INTERVAL ..)
# deleted records
上記と同じように、一度に1つのレコードを操作するだけで、トリガーステートメントをミラーリングします。例:ソーステーブルのINSERT TRIGGERは、ターゲットテーブルのINSERTをクエリするだけです。
シンプルですが、レポートデータベース以外にはお勧めしません。テーブル全体を削除し、他のレコードから再構築します。