Turnoff mysql unsafe statement warning

2019-09-22 03:17发布

我使用的日志错误警告/错误写入到文件中。 当我执行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的写进程不断上面一遍遍写错误。 (我看不到其他的日志,因为他们fillout整个日志文件...)

首先,我插入(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复制我不能关闭的二进制日志。)

Answer 1:

您可以使用

SET GLOBAL LOG_WARNINGS = 0 

关闭日志记录和

SET GLOBAL LOG_WARNINGS = 1

要打开它。 我个人的建议是包装这些,而不是全局设置其违规查询,以便您可以跟踪如果其他查询造成的问题,以及。

需要注意的是旧版本的MySQL不支持这一点。



Answer 2:

我认为这个问题仍然是开放的。 使用set max_error_count=0; your unsafe queries; set max_error_count=64;

您想查询之前运行它是一个会话变量,所以你不需要是超级用户使用。 不仅,当你调用显示警告限制5没有警告会发出; 但这样的警告不能在MySQL中的日志文件报告。 你也可以在存储过程中使用它。 你知道是不安全的查询后,您可以在此变量放回到其原始值。



文章来源: Turnoff mysql unsafe statement warning