【问题标题】:Turnoff mysql unsafe statement warning关闭 mysql 不安全语句警告
【发布时间】:2012-09-05 03:19:02
【问题描述】:

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

【问题讨论】:

  • 您是否在复制表 - 因为如果您这样做,此错误很严重。
  • 是的,我正在使用 mysql 复制来进行备份和可扩展性原因
  • 那么你有没有阅读错误信息呢?

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


【解决方案1】:

你可以使用

SET GLOBAL LOG_WARNINGS = 0 

关闭日志记录和

SET GLOBAL LOG_WARNINGS = 1

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

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

【讨论】:

  • 作为全局变量,这会关闭所有连接到数据库的会话的警告,对吧?
  • 从 MySQL 5.6.4 开始,这个变量只定义为 GLOBAL。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-02-28
    • 1970-01-01
    • 2016-07-08
    • 2014-01-22
    • 2017-11-08
    • 2020-09-09
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多