14.7.2 内置统计表与Admin接口

内置统计表与 Admin 接口是 ProxySQL 监控与运维的核心入口,通过对 statsmonitorruntime_* 的查询,可以掌握流量、连接、延迟、后端健康与路由命中等关键指标,并用于排障、容量评估与策略优化。

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;

预期:statusONLINE,异常时 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_usLatency_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 变为 SHUNNEDOFFLINE_SOFT,并记录 last_error

8. 安全与运维管理要点
- Admin 端口只允许运维网段访问;配合防火墙或安全组限制
- 变更需遵循 LOAD → 验证 → SAVE,避免运行时与磁盘不一致
- 统计表查询建议纳入监控系统,定期采集 ConnUsed/Latency_us/Errors