【发布时间】:2012-04-03 12:01:28
【问题描述】:
我正在尝试通过触发器或存储过程将行插入表中,而不将任何数据写入二进制日志。这可能吗?我知道对于正常连接,您可以设置SQL_LOG_BIN=0 以禁用连接的二进制日志记录,但我无法让它对触发器起作用。如果有办法使用联合引擎表执行此操作,那也可以。
编辑:
我几乎可以通过存储过程来实现这一点:
CREATE PROCEDURE nolog_insert(`id` INT, `data` blob)
BEGIN
SET SESSION SQL_LOG_BIN = 0;
INSERT INTO `table` (`id`, `data`) VALUES (id, data);
SET SESSION SQL_LOG_BIN = 1;
END
我通过在 mysql 提示符下调用过程来插入一条记录:
call nolog_insert(50, 'notlogged');
正如预期的那样,记录(50, 'notlogged')被插入到table中,但没有写入二进制日志。
但是,我想从触发器运行此过程。使用触发器时如下:
create trigger my_trigger before insert on blackhole_table for each row call nolog_insert(new.id, new.data);
数据同时插入table并写入二进制日志。
【问题讨论】:
-
您知道大多数 DBMS 使用日志来跟踪更改以防事务回滚,如果您不写入日志并且发生故障,您是否破坏了回滚功能?我不确定这是否适用于 MySQL,但 IMO 需要关注这一点。
-
是的,我知道其中的含义。它由 MyISAM 支持,并且无论如何都不会使用事务。插入不应该失败。 (存储过程被用作系统的一部分来解决 MySQL 复制的限制。)
-
问题不仅在于插入失败。它是事务期间围绕插入的任何操作(IOW,事务开始和故障点之间的任何操作都无法恢复,因为事务完整性已受到损害)。您现在可能不使用事务,但如果将来发生变化而您错过了更改触发器怎么办?
-
整个数据存储被用作单个表键值存储。我们不太可能需要 MySQL 级别的事务。
-
我使用数据库复制,如果我通过与不同数据库的连接对数据库进行更改,则更改不会复制。为此,我只需在查询中引用 database.table。这对我来说似乎是一个错误。马克
标签: mysql triggers binary-log