项目上有一个mysql主从,是将过个master同步到一个slave上.所以会使用到
--replicate-rewrite-db=old_name->new_name
修改数据库名称.
前期配置好以后,同步数据正常,一切参数也很正常.知道有一次修改了master上一个表的结构.发现,表的结构并没有同步到slave上.然后就开启了排除问题的道路.
一 ,期初以为是主从同步异常了,然后通过名称
show slave status;
发现状态都是正常
二, 查看binlog日志
通过命令
how binlog events;
show binlog events in 'mysql-bin.000002';
查看master上binlog日志,找到修改表结构时,记录下来的日志记录.
在查看slave上,记录的日志
show RELAYLOG EVENTS;
show RELAYLOG events in 'mysql-bin.000002';
也找到了表修改结构执行的语句.
这个就尴尬了......
查看执行的语句,发现有这么一句
use `ylzx_purchase_order`; ALTER TABLE `ylzx_purchase_order`.`p_order_check`
MODIFY COLUMN `djzq` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '描述' AFTER `enter_id`
前面有一句 use '库名';这是进库的操作,但因为我是将多个数据源同步到一个地方,所以使用--replicate-rewrite-db=old_name->new_name 将原始库名修改为了新的库名,但这里执行的语句,使用的是原始库名.感觉像是找到了问题所在.但转念一下,不对啊.其他更新也是正常的,为什么这个就不行,抱着试一试的想法,我更新了一条数据来看具体的执行语句.
悲催的发现,更新数据时,也是带的原始库名称,虽然没有进库的操作语句,但不能证明是这个的进库操作导致的同步失败,因为没有办法绕过这个进库操作.无奈之下又开始找其他原因.
三,从官网上找问题
后来实在没有办法.想到去看看官网上市如何解释 --replicate-rewrite-db=old_name->new_name配置项用法的,结果还真有这么一句话.
翻译过来就是
--replicate-rewrite-db=old_name->new_name这个配置项,在替换库名时,只对部分语句起作用,像如 CREATE ,DROP,ALTER DATABASE这类语句,是不起作用的.所以在执行时,不会去替换为配置的新库名执行.所以导致同步失败了.