web-dev-qa-db-ja.com

実行時にバイナリログ形式を切り替える最も安全な方法は何ですか?

mysqld.logの次の警告のため:

[警告] BINLOG_FORMAT = STATEMENTなので、ステートメント形式を使用して安全でないステートメントがバイナリログに書き込まれました。このステートメントはLIMIT句を使用しているため安全ではありません。含まれる行のセットは予測できないため、これは安全ではありません。

レプリケーション形式をMIXEDに切り替えます。

しかし、MySQLドキュメントによると:

一時テーブルが存在する場合、実行時にレプリケーション形式を切り替えることはお勧めしません。一時テーブルはステートメントベースのレプリケーションを使用する場合にのみログに記録されますが、行ベースのレプリケーションではログに記録されないためです。

それで、問題は、バイナリログ形式を安全に切り替えるための一時テーブルが存在するかどうかをどのようにして特定できるでしょうか?

25
quanta

Binlogには特定のフォーマットが設定されているため、MySQL(Oracleはまだ私の舌を転がすことはできません)がこの機能を構築していますが、2つのフォーマットを一緒にギャンブルしないこともできます。

Mysqlを再起動せずに完全に安全に再生するには、以下を試してください。

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

これにより、最後のバイナリログが「MIXED」形式のままになります。最後から2番目のbinlogが存在するのは、以前の形式であった最後のbinlogを閉じるだけです。

最初のFLUSH LOGS;より前の既存のセッションはすべて、UNLOCK TABLES;が実行されると、最後のバイナリログへの書き込みを開始します。

試してみる !!!

警告

クレジットの期限が来るところにクレジットを与えると、私の答えは本当に @ Jonathanの答え の便乗です。その上でbinlogを閉じたり開いたりします。彼はこれを最初に持ってくると+1を得る。

UPDATE 2011-10-12 13:58 EDT

これをアクティブなマスターに対して実行し、そのマスターから複製するスレーブが1つ以上ある場合は、リレーログが新しい形式であることも考慮する必要があります。これがあなたができることです:

スレーブでSTOP SLAVE;を実行します

マスターでこれらを実行します:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

スレーブでSTART SLAVE;を実行します

STOP SLAVE;START SLAVE;を実行すると、リレーログがローテーションされ、新しいエントリがどの形式でも複製されます。 binlog_formatの変更をスレーブにも適用したい場合があります。

35
RolandoMySQLDBA

実行時にbinlog_formatを切り替えるには、次のようにします。

set global binlog_format = 'MIXED';

これにより、すべての新しいセッションが混合バイナリログ形式に設定されます。既存のセッションはすべて、終了するまで以前に設定されたものになります。

set session binlog_format = 'MIXED';手動でセッション固有の問題を解決します。

6
Jonathan