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 回答
2

我认为这个问题仍然悬而未决。利用 set max_error_count=0; your unsafe queries; set max_error_count=64;

在您要运行的查询之前,它是一个会话变量,因此您无需成为超级用户即可使用。不仅,当你调用 show warnings limit 5 时不会发出警告;但此类警告未在 mysql 日志文件中报告。您也可以在存储过程中使用它。在您知道不安全的查询之后,您可以将此变量恢复为其原始值。

于 2017-11-16T13:58:37.887 回答