健康检查账号必须仅授予最小必要权限,即select on mysql.和replication client on .*,禁用process、shutdown等高危权限,且主机名需精确匹配proxysql服务器出口ip网段,避免因权限不足或过高导致探测失败或安全风险。

健康检查账号必须只具备最小必要权限,不能用 root 或业务账号凑合 —— 否则 ProxySQL 会因权限不足无法探测,或因权限过高引发安全风险。
为什么不能直接复用业务账号做健康检查
ProxySQL 的 monitor 模块默认执行 SELECT @@read_only 和 SELECT 1 等语句做心跳检测。如果账号没有 SELECT 权限,就会报错 Access denied for user 'xxx'@'%' to database 'mysql';如果账号有 REPLICATION CLIENT 以外的高危权限(比如 PROCESS、SHUTDOWN),等于把后端数据库的“探针”变成了“入口”。
- 业务账号通常带
GRANT OPTION或EXECUTE,而健康检查完全不需要 -
monitor模块不走 SQL 解析层,只依赖基础权限,USAGE不够用,必须显式授权 - MySQL 8.0 默认启用
caching_sha2_password插件,老版本客户端可能不兼容,需提前确认
正确授权语句(MySQL 8.0+)
在后端 MySQL 实例上执行以下命令,注意替换 monitor 和 monpass 为实际用户名和密码:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
CREATE USER 'monitor'@'192.168.0.%' IDENTIFIED BY 'monpass'; GRANT SELECT ON mysql.* TO 'monitor'@'192.168.0.%'; GRANT REPLICATION CLIENT ON *.* TO 'monitor'@'192.168.0.%'; FLUSH PRIVILEGES;
- 主机名必须写具体网段(如
192.168.0.%),不能用%—— ProxySQL 管理接口连接时会按 host 字段精确匹配 -
SELECT ON mysql.*是为了读取mysql.health_check视图(MySQL 8.0.33+)或performance_schema表,REPLICATION CLIENT是为了获取主从状态 - 不要授
SHOW DATABASES或PROCESS—— 这些权限对健康检查无用,且会被 ProxySQL 的mysql-monitor_username配置意外触发扫描
ProxySQL 端配置 monitor 用户
连上 ProxySQL 管理端口(mysql -uadmin -padmin -h127.0.0.1 -P6032),执行:
SET mysql-monitor_username='monitor'; SET mysql-monitor_password='monpass'; LOAD MYSQL VARIABLES TO RUNTIME; SAVE MYSQL VARIABLES TO DISK;
- 这组变量只影响
monitor模块自身连接后端的行为,和mysql_users表里的应用账号完全隔离 - 修改后必须
LOAD才生效,SAVE是为了重启后不丢失 —— 缺一不可 - 检查是否生效:
SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start DESC LIMIT 5;,看是否有success记录
常见失败现象与排查点
如果 ProxySQL 日志里持续出现 MySQL_Monitor: ping error 或 access denied,优先查这几项:
- 后端 MySQL 是否启用了
skip_networking?ProxySQL 必须走 TCP 连接,不能只靠 socket - 防火墙是否放行了从 ProxySQL 服务器到后端 MySQL 的端口(默认 3306)?
telnet 192.168.0.10 3306能通才行 - MySQL 的
max_connections是否被占满?健康检查账号也占用连接数,建议预留至少 10 个空闲连接 - ProxySQL 的
mysql-monitor_connect_timeout默认是 1 秒,网络延迟高时需调大,否则误判为宕机
真正容易被忽略的是:健康检查账号的 host 白名单必须和 ProxySQL 服务器真实出口 IP 匹配 —— 它不是从 localhost 发起的,而是从 ProxySQL 进程所在机器的网卡 IP 出去的。










