2012-09-05 125 views
7

我正在使用日誌錯誤將警告/錯誤寫入文件。當我執行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 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;

要運行它是一個會話變量查詢之前,所以你不需要是超級用戶使用。不僅如此,當您撥打顯示警告限制5時不會發出警告;但是這種警告不是在mysql日誌文件中報告的。 你也可以在存儲過程中使用它。在你的查詢之後你知道這是不安全的,你可以把這個變量放回原來的值。