2016-10-06 7 views
4

を同期、私は2つのMySQL DBテーブルを持っている:「table_original」と「table_copy」ように、2つのMySQL dbテーブル

ここに私の現在の設定です:

毎晩、table_originalは、情報を他のサーバから更新されます。古いdb行を削除するか、一意のpost_idを持つ新しい行を追加します(行が削除されても、2つの同一のpost_idはありません)。

次に、post_idとともに特定の情報がtable_copyにコピーされます。したがって、2つはpost_idによってリンクされています。

これまでのところ、table_originalには〜20,000行があり、table_copyには〜40,000があります。

table_copyが最初のテーブルから更新されていないことに気付きましたが、最初のテーブルから削除されたものを削除する代わりに行を追加しているだけでした。

それらを同期するためには、私の最初のアプローチはpost_idのが存在する場合でない場合は、何もしない、table_copyから行を削除し、その後table_copyに対してtable_originalから各行を確認することでした。

私の懸念は、table_originalが毎晩更新されることです。以前のpost_id行が削除されたり、新しい行が追加されたりする可能性があります。残念ながら、それが完了する前に何が行われているのか分かりません。意味、私はdbが削除され、追加されたかを見るために更新されるまで待たなければならない。

次に、最初のテーブルが更新されるたびに、2番目のテーブルに対してすべての行をチェックして更新する必要があります。テーブルは大きくなり、私はこのアプローチが最善ではないかもしれないと心配しています。

私は何をお勧めしますか?

ありがとうございます! table_originalには存在しないtable_copy内の行を削除するには

+0

"元の"テーブルにトリガーを置いて、別の場所にフラグを設定します。そうすれば、その旗がアップし、あなたはそれを他の場所で検出することができます。あなたの "後処理"をしているとき、あなたはフラグをリセットします。 –

+0

ええと、私があなたがそれの意味を完全に理解しているかどうかはわかりません。しかし、返事に感謝します。もし私がそれについて精緻化することができるかどうかがわかります。ありがとう。 –

答えて

3

DELETE t1.* FROM table_copy AS t1 
LEFT OUTER JOIN table_original AS t2 USING (post_id) 
WHERE t2.post_id IS NULL; 

私は、クエリのこの種を試し、それを使用して信頼性を高めることができるようにあなたは、いくつかの行のダミーテーブルを作成してお勧めしますあなたの実際のデータに対して実行する前に!

マルチテーブルのDELETE文については、http://dev.mysql.com/doc/refman/5.7/en/delete.htmlを参照してください。自動的に毎晩同期でそれらを保つために

、使用がトリガー:

CREATE TRIGGER copy_on_ins AFTER INSERT ON table_original 
FOR EACH ROW 
    INSERT INTO table_copy SET post_id = NEW.post_id, other_columns = NEW.other_column; 

CREATE TRIGGER copy_on_upd AFTER UPDATE ON table_original 
FOR EACH ROW 
    UPDATE table_copy SET other_column = NEW.other_column 
    WHERE post_id = NEW.post_id; 

CREATE TRIGGER copy_on_del AFTER DELETE ON table_original 
FOR EACH ROW 
    DELETE FROM table_copy WHERE post_id = OLD.post_id; 

あなたのコメントを再http://dev.mysql.com/doc/refman/5.7/en/create-trigger.html


を参照してください:

post_idsが削除されたかを知ることは難しいです。あなたがデータベースに残っているpost_idの値の間のギャップを見つけた場合、彼らはかつてあったこと

  • 推論:彼らはもはやデータベースであるので、あなたはどちらかにする必要はありませんでしょう。しかし、これは、挿入が失敗した場合にid値が決して使用されない可能性があるため、保証されません。
  • ログを確認してください。トリガーを使用して監査テーブルに追加するユーザーもいます。または、ログを作成するために投稿を削除するアプリケーションをコーディングします。
  • mysqlbinlogツールを使用して削除イベントを読み取ります。これは一種の進歩です。
+0

ありがとうございます。それほど感謝します! =) –

+0

簡単な質問です。 'post_id'行が削除されたことを知る方法はありますか? (だから私は同じ 'post_id'でファイルの削除などのクリーンアップを行うことができます)ありがとう! –

関連する問題