【问题标题】:Create Trigger does not replicate in mysql创建触发器不会在 mysql 中复制
【发布时间】:2015-06-18 05:00:43
【问题描述】:

我们在主库中创建了一个触发器,但该触发器没有出现在从库中。

以下是创建触发器的示例:

CREATE TRIGGER filter_pos_transaction_delivery_combo_details BEFORE INSERT ON `pos-transaction_delivery_combo_details`
for each row
begin
    DECLARE msg VARCHAR(200);
    SET @store_code = (SELECT value FROM `admin-settings` WHERE attribute = 'local_store_code' LIMIT 1);

    if STRCMP(new.store_code,@store_code) != 0 then
        if STRCMP( @store_code,'MAINDB') != 0 then
            set msg = "SKIPPING INSERTION: THIS DATA IS NOT FOR THIS LOCAL DB - pos-transaction_delivery_combo_details ";
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
        end if;
    end if;
end;

这里是cnf配置:

[mysqld]
user                        = mysql
port                        = 3306
datadir                     = /data/mysql/
pid-file                    = /data/mysql/fusion-maindb.pid
socket                      = /data/mysql/fusion-maindb.sock
log_error                   = /datalog/mysql_error_log/mysql_error.log

## Replication and Logging Settings ###
server_id                   = 11111111
log_bin                     = /datalog/rep_binlogs/maindb-bin.log
binlog_do_db                = fusion
replicate_do_db             = fusion
max_binlog_size             = 1000M
slave-skip-errors           = 1644,1007,1062,1449,1146,1062
innodb_buffer_pool_size     = 8000M
log_slave_updates           = 1
skip-external-locking
sync_binlog                 = 1
slave_net_timeout           = 60
innodb_lock_wait_timeout    = 120
binlog_format               = STATEMENT
slave_compressed_protocol   = 1
wait_timeout                = 300
interactive_timeout         = 300

【问题讨论】:

  • 显示您尝试过的内容?
  • 分享您的 mysql 版本和配置文件 my.cnf 或 my.ini 以及您如何在 master 上执行触发器创建语句。
  • 我们使用的是 MySQL 5.6

标签: mysql triggers replication


【解决方案1】:

检查你的二进制日志格式:

使用基于语句的复制时,从属服务器上的触发器由在主服务器上执行的语句执行(并复制到从属服务器)。

使用基于行的复制时,由于在主服务器上运行然后复制到从服务器的语句,触发器不会在从服务器上执行。相反,当使用基于行的复制时,在主服务器上执行触发器引起的更改会应用到从服务器上。

【讨论】:

  • 但是触发器没有显示在从站上。触发器仅在主数据库中创建。
  • 是的,这意味着您正在使用基于混合的复制...在这种情况下,由 master 上的触发器创建的命令被复制到 slave 而不是触发器本身。所以您的数据是最新的,不用担心在那..触发器没有在slave中运行,只有master上触发器所做的更改被复制..
  • 但是如果我们需要从库中的触发器,我们需要在从库中手动创建触发器吗?
  • 是的,您需要手动创建,但这会导致数据不一致。因为主服务器将主服务器上的触发器创建的命令复制到从服务器,然后从触发器再次执行该命令..
  • 如果我们使用触发器来确认数据是否应该基于从站的表复制到从站?
猜你喜欢
  • 1970-01-01
  • 2013-05-30
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 2011-02-03
  • 2016-09-19
  • 2016-01-09
相关资源
最近更新 更多