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


8

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

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

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

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

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

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

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

回答:


18

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

  1. ステートメント

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

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

  3. 混合

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

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


正しい!優秀な!
Chaki_Black

4
素晴らしい提案ですが、BINLOG_FORMATをどのように変更しますか?
Trebor Rude 2015

2
非常に遅いかもしれませんが、BINLOG_FORMATdba.stackexchange.com /questions
Vivek Dhayalan

Trebor Rude:これについて詳しく説明しているmysqlのドキュメントをお読みください。dev.mysql.com/doc/refman/5.6/en/...
Lifeboy

この回答は問題の解決に役立ちます。ありがとう!
Tung
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.