在使用 ProxySQL 的过程中,难免会遇到连接失败、路由异常、性能下降等问题。掌握一套系统的排查方法,能帮你快速定位根因、恢复业务。本文将从日志分析、状态检查、监控诊断三个维度,系统介绍 ProxySQL 的基本排查方法。
一、日志分析:排查的第一站
1.1 错误日志(Error Log)
ProxySQL 的错误日志是排查问题的首选入口,记录了启动、退出、错误、警告等各类事件。默认路径为 [datadir]/proxysql.log,可通过 errorlog 配置项修改。
查看错误日志:
tail -f /var/lib/proxysql/proxysql.log
常见错误信息解读:
| 错误信息 | 含义 | 排查方向 |
|---|---|---|
Server ... is returning "Access denied" for monitoring user |
监控账号认证失败 | 检查 monitor_username/monitor_password 是否与后端 MySQL 一致 |
Monitor connect failed ... password authentication failed |
监控连接认证失败 | 后端数据库未创建监控账号或密码错误 |
Unable to parse unknown SET query |
SET 语句无法解析 | 添加规则显式允许该 SET 语句的 multiplex |
Connection refused |
后端拒绝连接 | 检查后端 MySQL 是否运行,端口是否正确 |
1.2 日志轮转
错误日志会持续增长,建议配置 logrotate 进行轮转:
# /etc/logrotate.d/proxysql /var/lib/proxysql/proxysql.log { daily rotate 7 missingok notifempty compress postrotate /usr/bin/mysql -e "PROXYSQL FLUSH LOGS" endscript }
轮转后需执行 PROXYSQL FLUSH LOGS 命令,让 ProxySQL 重新打开日志文件。
二、状态诊断:通过 stats 表实时观察
ProxySQL 的 stats 数据库中包含了丰富的运行时统计信息,是排查问题的核心工具。
2.1 检查后端连接池状态
stats_mysql_connection_pool 表展示了每个后端服务器的连接池状况,是排查连接超时、连接耗尽、后端状态异常的首选。
-- 查看所有后端节点的连接池状态 SELECT hostgroup, srv_host, srv_port, status, ConnUsed, ConnFree, ConnOK, ConnERR, Latency_us FROM stats_mysql_connection_pool ORDER BY hostgroup, srv_host;
字段解读:
| 字段 | 说明 | 排查价值 |
|---|---|---|
status |
后端状态:ONLINE/SHUNNED/OFFLINE_SOFT/OFFLINE_HARD |
SHUNNED 表示被临时摘除,需检查原因 |
ConnUsed |
当前正在使用的连接数 | 接近 max_connections 时可能连接不足 |
ConnERR |
连接失败累计次数 | 持续增长说明后端连接不稳定 |
Latency_us |
当前 ping 延迟(微秒) | 延迟突增可能是网络或后端负载问题 |
2.2 分析查询执行时间分布
stats_mysql_commands_counters 表按命令类型统计了执行时间分布,用于定位慢查询和超时问题。
-- 查看各类命令的执行时间分布 SELECT Command, Total_cnt, cnt_1s, cnt_5s, cnt_10s, cnt_INFs FROM stats_mysql_commands_counters ORDER BY Total_cnt DESC;
重点关注 cnt_INFs(超过10秒的查询数)。如果数量较大,说明存在长时间运行的查询,可能需要优化 SQL 或增加超时配置。
2.3 查看客户端连接失败记录
如果启用 mysql-client_host_cache_size,stats_mysql_client_host_cache 表会记录每个客户端 IP 的连续连接失败次数,可用于排查应用连接被拒绝的问题。
SELECT * FROM stats_mysql_client_host_cache;
2.4 查看查询路由统计
stats_mysql_query_digest 表记录了每个查询的指纹、执行次数、耗时、路由到的 hostgroup,是验证读写分离规则是否生效的直接证据。
-- 按执行次数排序,查看路由分布 SELECT digest_text, count_star, sum_time, hostgroup FROM stats_mysql_query_digest ORDER BY count_star DESC LIMIT 20;
如果 SELECT 查询的 hostgroup 是写组(如 10),说明读流量未被正确路由到从库,需检查 mysql_query_rules 配置。
三、监控排查:进阶诊断手段
3.1 启用高级事件日志(Advanced Event Logging)
ProxySQL 2.7.2 及以上版本提供了高级事件日志功能,可捕获、存储和分析 SQL 执行事件,非常适合排查间歇性故障和性能抖动。
启用事件日志:
-- 设置循环缓冲区大小(1,000,000 条事件) SET mysql-eventslog_buffer_history_size = 1000000; -- 启用查询日志 SET mysql-eventslog_default_log = 1; LOAD MYSQL VARIABLES TO RUNTIME;
导出并分析事件:
-- 将缓冲区事件导出到内存表 DUMP EVENTSLOG FROM BUFFER TO MEMORY; -- 分析高频查询 SELECT query, COUNT(*) AS count FROM stats_mysql_query_events GROUP BY query ORDER BY count DESC LIMIT 10;
注意:该功能会消耗额外的内存,建议按需启用,并监控 MySQL_Logger-circularBufferEventsDroppedCount 指标,确保缓冲区不会溢出。
3.2 集群状态检查
如果部署了 ProxySQL 集群,可通过 stats_proxysql_servers_checksums 表查看各节点配置同步情况。
SELECT hostname, name, version, checksum, diff_check FROM stats_proxysql_servers_checksums WHERE version > 0 ORDER BY name, hostname;
-
diff_check持续增长(默认超过3次)会触发自动同步 -
updated_at长时间不更新表示节点间网络不通
3.3 配置持久化检查
如果修改配置后重启丢失,最可能的原因是未执行 SAVE ... TO DISK。排查方法:
-- 检查 runtime 配置是否与 disk 一致 SELECT COUNT(*) FROM runtime_mysql_servers; SELECT COUNT(*) FROM disk_mysql_servers; -- 如果不一致,执行 SAVE 持久化 SAVE MYSQL SERVERS TO DISK;
四、常见问题速查表
| 问题现象 | 优先排查 | 可能原因 | 解决方案 |
|---|---|---|---|
| 应用连接失败 | stats_mysql_connection_pool |
后端节点 SHUNNED 或 OFFLINE |
检查后端 MySQL 服务状态和监控账号 |
| SELECT 未走从库 | stats_mysql_query_digest |
路由规则不生效或未 LOAD |
检查 mysql_query_rules,执行 LOAD ... TO RUNTIME |
| 配置修改后重启丢失 | 检查 disk 表 | 未执行 SAVE ... TO DISK |
执行 SAVE ... TO DISK |
| 日志出现 SET 语句警告 | 错误日志 | 新算法无法解析 SET 语句 | 添加规则允许 SET SESSION 的 multiplex |
| 监控连接认证失败 | 错误日志 | 监控账号未创建或密码错误 | 在后端创建 monitor 账号并授权 |
| 连接延迟高 | stats_mysql_connection_pool.Latency_us |
网络或后端负载问题 | 检查网络延迟和后端 MySQL 性能 |
五、排查方法论总结
-
先看日志:错误日志(
proxysql.log)是最直接的线索。 -
再看 stats:用
stats_mysql_connection_pool确认后端状态,用stats_mysql_query_digest确认路由正确性。 -
验证监控:检查监控账号是否正常工作,查看
monitor表中的日志确认连接测试结果。 -
确认持久化:任何修改后,务必执行
LOAD ... TO RUNTIME和SAVE ... TO DISK两步。 -
启用高级日志:对间歇性故障,可启用事件日志捕获更详细的执行信息。
希望这份排查指南能帮助你在 ProxySQL 生产运维中快速定位问题、恢复服务。

您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏