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

本文探讨了主库增加字段后从库未同步的原因,重点介绍了`--replicate-do-*`参数的使用,包括`--replicate-do-db`和`--replicate-wild-do-table`,以及它们在跨库操作中的局限性。文章揭示了主从表结构不一致仍能插入数据的意外行为,最终解释了MySQL允许这种差异性的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

看到朋友的问题,第一想法就是,是不是从库配置了“--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为什么要这么去做啊?求大神们来给我讲下吧。谢谢~

MySQL 主从复制中,可以使用 "start-position" 或 "start-datetime" 参数来指定从哪个位置或时间点开始复制。这些参数可以在从服务器上的配置文件中设置。下面是具体步骤: 1. 打开从服务器上的配置文件 my.cnf 或 my.ini。 2. 找到 [mysqld] 段,添加以下参数- 使用 "start-position" 参数: ``` replicate-do-db=database_name replicate-ignore-db=mysql replicate-wild-do-table=database_name.% master-info-file=/var/lib/mysql/master.info relay-log-info-file=/var/lib/mysql/relay-log.info relay-log=/var/lib/mysql/relay-log log-bin=mysql-bin log-slave-updates server-id=2 master-host=master_server_ip master-user=replication_user master-password=replication_password replicate-do-table=database_name.table_name replicate-do-table=database_name.table_name2 replicate-do-table=database_name.table_name3 replicate-do-table=database_name.table_name4 replicate-do-table=database_name.table_name5 relay-log-recovery=1 ``` 其中,"start-position" 参数可以在 "master-info-file" 文件中找到。 - 使用 "start-datetime" 参数: ``` replicate-do-db=database_name replicate-ignore-db=mysql replicate-wild-do-table=database_name.% master-info-file=/var/lib/mysql/master.info relay-log-info-file=/var/lib/mysql/relay-log.info relay-log=/var/lib/mysql/relay-log log-bin=mysql-bin log-slave-updates server-id=2 master-host=master_server_ip master-user=replication_user master-password=replication_password replicate-do-table=database_name.table_name replicate-do-table=database_name.table_name2 replicate-do-table=database_name.table_name3 replicate-do-table=database_name.table_name4 replicate-do-table=database_name.table_name5 relay-log-recovery=1 ``` 其中,"start-datetime" 参数可以在 "master-info-file" 文件中找到。 3. 保存并关闭文件,重启从服务器。 4. 在从服务器上执行以下命令启动复制: ``` CHANGE MASTER TO MASTER_HOST='master_server_ip', MASTER_USER='replication_user', MASTER_PASSWORD='replication_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4; ``` 其中,"MASTER_LOG_FILE" 和 "MASTER_LOG_POS" 分别对应 "start-position" 或 "start-datetime" 的值。 注意:在使用 "start-datetime" 参数时,需要保证主从服务器的时区设置相同,否则可能会导致复制不一致的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值