ProxySQL 基本排查方法指南

avatar 2026年7月18日18:38:46 评论 5 次浏览

在使用 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_sizestats_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 后端节点 SHUNNEDOFFLINE 检查后端 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 性能

五、排查方法论总结

  1. 先看日志:错误日志(proxysql.log)是最直接的线索。

  2. 再看 stats:用 stats_mysql_connection_pool 确认后端状态,用 stats_mysql_query_digest 确认路由正确性。

  3. 验证监控:检查监控账号是否正常工作,查看 monitor 表中的日志确认连接测试结果。

  4. 确认持久化:任何修改后,务必执行 LOAD ... TO RUNTIMESAVE ... TO DISK 两步。

  5. 启用高级日志:对间歇性故障,可启用事件日志捕获更详细的执行信息。

希望这份排查指南能帮助你在 ProxySQL 生产运维中快速定位问题、恢复服务。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: