非主键列不一致时,mysql同步追踪

本文详细解析了MySQL主从复制过程中,通过修改主库和从库数据,导致数据不一致的情况。分析了主库日志记录的变化,并揭示了从库执行时变量的调整,展示了与预期不同的where条件匹配情况。

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

参数设置,主从都设置成"ROW"模式
mysql> show variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.01 sec)

从库:
mysql> show variables like '%log_slave_update%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| log_slave_updates | ON    |
+-------------------+-------+
1 row in set (0.00 sec)

更改从库数据,使主从不一致(id是主键)
mysql> select * from tb_rpl;
+----+--------+
| id | name   |
+----+--------+
|  1 | wubx   |
|  2 | mysql1 |
|  3 | test   |
+----+--------+
3 rows in set (0.00 sec)

mysql> update tb_rpl set name='mysql22' where name = 'mysql1';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

这时更改主库数据

mysql> select * from tb_rpl;
+----+--------+
| id | name   |
+----+--------+
|  1 | wubx   |
|  2 | mysql1 |
|  3 | test   |
+----+--------+
3 rows in set (0.00 sec)

mysql> update tb_rpl set name='mysql11' where name = 'mysql1';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

从库同步成功:

mysql> select * from tb_rpl;
+----+---------+
| id | name    |
+----+---------+
|  1 | wubx    |
|  2 | mysql11 |
|  3 | test    |
+----+---------+
3 rows in set (0.00 sec)

这过程发生了什么呢?

先分析下主库log


如果用这个语句去更新从库数据,显然不行。

所以还需要分析下从库的日志


真相大白,从库执行时把@2这个变量给改了,这中间应该还有我没看到事发生。

这过程与我想象中的where里只有主键的条件不一样。

补充:

mysql> select version();
+------------+
| version()  |
+------------+
| 5.6.21-log |
+------------+
1 row in set (0.03 sec)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值