web-dev-qa-db-ja.com

MySQLエラー:バイナリログに書き込むことができません

私は(他の開発会社から継承された)システムを使用していますが、その機能のすべてをまだ知りません。建設:
-Webクライアント/アプリケーション(symfony 1.4)
-DB-MySQL。

プロジェクトは2つのサーバーにデプロイされます。
1-st:nginx server + PHP + DB Master;
2番目:DBスレーブ。

DBマスターでWebクライアントによってデータが変更されると、DBスレーブは適切に機能し、データは通常のレプリケーションプロセスを使用します。 MySQL管理クライアントによってデータが変更されると、通知が届きます。

ステートメントを実行できません:BINLOG_FORMAT = STATEMENTであり、少なくとも1つのテーブルが行ベースのロギングに限定されたストレージエンジンを使用しているため、バイナリログに書き込むことができません。トランザクション分離レベルがREAD COMMITTEDまたはREAD UNCOMMITTEDの場合、InnoDBは行ログに制限されます

その後、DBスレーブが停止し、レプリケーションプロセスが中断します(エラー挿入...重複エントリ...)。

Java application/module(それはトランザクション内で実行されます)でデータを挿入しようとすると、同じテキストで同様の通知が(この状況-エラー)で発生し、例外の後、トランザクションがロールバックし、変更は行われません。

この問題を解決してシステムを機能させ、DBマスターとDBスレーブの修正データを通常モードで機能させるにはどうすればよいですか?

8
Chaki_Black

MySQLがバイナリログへの書き込みに使用できる方法は3つあります。

  1. ステートメント

    つまり、マスター上のすべてのSQLステートメントがログに記録され、スレーブ上で実行されます。これにより、SQLステートメントに「NOW()」、「Rand()」などの非決定的なステートメントが含まれている場合、問題が発生する可能性があります。これには、使用中のストレージエンジンからのサポートも必要です。

  2. これは、ステートメントによって変更されたすべての行が個別にバイナリログに記録されることを意味します。これにより、ステートメントベースのロギングよりも(通常)バイナリログが大きくなりますが、ほとんどの場合、必要な正確なレプリケーションが提供されます。

  3. 混合

    これにより、MySQLは必要に応じてバイナリと行ベースのロギングを選択できます。

このエラーが発生した場合は、BINLOG_FORMAT変数をMIXEDに変更することをお勧めします。これにより、MySQLは必要に応じてROWとSTATEMENTベースのロギングを自動的に切り替えることができます。

18
Phil Sumner