你需要mysql数据库slave上的触发器吗?

时间:2009-10-14 15:08:28

标签: mysql replication

假设您正在运行两个mysql服务器:一个是主服务器,另一个是从服务器。主服务器具有触发器集,用于使用其他表中行数的COUNT来更新列。例如,您有一个新闻表和一个评论表。新闻包含一个名为“total_comments”的INT列,每当​​新行被放入“注释”时,该列就会通过触发器递增。奴隶是否也需要此触发器(以使“news.total_comments”更新)或是否会被告知直接更新相应的“news.total_comments”?

3 个答案:

答案 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';

---------------------------------------------------------------------------------------