仅在从站上触发

时间:2018-02-23 13:47:33

标签: mysql database mariadb

我正在尝试为RBR(https://mariadb.com/kb/en/library/running-triggers-on-the-slave-for-row-based-events/)在slave上运行触发器。 我已经像这样在master上创建了一个表:

CREATE TABLE `t1` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `mobile` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在奴隶上,我有这个触发器:

CREATE TRIGGER t1_obfus AFTER INSERT ON `t1`
FOR EACH ROW
UPDATE `t1`
SET `mobile` = LEFT(MD5(NEW.`mobile`), 20);

哪个不起作用。我在SHOW SLAVE STATUS上收到了以下错误:

  

Last_SQL_Error:无法在表d1.t1上执行Write_rows_v1事件;无法更新表格' t1'在存储函数/触发器中,因为它已被调用此存储函数/触发器的语句使用。,Error_code:1442;处理程序错误HA_ERR_GENERIC;事件的主日志mariadb-bin.000004,end_log_pos 454

然后我将触发器修改为:

CREATE TRIGGER t1_obfus BEFORE INSERT ON `t1`
FOR EACH ROW
UPDATE `t1`
SET NEW.`mobile` = LEFT(MD5(NEW.`mobile`), 20)
WHERE id = NEW.id;

但它仍然无效。然后我在奴隶上创建了一个新表:

CREATE TABLE t1_2 (
    id BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    mobile VARCHAR(20)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

并将我的触发器修改为:

CREATE TRIGGER t1_obfus BEFORE INSERT ON `t1_2`
FOR EACH ROW
INSERT INTO `t1_2` (id, mobile)
VALUES (NEW.id,LEFT(MD5(NEW.`mobile`), 20));

现在复制开始工作,但表t1_2中没有数据。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果您使用基于行的复制,则从属服务器上的触发器将不起作用。 如official documentation中所述:

Blockquote 如果希望触发器同时在主服务器和从服务器上执行(可能是因为在主服务器和从服务器上具有不同的触发器),则必须使用基于语句的复制。但是,要启用从属端触发器,不必专门使用基于语句的复制。仅对需要这种效果的那些语句切换到基于语句的复制就足够了,并在其余时间使用基于行的复制。