本文以 centos 为例查找 mysql 资源暂用过高问题,其他系统思路一样,可能部分命令有所区别
查找进程
mysql 进程
打印 mysql 服务状态,在打印的信息中可以查看到进程 id
service mysqld status
打印信息
Redirecting to /bin/systemctl status mysqld.service
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since 一 2022-07-25 21:00:31 CST; 1 day 14h ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 55745 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
Process: 55724 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 55747 (mysqld)
CGroup: /system.slice/mysqld.service
└─55747 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
7月 25 21:00:24 dzwldbcs systemd[1]: Starting MySQL Server...
7月 25 21:00:31 dzwldbcs systemd[1]: Started MySQL Server.
可以看到进程 id 为 55747
查找线程
在获取到 mysql 进程后利用 top 命令获取 cpu 占用较高的进程,由于习惯了 htop,因此该处我使用 htop
# top命令
top -Hp 55747
# htop命令
htop -p 55747
在输出中找到 cpu 占用较高的进程 id
查找 sql 语句
找到相关进程后,在 mysql 客户端中执行如下命令,以获取该线程执行的 sql 语句
在执行该语句时可能
info
列可能为空,多执行几遍
select
a.user,
a.host,
a.db,
b.thread_os_id,
b.thread_id,
a.id processlist_id,
a.command,
a.time,
a.state,
a.info
from
information_schema.processlist a,
performance_schema.threads b
where
a.id = b.processlist_id
and (b.thread_os_id = 55974
or b.thread_os_id = 55975
or b.thread_os_id = 55976
or b.thread_os_id = 55977
or b.thread_os_id = 55918);
其中info
列则为 sql 语句,拿到 sql 语句后,便可以进行后续的分析优化等工作