14.7.2 内置统计表与Admin接口
内置统计表与 Admin 接口是 ProxySQL 监控与运维的核心入口,通过对 stats、monitor 与 runtime_* 的查询,可以掌握流量、连接、延迟、后端健康与路由命中等关键指标,并用于排障、容量评估与策略优化。
1. 原理草图:Admin 接口与统计库关系
2. Admin 接口连接与基础命令(含命令解释)
前置条件:运维机具备 mysql 客户端工具。若未安装:
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y mysql-client
# CentOS/RHEL
sudo yum install -y mysql
连接 Admin 端口(默认 6032):
mysql -u admin -p -h 10.0.0.10 -P 6032
-u admin:Admin 用户-P 6032:Admin 管理端口- 连接后可直接访问
stats/monitor/main等库表
查看库与表:
SHOW DATABASES;
SHOW TABLES FROM stats;
SHOW TABLES FROM monitor;
3. 常用统计表查询示例(含预期结果与场景)
全局指标(连接、QPS、流量):
SELECT * FROM stats.stats_mysql_global\G
预期:返回 ConnUsed/ConnFree/Queries 等字段,便于判断负载与连接池压力。
命令级统计(SQL 类型占比):
SELECT Command, Total_Time_us, Total_cnt
FROM stats.stats_mysql_commands_counters
ORDER BY Total_Time_us DESC
LIMIT 10;
预期:识别耗时主要集中在 SELECT/UPDATE 等命令。
SQL 指纹与慢查询定位:
SELECT digest_text, count_star, sum_time, avg_time
FROM stats.stats_mysql_query_digest
ORDER BY sum_time DESC
LIMIT 5;
预期:输出最耗时 SQL 指纹,便于进一步优化或加规则。
连接池与后端状态:
SELECT hostgroup, srv_host, status, ConnUsed, ConnFree, Latency_us
FROM stats.stats_mysql_connection_pool
ORDER BY Latency_us DESC;
预期:识别延迟最高的后端或连接池耗尽风险。
后端健康检查:
SELECT hostname, port, status, ping_time_us, last_error
FROM monitor.mysql_server;
预期:status 为 ONLINE,异常时 last_error 提示原因。
4. 配置变更与运行时加载示例(含完整流程)
场景:新增一条读写分离规则(仅示例,不改动现有规则)
-- 1) 写入 main 配置库
INSERT INTO main.mysql_query_rules
(rule_id, active, match_pattern, destination_hostgroup, apply)
VALUES (1001, 1, '^SELECT.*', 20, 1);
-- 2) 加载到运行时
LOAD MYSQL QUERY RULES TO RUNTIME;
-- 3) 持久化到磁盘
SAVE MYSQL QUERY RULES TO DISK;
-- 4) 验证规则是否生效
SELECT rule_id, match_pattern, destination_hostgroup
FROM runtime_mysql_query_rules
WHERE rule_id=1001;
5. 运维排错示例(命令+判断思路)
问题:后端抖动导致延迟飙升
步骤:
-- 查看健康检查延迟
SELECT hostname, status, ping_time_us, last_error
FROM monitor.mysql_server;
-- 对比连接池延迟
SELECT srv_host, status, ConnUsed, Latency_us
FROM stats.stats_mysql_connection_pool
ORDER BY Latency_us DESC;
判断:若 ping_time_us 与 Latency_us 同时升高,说明后端压力或网络问题。
问题:SQL 命中路由异常
步骤:
-- 查看 SQL 指纹
SELECT digest_text, count_star
FROM stats.stats_mysql_query_digest
ORDER BY count_star DESC LIMIT 3;
-- 查看规则
SELECT rule_id, match_pattern, destination_hostgroup
FROM runtime_mysql_query_rules;
判断:若 match_pattern 未匹配到实际 SQL,需调整正则或规则顺序。
6. 日常巡检脚本示例(可执行)
保存为 /opt/proxysql/check_stats.sh:
#!/bin/bash
HOST=127.0.0.1
PORT=6032
USER=admin
PASS='admin_pass'
mysql -u${USER} -p${PASS} -h${HOST} -P${PORT} -N -e "
SELECT NOW();
SELECT Queries, ConnUsed, ConnFree FROM stats.stats_mysql_global;
SELECT COUNT(*) AS bad_backend FROM monitor.mysql_server WHERE status<>'ONLINE';
"
执行与预期:
chmod +x /opt/proxysql/check_stats.sh
/opt/proxysql/check_stats.sh
预期:输出当前时间、全局连接/查询、异常后端数量。
7. 练习(含目标与检查方式)
1) 练习:定位最耗时 SQL
目标:找出 sum_time 最高的 3 条 SQL 指纹。
检查:执行 stats_mysql_query_digest 查询并截图保存结果。
2) 练习:模拟规则下发
目标:新增一条规则并验证运行时生效。
检查:runtime_mysql_query_rules 中能查到新增规则。
3) 练习:健康检查异常定位
目标:手动停掉一个后端 MySQL,观察 monitor.mysql_server 状态变化。
检查:status 变为 SHUNNED 或 OFFLINE_SOFT,并记录 last_error。
8. 安全与运维管理要点
- Admin 端口只允许运维网段访问;配合防火墙或安全组限制
- 变更需遵循 LOAD → 验证 → SAVE,避免运行时与磁盘不一致
- 统计表查询建议纳入监控系统,定期采集 ConnUsed/Latency_us/Errors