質問

MySQL 5.0.45 でいくつかのデータベースを実行しており、両方を並行して実行できるように、レガシー データベースを改訂されたスキーマと同期させようとしています。新しいデータベースにトリガーを追加してこれを行っていますが、レプリケーションで問題が発生しています。私の設定は次のとおりです。

サーバー「マスター」

  • データベース「legacydb」はサーバー「スレーブ」にレプリケートされます。
  • データベース「newdb」には「legacydb」を更新するトリガーがあり、レプリケーションはありません。

サーバー「スレーブ」

  • データベース「legacydb」

「newdb」への更新は正常に実行され、トリガーが作動しました。「マスター」サーバー上の「legacydb」を更新します。ただし、変更はスレーブには複製されません。MySQL のドキュメントには、簡単にするためにレプリケーションでは現在のデータベース コンテキストが参照されると記載されています (例: "SELECT DATABASE();" ) クエリの結果を見るのではなく、どのクエリを複製するかを決定するときに使用します。私のトリガーはデータベース「newdb」のコンテキストから実行されるため、レプリケーションは更新を無視します。

update ステートメントを「legacydb」のストアド プロシージャに移動してみました。これはうまく機能します(つまり、「マスター」に接続して手動で実行すると、データはスレーブに複製されます) "USE newdb; CALL legacydb.do_update('Foobar', 1, 2, 3, 4);". 。ただし、このプロシージャがトリガーから呼び出された場合、複製されません。

これまでのところ、これを修正する方法についての私の考えは次のいずれかです。

  • トリガーに強制的に新しい現在のデータベースを設定させます。これが一番簡単でしょうが、それは不可能だと思います。これは、ストアド プロシージャで達成したいと考えていたものです。

  • 両方のデータベースをレプリケートし、マスターとスレーブの両方にトリガーを持ちます。これは可能ですが、設定が面倒です。

  • 現在のデータベース コンテキストに関係なく、レプリケーションで「legacydb」へのすべての変更を強制的に取得します。

  • レプリケーションの実行レベルが高すぎると、トリガーによって実行される更新がまったく表示されなくなります。その場合、どれだけハッキングしても目的の結果は得られません。

これを達成する方法についてのアドバイスをいただければ幸いです。

役に立ちましたか?

解決

これはそれと関係があるかもしれません:

ストアド関数は、ステートメントの実行順序とログに表示されるタイミングの不一致によるバイナリ ログの不整合を避けるために、実行前にテーブル ロックを取得します。関数内で実行されるステートメントではなく、関数を呼び出すステートメントが記録されます。したがって、同じ基になるテーブルを更新するストアド関数は並行して実行されません。

対照的に、ストアド プロシージャはテーブル レベルのロックを取得しません。ストアド プロシージャ内で実行されるすべてのステートメントはバイナリ ログに書き込まれます。

さらに、トリガーに関する問題のリストがすべてあります。http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top