Mysql 在不写入二进制日志的情况下运行触发器

Mysql 在不写入二进制日志的情况下运行触发器,mysql,triggers,binary-log,Mysql,Triggers,Binary Log,我试图通过触发器或存储过程将行插入表中,而不将任何数据写入二进制日志。这可能吗?我知道,对于正常连接,您可以设置SQL\u LOG\u BIN=0来禁用连接的二进制日志记录,但我还无法让它对触发器起作用。如果有一种方法可以通过联邦引擎表实现这一点,那也没问题 编辑: 我几乎可以通过一个存储过程来实现这一点: CREATE PROCEDURE nolog_insert(`id` INT, `data` blob) BEGIN SET SESSION SQL_LOG_BIN = 0; INS

我试图通过触发器或存储过程将行插入表中,而不将任何数据写入二进制日志。这可能吗?我知道,对于正常连接,您可以设置
SQL\u LOG\u 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')
被插入
表中,但不会写入二进制日志

但是,我想从触发器运行此过程。使用触发器时,如下所示:

create trigger my_trigger before insert on blackhole_table for each row call nolog_insert(new.id, new.data);

数据同时插入到
表中,并写入二进制日志。

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


除此之外,,不允许在事务内部更改
sql\u log\u bin
,因此我要说的是,在使用基于行的复制时,如果在主服务器和从服务器上都执行基于语句的复制触发器,则没有好的方法使触发器复制但没有复制。也许这可以解决你的问题


除此之外,不允许在事务内部更改
sql\u log\u bin
,因此我想说,在使用基于行的复制时,没有好方法使触发器的效果不被复制

您知道,大多数DBMS在事务回滚时使用日志跟踪更改,如果您不写入日志,但出现故障,您就破坏了回滚功能?我不确定这是否适用于MySQL,但这是IMO需要关注的问题。是的,我知道其中的含义。它由MyISAM支持,并且无论如何都不会使用事务。插入不应该失败。(存储过程被用作系统的一部分,以克服MySQL复制的限制。)问题不仅仅在于插入失败。它是在事务期间围绕insert进行的任何操作(例如,事务开始和故障点之间的任何操作都无法恢复,因为事务完整性已受到损害)。您现在可能不使用事务,但如果将来事务发生变化,而您错过了更改触发器,该怎么办?数据存储作为一个整体被用作单个表键值存储。我们不太可能需要MySQL级别的事务。我使用数据库复制,如果我通过连接到其他数据库对数据库进行更改,这些更改不会复制。为此,我只需在查询中引用database.table。对我来说,这好像是一只虫子。Marc您知道大多数DBMS使用日志来跟踪事务回滚时的更改,如果您不写入日志而出现故障,您就破坏了回滚功能?我不确定这是否适用于MySQL,但这是IMO需要关注的问题。是的,我知道其中的含义。它由MyISAM支持,并且无论如何都不会使用事务。插入不应该失败。(存储过程被用作系统的一部分,以克服MySQL复制的限制。)问题不仅仅在于插入失败。它是在事务期间围绕insert进行的任何操作(例如,事务开始和故障点之间的任何操作都无法恢复,因为事务完整性已受到损害)。您现在可能不使用事务,但如果将来事务发生变化,而您错过了更改触发器,该怎么办?数据存储作为一个整体被用作单个表键值存储。我们不太可能需要MySQL级别的事务。我使用数据库复制,如果我通过连接到其他数据库对数据库进行更改,这些更改不会复制。为此,我只需在查询中引用database.table。对我来说,这好像是一只虫子。马克