复制延迟排查弄清楚当前数据库在干嘛
查看MySQL当前的状态
查看MySQL调度情况: perf top -p `pidof mysqld`延迟现象Seconds_Behind_master 一直在增大,但Exec_master_log_pos一直卡着不动一般有两种下面的情况:
1.真的是大事务,比如: update/delete 50万行以上
2.更新这个表可能没有索引
定位事物方法:主库上查,下面的日志文件,定位在干嘛
Relay_Master_Log_File: mysql-bin.000003
Exec_Master_Log_Pos: 626
mysqlbinlog -v --base64-output=decode-rows --start-positon=626 mysql-bin.000003 |more
# 也可一去从库上找:
Relay_Log_File: relay-bin.000003
Relay_Log_Pos: 4
mysqlbinlog -v --base64-output=decode-rows --start-positon=4 relay-bin.000003 |more
弄清楚当前数据库在干嘛定位SQL_thread执行位置
show processlist;
show slave status\G;
io_thread , sql_thread
io_thread执行到的位置:
master_log_file
read_master_log_pos
sql_thread执行到的位置:
Relay_Master_Log_File
Exec_Master_Log_Pos
mysqlbinlog --base64-output=decode-rows -vv --start-position=Exec_Master_Log_Pos \
master_log_file查看当前MySQL状态机器负载很高所以不合理
Statement索引不合理
mysql> desc information_schema.processlist;
+---------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------------+------+-----+---------+-------+
| ID | bigint(21) unsigned | NO | | 0 | |
| USER | varchar(32) | NO | | | |
| HOST | varchar(64) | NO | | | |
| DB | varchar(64) | YES | | NULL | |
| COMMAND | varchar(16) | NO | | | |
| TIME | int(7) | NO | | 0 | |
| STATE | varchar(64) | YES | | NULL | |
| INFO | longtext | YES | | NULL | |
+---------+---------------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
mysql> select * from information_schema.processlist order by time desc limit 2\Gperf top mysqld大招:通过内核查看mysql 进程,定位到源码利用源码定位出问题的文字主持延迟实例