数据库配置:binlog_format = row
故障原因
在主库执行了以下语句导致延迟
create table t2 as select t1
update t2 set column1=value where column2=value2
分析
- 关于复制原理
MySQL的复制是基于binlog
的,对于binlog_format=row
的数据库,binlog
里面记录的是每行数据的更改,也就是说,当执行一个更新语句时,语句更新了N
行,就会在日志中存在N
行记录。
在从库应用日志时,会对binlog
中的每一条记录进行应用,也就是说,主库上的一条更新语句=从库上的N
条更新语句 - 关于数据更新
数据更新时要先查找到要更新的数据,如果表不存在索引,会进行全表扫描,找到要更新的数据并进行更新
当表数据量很大时,全表扫描会消耗大量资源。
在这个问题中,使用create table t2 as select t1
复制了表t1
的数据到t2
中,但是,使用这个语句复制的表t2
,是不包括t1
的索引信息的,也就是说,后续更新t2
时,是在一个无索引的大表中执行更新,在从库上要执行多次全表扫描来更新数据,所以最终导致的从库同步延迟
后续规避方法
将
create table t2 as select t1
替换为
create table t2 like t1
insert into t2 select * from t1
使用这种方法,也能够创建一个和表t1
内容相同的表,并且t2
会复制t1
的索引信息