MySQL主从同步和触发器实践一则

05 Jan 2014

场景

在做充值数据库同步的时候, 在从库的充值表上加上了INSERT和UPDATE触发器, 用于记录更新的充值记录. 经测试发现从库上只有INSERT触发器执行了, 而UPDATE触发器没有被执行.

分析

触发器只有在相关SQL语句被执行的时候才会被触发, 在行同步模式(RBR)下不会被触发, 所以为了保证从库上添加的触发器能够被顺利执行, 我们需要主从同步是通过SBR执行的.

数据库主从是混合模式同步(MIXED), 也就是说默认情况下是基于语句同步的(SBR), 只有在特殊条件下切换成RBR. 因此定位问题是UPDATE的时候同步自动切成了RBR.

看MySQL的文档, 对MIX模式下切换成RBR的几种场景逐一排除.

初步怀疑是AUTO_INCREMENT字段导致的, 测试后发现其实没有影响.

最终从主库执行的语句上下手, 定位到了问题, UPDATE是这样做的:

UPDATE ... WHERE PayNum=XXX LIMIT 1;

MySQL在MIXED模式下含有LIMIT语句会切成RBR模式同步.

暴露的问题:

解决办法

参考

HOME