14.10.7 日志与诊断工具使用
7. 日志与诊断工具使用#
本节围绕 ProxySQL 的日志、管理接口与系统级诊断工具,给出可执行的排障流程与练习,帮助定位连接、路由、复制与性能问题。
原理草图:日志与诊断数据流
1)日志路径与安装后检查
安装示例(以 Debian/Ubuntu 为例):
sudo apt-get update
sudo apt-get install -y proxysql
sudo systemctl enable --now proxysql
sudo systemctl status proxysql
关键路径与配置检查:
# 默认日志路径
ls -l /var/log/proxysql/proxysql.log
# 查看配置与数据目录
grep -E 'datadir|log' /etc/proxysql.cnf
说明:datadir 决定内部 SQLite DB、运行数据位置,日志通常在 /var/log/proxysql/。
2)日志级别调整(可动态排障)
通过 Admin 接口临时提升日志级别:
# 连接 Admin 接口(默认 6032)
mysql -u admin -padmin -h 127.0.0.1 -P 6032
# 在 Admin 接口中执行
SET mysql-monitor_enabled=1;
SET admin-stats_credentials="admin:admin";
SET mysql-loglevel=3; -- 1=ERROR, 2=WARNING, 3=INFO, 4=DEBUG(因版本而异)
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
预期效果:proxysql.log 中出现更详细的连接、路由、监控日志。排障完成后恢复较低级别。
3)日志轮转配置示例
sudo tee /etc/logrotate.d/proxysql <<'EOF'
/var/log/proxysql/proxysql.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
}
EOF
sudo logrotate -f /etc/logrotate.d/proxysql
说明:copytruncate 避免重启服务,适合在线日志轮转。
4)Admin 诊断 SQL(可直接复现)
-- 连接池与连接使用情况
SELECT hostgroup, srv_host, ConnUsed, ConnFree, ConnOK, ConnERR
FROM stats_mysql_connection_pool;
-- 路由命中统计
SELECT rule_id, hits, matches, comment
FROM stats_mysql_query_rules
ORDER BY hits DESC;
-- 慢查询与高耗时语句
SELECT digest_text, count_star, sum_time, avg_time
FROM stats_mysql_query_digest
ORDER BY sum_time DESC
LIMIT 10;
-- 运行态配置核对
SELECT * FROM runtime_mysql_servers;
SELECT * FROM runtime_mysql_users;
预期效果:能够判断连接池是否耗尽、规则是否命中、慢查询来源。
5)日志关键词与典型故障定位
- 连接失败:Access denied、timeout、max connections
- 路由异常:rule_id 命中为 0,destination_hostgroup 非预期
- 复制/切换异常:monitor 相关日志出现 shun、read_only、lag
- 性能异常:queue、concurrency 增大,连接池 ConnUsed 长期接近上限
快速过滤:
# 近 5 分钟错误
tail -n 200 /var/log/proxysql/proxysql.log | egrep -i "error|warning|timeout|denied|shun"
# 关联某规则ID
grep "rule_id=10" /var/log/proxysql/proxysql.log | tail -n 20
6)系统级诊断工具联动
# 端口与连接状态
ss -ntp | grep 6033
# 进程文件句柄
pid=$(pidof proxysql)
lsof -p "$pid" | head -n 20
# 资源占用
top -p "$pid"
iostat -x 1 3
解释:确认监听正常、文件句柄是否耗尽、CPU/IO 是否成为瓶颈。
7)排错流程示例(连接异常)
步骤与命令:
# 1) 客户端连接失败,先看错误日志
tail -n 50 /var/log/proxysql/proxysql.log
# 2) 查看连接池状态
mysql -u admin -padmin -h 127.0.0.1 -P 6032 -e \
"SELECT hostgroup, srv_host, ConnUsed, ConnFree, ConnERR FROM stats_mysql_connection_pool;"
# 3) 验证后端连通性
mysql -u app -p'AppPass' -h 10.0.0.10 -P 3306 -e "SELECT 1;"
预期效果:
- 若后端连通性失败,问题在网络或 MySQL 本身;
- 若后端正常但连接池 ConnERR 增加,需检查 ProxySQL 用户/规则配置。
8)排错流程示例(路由不生效)
-- 1) 检查规则命中
SELECT rule_id, matches, hits, active, match_pattern
FROM stats_mysql_query_rules;
-- 2) 查看配置是否已加载到运行态
SELECT * FROM runtime_mysql_query_rules WHERE rule_id=10;
-- 3) 若未生效,重新加载
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
9)练习题(含预期结果)
- 练习1:将日志级别提升到 DEBUG,复现一次认证失败,再恢复到 INFO。
- 预期:proxysql.log 中出现 Access denied 相关记录,恢复后日志变少。
- 练习2:写一条规则匹配 SELECT 路由到读库,验证 stats_mysql_query_rules 命中。
- 预期:hits 增加且 destination_hostgroup 为读库组。
- 练习3:模拟连接池耗尽(将 max_connections 调小),观察 ConnERR 增加。
- 预期:日志出现 max connections,连接池统计有错误计数。
10)小结
通过日志、Admin 统计视图与系统级工具的组合,可以快速锁定问题归属(ProxySQL 配置、后端 MySQL、网络/系统资源),并形成可复现的排障闭环。