判断
Seconds_Behind_Master 值不为 0,单位是 s。
风险
- 从库复制夯住,会导致备份失败(flush tables with read lock 900s 超时)
- 以从库为基准进行的备份,数据不是最新的有延迟
- 异常情况下,主从 HA 无法切换,HA 需要检查数据的一致性,延迟时主备不一致
原因
最根本原因是主库是多线程读写,从库读取主库的 binlog 的线程只有一个,常见的场景如下:
- 无主键、无索引或索引区分度不高
1 | show slave status; |
- 主库上有大事务,导致从库延时
- 主库写入频繁,从库压力跟不上导致延时
- 大量 myisam 表,在备份时导致 slave 延迟
解决方法
- 为夯住的表添加主键或者索引
1 | # 找到表区分度比较高的几个字段 |
- 调整数据库中 IO 相关参数
1 | mysql> select @@innodb_flush_log_at_trx_commit; |
- 修改表存储引擎为 InnoDB
案例 1
现象:从库两个线程 Slave_IO_Running
和 Slave_SQL_Running
均是 Yes,主从复制链路正常,但是 Seconds_Behind_Master
不断增大,且主从数据延迟有不断扩大的趋势。
1 | mysql> show slave status\G |
- 检查当前数据库线程状态,未发现有明显异常
1 | mysql> show processlist; |
- 检查当前正在使用的表:
show open tables where In_use=1;
发现有一张表一直处于In_use
状态。
1 | mysql> show open tables where In_use=1; |
- 根据
Relay_Log_Pos
解析relay-log.000004
,查看当时正在执行的操作是Delete_rows
,操作的表是tdmetl
.odsepg_zrfc_zco_zzfymx_sw
。
1 | mysqlbinlog -vv --base64-output=decode-rows relay-log.000004 --start-position=169851605 | more |
1 | # at 169851605 |
- 检查表结构,发现该表数据量很大且无主键。由此基本确定其问题根本原因:对无主键的表进行删除或者更新,导致从库夯住。该表数据量:77961221条。
解决方法
- 表添加自增主键。
1 | ALTER TABLE 'xxxx' ADD id int UNSIGNED primary key AUTO_INCREMENT; |
- 大表删除使用
truncate
命令。
案例 2
原因分析
1 | mysql> mysql> show slave status\G |
解决方法
1 | mysql> show variables like 'sync_binlog'; |