2012-09-05 18 views
7

ファイルに警告/エラーを書き込むためにlog-errorを使用しています。 INSERT IGNORE..SELECT文を実行すると、この警告メッセージを書き続けるだけです。ターンオフmysql安全でないステートメントの警告

120905 3:01:23 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. INSERT IGNORE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave. 

私は、上記のエラーを繰り返し書き続けることをmysqlログライターが止めたいと思っています。 (私はログファイル全体を埋めるので、他のログは見えません...)

まず、(a、b、c)をテーブルに挿入します。 cは表内で一意でなければならず、a、bは選択に使用されます。クエリは、この

SELECT c FROM table WHERE a=value1 AND value2<b AND b<value3 

のようになりますそして、私のINSERTクエリは

INSERT IGNORE INTO table VALUES (,,),(,,)...(,,) 

私は警告を生成しないようにクエリを変更することができると思ったが、私のデータは一意のフィールドが含まれていると私が提出していることを保証する必要がありますテーブル内でユニークです。 500〜2000行は数秒ごとに挿入する必要があるので、一括挿入する必要があります。

すでに数十万行が挿入されていて、数秒で別の2000行を挿入する必要がある場合。ログファイルに警告を書き込まずにテーブルに安全に挿入するにはどうすればよいですか?

(私はMySQLのレプリケーションを使用する必要があるので、私はバイナリログをオフにすることはできません。)

+0

テーブルを複製していますか?このエラーが発生した場合は重要です。 –

+0

はい、私はバックアップのために、スケーラビリティの理由のためにmysqlレプリケーションを使用しています – user1640242

+0

それでは、あなたはエラーメッセージを読んだことがありますか? – zerkms

答えて

13

あなたはロギングをオフにする

SET GLOBAL LOG_WARNINGS = 0 

を使用しての

SET GLOBAL LOG_WARNINGS = 1 

することができますそれを元に戻す。私の個人的な提案は、グローバルに設定するのではなく、違反しているクエリをラップして、他のクエリで問題が発生しているかどうかを追跡できるようにすることです。

古いバージョンのMySQLではこれがサポートされていないことに注意してください。

+2

グローバル変数として、これはデータベースに接続されているすべてのセッションの警告をオフにします。 – rjh

+0

MySQL 5.6.4以降、この変数はGLOBALとしてのみ定義されています。 – BoraMa

0

この質問はまだ開いていると思います。 使用あなたがそれを実行したいクエリの前に set max_error_count=0; your unsafe queries; set max_error_count=64;

は、セッション変数であるので、あなたが使用するスーパーユーザーである必要はありません。あなたはshow warnings limit 5を呼び出すと、警告は出されません。そのような警告はmysqlログファイルには報告されません。 ストアドプロシージャでも使用できます。クエリが安全でないことがわかったら、この変数を元の値に戻すことができます。

関連する問題