gpt4 book ai didi

mysql - 警告 不安全语句写入二进制日志 using 语句

转载 作者:行者123 更新时间:2023-11-29 06:15:28 25 4
gpt4 key购买 nike

我已经创建了一个基于触发器的日志系统。
每次插入或更新一行时,触发器都会在另一个表中存储一个新行。

触发器工作正常,但一段时间后我在日志中发现了这条消息:

[警告] 自 BINLOG_FORMAT = STATEMENT 以来,使用语句格式写入二进制日志的不安全语句。语句是不安全的,因为它调用插入到 AUTO_INCREMENT 列中的触发器或存储函数。无法正确记录插入的值。语句:更新 `gl_item` set `is_shown` = '0', `updated_at` = '2016-03-21 16:56:28' where `list_id` = '1' and `is_shown` = '1'

我已经红了一些与我喜欢的问题相关的帖子:
- MySQL Replication & Triggers

但我不明白问题的本质。

这个警告是什么意思?
我不必使用触发器插入自动增量列?
为了避免此警告,创建日志系统的最佳方法是什么?

更新
SHOW CREATE TABLE 的输出,这是触发器将输入 THE 行的表。

gl_item_log | CREATE TABLE `gl_item_log` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Item log unique id',
`item_id` bigint(20) unsigned DEFAULT NULL ,
`updated_by` bigint(20) unsigned DEFAULT NULL ,
`switch_shown` tinyint(4) DEFAULT NULL ,
`switch_checked` tinyint(4) DEFAULT NULL ,
`logged_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`logged_at_microtime` decimal(6,6) unsigned NOT NULL ,
`logged_at_microtime_int` mediumint(8) unsigned NOT NULL DEFAULT '0' ,
PRIMARY KEY (`id`),
KEY `gl_item_log_updated_by_foreign` (`updated_by`),
KEY `gl_item_log_item_id_updated_by_switch_shown_switch_checked_index`
(`item_id`,`updated_by`,`switch_shown`,`switch_checked`),
CONSTRAINT `gl_item_log_item_id_foreign`
FOREIGN KEY (`item_id`) REFERENCES `gl_item` (`id`),
CONSTRAINT `gl_item_log_updated_by_foreign`
FOREIGN KEY (`updated_by`) REFERENCES `gl_general_user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

为了让日志条目没有唯一标识符,删除带有自动递增字段的 id 列是个好主意吗?

谢谢

最佳答案

What this warning mean?

According to the MySQL documentation :

A statement invoking a trigger (or function) that causes an update to an AUTO_INCREMENT column is not replicated correctly using statement-based replication. MySQL 5.7 marks such statements as unsafe. (Bug #45677)

使用 statement-based replication 时,在您的主数据库上运行的确切 SQL 也会在您的从属数据库上运行。当您的触发器被触发时,如果它存在于您的每个数据库中,它将在每个数据库上运行并插入到您的日志中。要让您的数据库保持同步,这可能是一个棘手的情况。

I don't have to insert into auto increment column with triggers?

正确。永远不需要将您自己的值插入到自动增量列中。

Which is the best way to create a log system in order to avoid this warning?

首先,要么在每个数据库上保留触发器并关闭日志表的复制,要么只在主数据库上使用触发器并让复制将日志表插入复制到其他数据库。

要解决此特定警告,请将您的日志表配置为没有自动递增列。然后您的触发器可以插入其中,并且它不应导致任何复制警告。

另一种选择是切换到基于行的复制。然后触发器只会在主服务器上自动触发,自动增量值将始终毫无问题地复制。

关于mysql - 警告 不安全语句写入二进制日志 using 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36137746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com