仅在从机上触发

问题描述 投票:0回答:1

我正在尝试在从属服务器上为RBR(https://mariadb.com/kb/en/library/running-triggers-on-the-slave-for-row-based-events/)运行触发器。我已经像这样在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事件;错误代码:1442;无法更新存储函数/触发器中的表't1',因为调用该存储函数/触发器的语句已使用该表。处理程序错误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中没有数据。我该如何解决?

mysql database mariadb
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.