首页 > 代码

服务器上mysql数据库很多,某个库把整台服务器拉爆了,如何定位找到罪魁?

服务器上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 最耗时”。


  • mysql区间泛内容批量替换语句,且限定ID范围
  • 要求:要批量把文章id where id >= 587606 and id

  • mysql批量删除所有文章某区间内不同的内容
  • 【批量删除所有文章某区间内容】 例:某mysql数据内有几十万条数据,删除所有 <p class=&qu […]

  • mysql语句请尽量不使用ORDER BY RAND()
  • 不使用ORDER BY RAND() select id from `dynamic` order by ra […]

  • InnoDB删除数据后释放磁盘空间的方法
  • 最近发现mysql里的一个数据文件竟然高达150G,当时就懵了, 经过查文档发现原来,所有信息都存在这一个文件 […]

  • 批量删除wordpress内容,按标题内容字段字段长短
  • 批量删除文章,按标题内容字段字段长短, DELETE FROM wp_posts where length(p […]

  • 批量删除wordpress所有内容页里某个字符段前后的内容
  • 举个栗子一: 批量删除某个内容前的所有内容 例:删除表wp_posts 字段post_content 内容里所 […]