MySQL 故障分析 需要抽取那些信息

日常运维MySQL数据库中会碰到一些莫名其妙的故障,虽然监控存在,但因为当时没有及时采集信息,导致后续不了了之的情况 或 等到下次故障发生的时,再采集信息,进行分析问题。

那些故障下,会出现信息少,无法进行分析:

  • TPS突然下降到 0
  • 连接数直接爆满
  • error日志无记录
  • 突然hang住
  • 数据库服务不停的重启
  • 内存曲线是上升,最后OOM

如生产环境中,碰见类似现象,应该采集那些数据,后续分析。

1.基础信息

基础信息包含OS信息,mysql版本,高可用,参数设置

mysql -uroot -p -S /opt/data/mysql.sock  -e "\s;show global variables;" > /tmp/msyql_baseinfo.txt

2.查看连接信息

SHOW PROCESSLIST;

image.png
特别是需要关注State里的状态值。
链接太多的是使用以下语句:

select USER ,HOST,DB ,COMMAND, TIME,STATE , INFO from information_schema.processlist where COMMAND<>'Sleep' limit 10;

3.error日志抽取

MySQL 所有时间都会基本都会写到日志文件里,但问题出现的时候需要确认error 日志。
error日志查看

mysql> SHOW VARIABLES LIKE '%log_error%';
+----------------------------+----------------------------------------+
| Variable_name              | Value                                  |
+----------------------------+----------------------------------------+
| binlog_error_action        | ABORT_SERVER                           |
| log_error                  | /opt/data8.0/logs/mysql_err.log        |

除了error日志之外,需要系统日志/var/log/messages

4.慢日志抽取

慢日志也会导致MySQL 反应慢,所以也需要抽取慢日志
配置文件my.cnf会配置,mysql信息里也可以看到慢日志信息

mysql> SHOW VARIABLES LIKE '%slow%';
+---------------------------+----------------------------+
| Variable_name             | Value                      |
+---------------------------+----------------------------+
| log_slow_admin_statements | ON                         |
| log_slow_extra            | OFF                        |
| log_slow_slave_statements | OFF                        |
| slow_launch_time          | 2                          |
| slow_query_log            | ON                         |
| slow_query_log_file       | /opt/data8.0/logs/slow.log |
+---------------------------+----------------------------+

对于慢日志分析提供2种方式:

mysqldumpslow 方式:

1.得到返回记录最多的20个sql

mysqldumpslow -s r -t 20 sqlslow.log  > /tmp/mysql-slow.20180725.log

2.得到平均访问次数最多的20条sql

mysqldumpslow -s ar -t 20 sqlslow.log > /tmp/mysql-slow.20180725.log

pt-query-digest方式:

pt-query-digest --limit=100  --since "2016-06-08 00:00:00"  --until "2016-06-08 23:59:59" mysql-slow.log  > /tmp/slow_report.log

备注:建议使用 pt-query-digest

5.锁信息

查看锁等待相关的阻塞线程、被阻塞线程信息及相关用户、IP、PORT

SELECT locked_table,
       locked_index,
       locked_type,
       blocking_pid,
       concat(T2.USER,'@',T2.HOST) AS "blocking(user@ip:port)",
       blocking_lock_mode,
       blocking_trx_rows_modified,
       waiting_pid,
       concat(T3.USER,'@',T3.HOST) AS "waiting(user@ip:port)",
       waiting_lock_mode,
       waiting_trx_rows_modified,
       wait_age_secs,
       waiting_query
FROM sys.x$innodb_lock_waits T1
LEFT JOIN INFORMATION_SCHEMA.processlist T2 ON T1.blocking_pid=T2.ID
LEFT JOIN INFORMATION_SCHEMA.processlist T3 ON T3.ID=T1.waiting_pid;

6.Innodb状态

SHOW ENGINE INNODB STATUS\G;
SHOW ENGINE INNODB MUTEX;

MySQL中latch 与lock都被称为锁,在innodb中lock针对的是事务,latch针对的是线程,latch又可以分为mutex和rw_lock,latch的目的是保证并发的线程操作临界资源的正确性.
Mutex量指的是一种用于保护一些临界资源的使用的信号量。当有线程需要使用这 些临界资源时,会请求获得mutex量,请求成功的线程进入临界区,而请求失败的线程只能等待它释放这个mutex。

7.binlog统计DDL&DML

##统计DML:

mysqlbinlog --no-defaults --start-datetime='2020-05-02 22:36:46' --stop-datetime='2020-05-02 23:25:46' --base64-output=decode-rows -v -v mysql-bin.000007 | awk '/###/{if($0~/UPDATE|INSERT|DELETE/)count[$2" "$NF]++}END{for(i in count)print i,"\t",count[i]}'|column -t|sort -k3nr

##统计DDL:

mysqlbinlog  --start-datetime='2020-05-02 22:36:46' --stop-datetime='2020-05-02 23:25:46' mysql-bin.000007 | awk 'BEGIN{IGNORECASE=1} {if($0~/alter/)count[$1" " $2" " $3" "$NF]++}END{for(i in count)print i,"\t",count[i]}'|column -t|sort -k3nr

binlog并行复制统计

mysqlbinlog mysql-bin.000004 --start-position=20087624 | grep -o 'last_committed.*'  | sed 's/=/ /g' | awk '{print $2"\t"$4}' | awk '{count++;print $0;} END{print "total count is ",count}'

8.监控信息

OS信息:查看CPU TOP ,io iostat状态,网络流量
mysql信息:连接数,active线程数,锁等待,临时表使用情况,tps,qps,网络 input&out信息信息

9.mgr状态

mgr状态查询

Show master status\G;
select * from performance_schema.replication_group_member_stats\G;

image.png

MGR成员间的角色和状态信息

SELECT a.member_id, a.member_host, a.member_state, a.member_role, b.channel_name, b.count_transactions_in_queue, b.count_transactions_remote_in_applier_queue FROM performance_schema.replication_group_members a, performance_schema.replication_group_member_stats b WHERE a.member_id=b.member_id order by a.member_role;

image.png

10.pstack堆信息抽取

pstack命令 可显示每个进程的栈跟踪。pstack 命令必须由相应进程的属主或 root 运行

pstack $mysql_pid>/tmp/pstack.info

备注:平时不能使用,会卡主mysql,谨慎使用!

11.tcpdump抓包抽取

抓包主要考虑网络相关的部分,也可以通过sql语句找到数据参数 ,原ip信息 丢包等情况
tcpdump -i ens33 tcp port 3410 and host 192.168.244.130 -w ./kafka.pcap
需要配合wireshark 查看。

总结

DBA碰到故障的时候 需要头脑冷静思路清晰。已尽快解决故障,给业务尽快提供服务为基准,尽量 合理的收集信息。

MySQL也在尽量完善这方面的体系。

如碰见MySQL直接hang住 或 不可用的是时候,建议直接使用pstack抓堆信息。

尽努力做好一切

猜你喜欢

转载自blog.csdn.net/dreamyuzhou/article/details/117482981