🗄️ 第08章 · 状态与监控

SHOW STATUS / PROCESSLIST

状态与监控

这一章讲如何随时掌握 MySQL 的健康状况:当前跑着什么连接、有没有慢查询、缓存命中、线程/连接数、是否快被撑爆。运维里"数据库突然挂了"大多能靠这几条命令提前发现。

一步到位:SHOW STATUS

MySQL 有一堆运行状态计数器,按需查看:

-- 全量状态
SHOW GLOBAL STATUS;
-- 只看关心的几个(Uptime 运行时长, 连接数, 慢查询数)
SHOW GLOBAL STATUS LIKE 'Uptime';
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Slow_queries';
SHOW GLOBAL STATUS LIKE 'Questions';
常用状态项 意义 关注点
Uptime 已运行秒数 突然变小=重启过
Threads_connected 当前连接数 接近 max_connections 会拒绝新连接
Max_used_connections 历史最大连接数 用于评估该不该提高 max_connections
Slow_queries 慢查询总数 持续增长说明有慢 SQL
Questions 累计查询次数 看 QPS 趋势
Innodb_buffer_pool_reads 逻辑读中未命中缓存的次数 高说明内存缓冲不足

看正在执行的语句

-- 当前所有连接在做什么
SHOW FULL PROCESSLIST;

-- 只看运行超过 5 秒的(慢查询/锁等待)
SELECT id, user, db, command, time, state, info
FROM information_schema.processlist
WHERE time > 5
ORDER BY time DESC;

提示 | State 列很关键:Waiting for table metadata lock/Waiting for lock 常意味着有锁等待;Sending data 长时间不动往往是慢查询。长时间卡住的会话可以用 KILL <id>; 终止。

配置与全局变量

-- 常用配置查看
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'long_query_time';

实战经验 | 生产常见告警与对策: - max_connections 用满 → 应用连接池没复用、或连接泄漏;排查并调大应用连接池 + max_connections。 - innodb_buffer_pool_size 物理内存的 60%~80%(专用库)通常够用;设太小会频繁刷盘、全表扫描慢。 - 若表很大且 InnoDB_buffer_pool_reads 高 → 内存池不足,加内存/调大池大小。

性能视图(performance_schema / sys)

较新版本 MySQL 提供 performance_schema 与便捷的 sys schema,能一眼看到"TOP 消耗":

-- 用 sys 库看最耗时的语句
SELECT * FROM sys.statement_analysis ORDER BY total_latency DESC LIMIT 10;

-- 看占用最多等待/IO 的
SELECT * FROM sys.io_global_by_file_by_bytes ORDER BY total_bytes DESC LIMIT 5;

-- 看连接最多的用户
SELECT * FROM sys.processlist ORDER BY time DESC;

集成到监控(Prometheus 之类)

在生产,你会把 MySQL 指标纳入监控(如本机 Prometheus + mysqld-exporter)。关键采集点:

  • 连接数 vs max_connections
  • 慢查询计数 Slow_queries
  • Innodb_buffer_pool_reads / reads 比率
  • QPS(Questions 差分)
  • 主从延迟(如有复制)

提示 | 这里的 SHOW STATUS 就是监控抓数的基础。知道了哪些指标重要,才能配好告警阈值(详见《监控与日志 · Prometheus 概述》与《告警规则》)。

相关命令

  • SHOW GLOBAL STATUS / SHOW VARIABLES 看状态与配置。
  • SHOW FULL PROCESSLIST 看连接与阻塞。
  • information_schema.processlist 做按条件过滤。

安全 | processlist 会暴露 SQL 内容,生产环境只给有权限的运维账号查看。