sql >> データベース >  >> RDS >> Mysql

異なるサーバーで実行されている異なるデータベース(MYSQL)の2つのテーブル間でデータを同期する方法

    まず第一に、あなたたちの誰もがこの男の質問に答えないのはなぜですか?セキュリティ制限/コンプライアンス/レガシーシステムのために、これを行わなければならない場合があります。

    ここで擬似コードを使用して作成するオプションがいくつかあります。データベースがどの程度リアルタイムであるかわからないため、すべての場合に機能するとは限りません。

    要件

    これが機能するには、データベースが同じサーバーインスタンスにある必要があります。そうでない場合は、リモートデータにアクセスするためにフェデレーションストレージエンジンをセットアップする必要があります。別の人が述べたように、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をクエリするだけです。

    シンプルですが、レポートデータベース以外にはお勧めしません。テーブル全体を削除し、他のレコードから再構築します。



    1. Mysql-パーセンテージによる制限?

    2. 複数の左結合を使用したMySQLクエリの最適化

    3. date_subから週末をどのように除外しますか?

    4. PHP変数を使用してMySQLテーブルを作成します