Skip to content

Latest commit

 

History

History
43 lines (34 loc) · 1.14 KB

2020-03-19-MySQL对无主键表的复制.md

File metadata and controls

43 lines (34 loc) · 1.14 KB

疑问

MySQL 存储innodb引擎会对无主键的表创建一个内部的Rowid。 之前有一个疑问,复制模式为row时,从库回放update语句时会不会利用这个内部的Rowid识别数据从而避免全表扫描呢?

结论

经过实测(MySQL 5.7),得出结论是不会,也不能

  1. Rowid是MySQL内部数据,外部无法查询和修改。
  2. 对于无主键表,master和slave的内部Rowid不一定相同。
  3. 对于无主键表,slave通过所有字段值的组合去识别行。 这和PG的REPLICA IDENTITY FULL是一个道理。区别这是MySQL的默认设置,而且是全局参数;PG则需要显式的按表设置。

举例

master

mysql> select * from tbk1;
+----+------+
| id | c1   |
+----+------+
|  1 | xx   |
+----+------+

slave

mysql> select * from tbk1;
+----+------+
| id | c1   |
+----+------+
|  1 | yy   |
+----+------+

在master上执行以下SQL

update tbk1 set c1='xx1';
  • 如果id是主键,这个SQL在从库可以回放成功;
  • 如果tbk1表没有主键,这个SQL在从库回放失败,复制中断。(设置set global slave_exec_mode='idempotent'可以容错)