2

わかりました、単一のマスターと多数のスレーブでセットアップを実行しています。すべての書き込みはマスターを経由し、厳密に読み取り専用に使用されるスレーブに複製されます。

これで、挿入のトリガーによって呼び出されるストアド プロシージャ (関数ではない) ができました。MySQLのドキュメントによると、レプリケーショントリガーはトリガーへの呼び出しをログに記録し、ストアドプロシージャは実際にストアドプロシージャの結果をログに記録します。

私の質問は、トリガーが起動されたときに、トリガーとトリガーが呼び出すプロシージャの結果の両方を複製するかどうかです (その結果、プロシージャが実質的に 2 回実行されます)。それとも、単にトリガーを複製して、スレーブにストアド プロシージャを独自に再実行させるのでしょうか?

ありがとう

4

2 に答える 2

6

MySQL 5.0(およびステートメントベースのバイナリログを使用するMySQL 5.1)では、呼び出し元のクエリのみがログに記録されるため、この場合、INSERTがログに記録されます。

スレーブでは、INSERTが実行されてから、スレーブでトリガーが再実行されます。したがって、トリガーはスレーブに存在する必要があり、存在すると仮定すると、マスターとまったく同じ方法で実行されます。

MySQL 5.1には、変更された行のみをログに記録する行ベースのバイナリロギングがあるため、トリガーはスレーブで再起動されませんが、変更されたすべての行は引き続き伝播されます。

于 2008-09-18T16:13:24.970 に答える
0

ハリソンの優れた答えに加えて:

  • そもそもデータベースが同期している(スキーマ、データ、同じバージョン)と仮定すると、正常に機能するはずです。
  • そうでない場合は、クエリまたはトリガーで非決定論的なものを使用している可能性があります。それを修正します。
  • レプリケーションの使用方法に関係なく、スレーブが常に同期していることを確認するための監視が必要です。監視しないと、それらは(微妙に)同期しなくなり、気付かないでしょう。MySQLには、これをチェックまたは修正するための自動組み込み機能がありません。
于 2008-09-18T19:00:48.560 に答える