服务器上mysql数据库很多,某个数据库把整台服务器拉爆了,如何定位找到罪魁?
先在 MySQL 里把“正在烧 CPU 的 SQL”抓出来 → 看它在查哪些表(从表名就能判断是哪个站/库)→ 再用连接的 db 字段直接定位库名。
直接在终端上运行:
mysql -uroot -p -e "SHOW FULL PROCESSLIST\G"
或
mysql -uroot -p -e "
SELECT ID,USER,HOST,DB,COMMAND,TIME,STATE,LEFT(INFO,200) AS SQL200
FROM information_schema.PROCESSLIST
WHERE COMMAND='Query' AND TIME>2
ORDER BY TIME DESC
LIMIT 30;"
更准:按库统计“当前正在跑的查询数量/最慢”
mysql -uroot -p -e "
SELECT DB, COUNT(*) AS running
FROM information_schema.PROCESSLIST
WHERE COMMAND='Query'
GROUP BY DB
ORDER BY running DESC;"
哪个 DB 的 running 多 / max_time 高,基本就是罪魁祸首。
mysql -uroot -p -e "
SELECT DB, MAX(TIME) AS max_time, COUNT(*) AS running
FROM information_schema.PROCESSLIST
WHERE COMMAND='Query'
GROUP BY DB
ORDER BY max_time DESC;"
抓不到?(因为查询瞬间结束)用 Performance Schema 追“历史 TOP SQL”
如果你发现 processlist 一闪而过抓不到,就用 MySQL 的汇总表(前提是 performance_schema 开着,很多环境默认开):
mysql -uroot -p -e "
SELECT
SCHEMA_NAME AS db,
COUNT_STAR AS execs,
ROUND(SUM_TIMER_WAIT/1e12,2) AS total_sec,
ROUND(AVG_TIMER_WAIT/1e12,4) AS avg_sec,
LEFT(DIGEST_TEXT,120) AS sample
FROM performance_schema.events_statements_summary_by_digest
WHERE SCHEMA_NAME IS NOT NULL
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 20;"
这里的 db 就是库名,基本能定位到“哪个库的哪类 SQL 最耗时”。