mysql replicate函数_【MySQL】主从复制参数“--replicate-do-*”请谨慎使用

近日一朋友发了一个问题,大致的描述情况如下:我主库加了字段为啥从库没有添加呢?

看到朋友的问题,第一想法就是,是不是从库配置了“--replicate-do-”类似的参数呢,通过确认,果不其然。配置了“--replicate-do-db”和“--replicate-do-talbe”参数。那么原因很简单,执行alter 的时候不在当前库了。所以,对于“--replicate-do-” 此类的参数来讲慎用,如果要用,一定要注意语句,一定要在当前库的环境下执行。

如果不想修改语句的话,是不是就没有办法解决呢?结果肯定是不是。如果要跨裤操作语句还要求同步的话,就需要“--replicate-wild-do-table”来了,跨库操作没有问题。但是它也有他的局限于,不能用于stored procedures and functions, or events。详细的参数介绍,可以参考官网:https://dev.mysql.com/doc/refman/5.7/en/replication-options-slave.html#option_mysqld_replicate-wild-do-table

字段的问题,本以为这就解决了。没想到还有问题,为啥从库没有字段,主从复制还不报错呢?

主库表结构不一致,但是从库不报错,我也是第一次碰到。话不多话,赶紧找机器去测试验证下:

Master表结构:CREATE TABLE `t` (

`id` int(11) DEFAULT NULL,

`name` char(4) DEFAULT NULL,

`phone` int(11) DEFAULT NULL,

`address` char(6) DEFAULT NULL

) ENGINE=InnoDB

Slave表结构(Master的基础上删除最后一列):alter table t drop column address;

Query OK, 0 rows affected (0.51 sec)

Records: 0 Duplicates: 0 Warnings: 0

Master操作:mysql> insert into t(id,name,phone,address) values(1,'abcd',123456789,'hahah');

Query OK, 1 row affected (0.05 sec)

Slave查看数据:mysql> select * from t ;

+------+------+-----------+

| id | name | phone |

+------+------+-----------+

| 1 | abcd | 123456789 |

+------+------+-----------+

1 row in set (0.01 sec)

???很奇怪吧?尽然从库插入成功了,把末尾的col数据丢弃了。我们继续操作

Slave删除字段name:mysql> alter table t drop column name;

Query OK, 0 rows affected (0.46 sec)

Records: 0 Duplicates: 0 Warnings: 0

Master插入数据:mysql> insert into t(id,name,phone,address) values(2,'cde',1234567890,'new');

Query OK, 1 row affected (0.08 sec)

Slave查看数据:mysql> select * from t ;

+------+-----------+

| id | phone |

+------+-----------+

| 1 | 123456789 |

+------+-----------+

1 row in set (0.00 sec)

从库数据还是只有第一条,第二条数据没有。肯定报错了。报错信息如下:worker 1 failed executing transaction '43bb72ce-c48d-11e9-b618-00e04c01219a:4' at master log mysql-bin.000003, end_log_pos 1238; Column 1 of table 'tslave.t' cannot be converted from type 'char(16(bytes))' to type 'int(11)'

通过上面的报错解释不了。主从复制难道主从表结构不一致也可以么?心中的疑问越来越多。后来只能去翻看手册,最后发现如下解释:Source and target tables for replication do not have to be identical. A table on the master can have more or fewer columns than the slave's copy of the table. In addition, corresponding table columns on the master and the slave can use different data types, subject to certain conditions.

是不是很惊讶?看了这句我大致懂了。但是没搞明白,MySQL为什么要这么去做啊?求大神们来给我讲下吧。谢谢~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值