一般地,主从延时是由slave引起的。
slave上有两个线程,IO_THREAD,SQL_THREAD。
IO_THREAD负责连接主库,拉取binlog文件到本地relay.log
SQL_THREAD负责从realy.log读取binlog并执行。
一般地,更有可能是SQL_THREAD造成延时。
如果是IO_THREAD,则可能因为是网络延时,不太可能是因为io性能
如果是SQL_THREAD,则可能执行sql的时候,有些sql太慢而引起的。此时,可以打开慢查询日志来定位问题。
另一个SQL_THREAD造成延时的原因可能是一些表没有主键或者唯一键,因为这样的话,在更新数据的数据可能需要扫描全表,因而变慢。
查询没有主键或者唯一索引的表。
mysql> SELECT t.table_schema,t.table_name,engine
FROM information_schema.tables t INNER JOIN information_schema .columns c
on t.table_schema=c.table_schema and t.table_name=c.table_name
GROUP BY t.table_schema,t.table_name
HAVING sum(if(column_key in ('PRI','UNI'), 1,0)) =0;
Ref:https://www.percona.com/blog/2014/05/02/how-to-identify-and-cure-mysql-replication-slave-lag/
图注:
read_master_log_pos 代表slave的io thread读取master的binlog的最新位置
exec_master_log_pos代表slave的sql thread执行master的binlog(其实是io thread写入的relay log)的最新位置。