【问题标题】:run trigger without writing to binary log运行触发器而不写入二进制日志
【发布时间】: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


【解决方案1】:

如果您运行基于语句的复制,则触发器会在主服务器和从服务器上执行,但不会被复制。也许这可以解决您的问题。

除此之外,不允许在事务中更改sql_log_bin,所以我想说,使用 row 时没有很好的方法来复制触发器 not 的效果基于复制

【讨论】:

    猜你喜欢
    • 2011-02-26
    • 2017-01-20
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2014-09-11
    • 2020-03-30
    相关资源
    最近更新 更多