假设您正在运行两个mysql服务器:一个是主服务器,另一个是从服务器。主服务器具有触发器集,用于使用其他表中行数的COUNT来更新列。例如,您有一个新闻表和一个评论表。新闻包含一个名为“total_comments
”的INT列,每当新行被放入“注释”时,该列就会通过触发器递增。奴隶是否也需要此触发器(以使“news.total_comments
”更新)或是否会被告知直接更新相应的“news.total_comments
”?
答案 0 :(得分:3)
来自文档http://dev.mysql.com/doc/refman/5.0/en/faqs-triggers.html:
22.5.4:如何通过主人的触发器进行动作 复制到奴隶?首先, 必须在主服务器上存在的触发器 在从属服务器上重新创建。 完成后,复制 flow可以像任何其他标准DML一样工作 参与的声明 复制。例如,考虑一个 表格具有AFTER插入的EMP 触发器,存在于主设备上 MySQL服务器。相同的EMP表和 AFTER插入触发器存在于 奴隶服务器也是如此。复制 流程将是:INSERT语句是 向EMP提出。 EMP上的AFTER触发器 激活。 INSERT语句是 写入二进制日志。该 复制slave获取INSERT 对EMP的声明并执行它。该 EMP上的AFTER触发器存在于 奴隶激活。
和
22.5.4通过主人的触发器执行的动作不是 复制到从属服务器。
因此,你需要奴隶上的触发器。
答案 1 :(得分:2)
这取决于您正在使用的复制。如果使用基于语句的复制,则必须在主服务器和从服务器中使用匹配的触发器。如果使用基于行的复制,则必须不在从属上包含触发器。
答案 2 :(得分:1)
通过添加具有本地连接的相同表,您可以使用联合表(MySQL5)在二进制日志中使用触发器发出请求的操作。
---------------------------------------------------------------------------------------
-- EXEMPLE :
-- We want install a replication of the table test_table that will be managed by Trg_Update triggers.
---------------------------------------------------------------------------------------
Create database TEST;
USE TEST;
CREATE TABLE test_trigger (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL DEFAULT '',
PRIMARY KEY (id),
INDEX name (name),
) ;
DELIMITER |
CREATE TRIGGER Trg_Update AFTER INSERT ON test_trigger
FOR EACH ROW BEGIN
INSERT INTO federated_table (name, other) values (NEW.name, ‘test trigger on federated table -> OK’)
END|
DELIMITER ;
CREATE TABLE test_table (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL DEFAULT '',
other VARCHAR(32) NOT NULL DEFAULT '',
PRIMARY KEY (id),
INDEX name (name),
INDEX other_key (other)
) ;
CREATE TABLE federated_table (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL DEFAULT '',
other VARCHAR(32) NOT NULL DEFAULT '',
PRIMARY KEY (id),
INDEX name (name),
INDEX other_key (other)
)
ENGINE=FEDERATED
CONNECTION='mysql://root@localhost/TEST/test_table';
---------------------------------------------------------------------------------------