7

log-error を使用して、警告/エラーをファイルに書き込みます。INSERT IGNORE..SELECT ステートメントを実行すると、この警告メッセージが表示され続けます。

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 logwriter が上記のエラーを何度も書き続けるのを止めたいです。(ログファイル全体を埋めるため、他のログは表示されません...)

まず、(a, b, c) をテーブルに挿入します。c はテーブル内で一意である必要があり、a、b は選択に使用されます。クエリは次のようになります

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

そして私の挿入クエリは

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

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

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

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

4

2 に答える 2

16

使用できます

SET GLOBAL LOG_WARNINGS = 0 

ロギングをオフにし、

SET GLOBAL LOG_WARNINGS = 1

オンに戻します。私の個人的な提案は、問題のあるクエリをグローバルに設定するのではなく、これらでラップして、他のクエリも問題を引き起こしているかどうかを追跡できるようにすることです。

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

于 2013-01-14T19:45:44.540 に答える