我确实有一个MySQL Master-Slave数据库和从属端的进程,它监听Slave DB的最新更新并采取相应的措施。我还在slave端写了一个触发器来更新另一个表(进程正在监听)。
delimiter #
CREATE TRIGGER on_insert AFTER INSERT ON test
FOR EACH ROW
BEGIN
INSERT INTO Ins_table
VALUES(NEW.firstname, NEW.id);
end#
delimiter ;
我在Slave服务器上插入了触发器(而不是在Master上,因为我使用的是基于行的复制)。该过程每10秒检查一次“Ins_table”以获取新记录。复制完全正常。但是,从属端的触发器永远不会起作用。 我已在单独的数据库中测试了上述触发器(没有复制),并且它没有任何问题。在插入在基于行的主从复制的从属端无法正常工作之后,能帮助我理解触发的原因吗?
答案 0 :(得分:1)
这是基于行的复制的预期行为,请参阅mysql documentation
复制和触发器
使用基于语句的复制,在主服务器上执行的触发器也在从服务器上执行。对于基于行的复制,在主服务器上执行的触发器不会在从服务器上执行。相反,由触发器执行产生的主服务器上的行更改将被复制并应用于从服务器。
此行为是设计使然。如果在基于行的复制下,从属设备应用了触发器以及由它们引起的行更改,则实际上这些更改将在从设备上应用两次,从而导致主设备和从设备上的不同数据。
如果要在主服务器和从服务器上执行触发器 - 可能是因为主服务器和从服务器上有不同的触发器 - 您必须使用基于语句的复制。但是,要启用从属端触发器,不必专门使用基于语句的复制。只对那些需要此效果的语句切换到基于语句的复制,并在其余时间使用基于行的复制就足够了。
答案 1 :(得分:1)
请注意,特别是在 MariaDB 中,可以通过启用slave_run_triggers_for_rbr
在基于行的复制事件上运行触发器。关于@ https://mariadb.com/kb/en/mariadb/running-triggers-on-the-slave-for-row-based-events/
答案 2 :(得分:0)
如果可以选择在从属服务器中更改复制类型,则可以在从属服务器中使用混合,而在主服务器中使用行。使用混合类型将在从站中调用触发器。