MySQL 5.6 的并行复制是db级别的,如果碰到一个SQL,包含一个跨库 join 的写操作时,
譬如说:
update db1.tb1 as a , db2.tb2 as b set a.id = 100 where a.id = b.id ;
slave会怎么样?并行复制会失效吗?
个人开脑洞猜测,不知道靠不靠谱:
1. 当binlog是statement格式时,并行复制暂时失效,该SQL执行完毕后并行复制恢复
2. 当binlog是row格式时,并行复制不失效
一个跨库 join 的写操作时,请问这是一种 什么场景???
比方说:update db1.tb1 as a , db2.tb2 as b set a.id = 100 where a.id = b.id
@木子那个李: 哦,update时不是锁行的吗,应该跟你那复制没关系
不太明白,但是想问下楼主,当宝db1和db2分别是主从上的两个库是吧,而你的写只是针对db1,而db1和db2不可能是主从库关系吧 他们名字就不一样
不会失效的。你看我给你模拟的实验
CREATE TABLE t1.t1( id1 INT(10) , name CHAR(20))ENGINE = INNODB DEFAULT CHARSET=UTF8; CREATE TABLE t2.t2( id2 INT(10) , name CHAR(20))ENGINE = INNODB DEFAULT CHARSET=UTF8; INSERT INTO t1.t1 VALUES (1,'u11'); INSERT INTO t1.t1 VALUES (2,'u12'); INSERT INTO t1.t1 VALUES (3,'u13'); INSERT INTO t1.t1 VALUES (4,'u14'); INSERT INTO t1.t1 VALUES (5,'u15'); INSERT INTO t2.t2 VALUES (1,'u11'); INSERT INTO t2.t2 VALUES (2,'u12'); INSERT INTO t2.t2 VALUES (3,'u13'); #从库再次查看同步状态: SHOW SLAVE STATUS \G Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0 主库上更新: mysql> UPDATE t1.t1 AS a,t2.t2 AS b -> SET a.id1 = 100 -> WHERE a.id1=b.id2; Query OK, 3 rows affected (0.13 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> show variables like '%format%'; +--------------------------+-------------------+ | Variable_name | Value | +--------------------------+-------------------+ | binlog_format | STATEMENT | ………… #从库再次查看同步状态: SHOW SLAVE STATUS \G Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0