关闭mysql不安全语句警告

时间:2012-09-05 03:19:02

标签: mysql insert primary-key ignore composite-primary-key

我正在使用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复制。)

2 个答案:

答案 0 :(得分:14)

您可以使用

SET GLOBAL LOG_WARNINGS = 0 

关闭日志记录和

SET GLOBAL LOG_WARNINGS = 1

将其重新打开。我个人的建议是用这些查询包装有问题的查询而不是全局设置,以便你可以跟踪其他查询是否也会导致问题。

请注意,旧版本的MySQL不支持此功能。

答案 1 :(得分:2)

我认为这个问题仍然存在。 使用     set max_error_count=0;     your unsafe queries;     set max_error_count=64;

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