日常运维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;
复制
特别是需要关注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;
复制
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;
复制
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抓堆信息。
尽努力做好一切
文章被以下合辑收录
评论

