proxysql 启动后无法连接 mysql 后端,因默认不自动添加节点,需手动插入 mysql_servers 表并执行 load mysql servers to runtime;读写分离需配置 mysql_query_rules 并加载;健康检测依赖 monitor 模块显式配置;配置持久化须同时执行 load to runtime 和 save to disk。

ProxySQL 启动后无法连接 MySQL 后端,报错 connection refused
常见原因是 ProxySQL 默认不自动添加后端节点,必须手动配置 mysql_servers 表并加载到运行时。它也不会主动探测端口连通性,仅依赖你填的 hostgroup_id 和 hostname/port 值。
实操建议:
- 先用
mysql -h127.0.0.1 -P6032 -uadmin -padmin连 ProxySQL 管理接口(默认 6032) - 执行:
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, max_connections) VALUES (1, '192.168.1.10', 3306, 100, 1000);
- 再执行:
LOAD MYSQL SERVERS TO RUNTIME;
(注意:不是SAVE,否则重启失效) - 确认连通性:
SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 5;
—— 若无记录或ping_error非空,说明网络/防火墙/MySQL bind_address 阻断了从 ProxySQL 所在机器到后端的 3306 连接
读写分离规则没生效,所有流量都打到同一组 hostgroup
ProxySQL 不靠 SQL 解析自动判断读写,而是靠 mysql_query_rules 匹配语句特征,再路由到对应 destination_hostgroup。默认规则为空,不配置就全走 default_hostgroup(即 mysql_servers 中 hostgroup_id 最小的那个)。
实操建议:
- 插入基础读写分离规则:
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES (1, 1, '^SELECT.*FOR UPDATE$', 0, 1), (2, 1, '^SELECT', 1, 1);
(假设写组是 0,读组是 1) - 注意
match_digest是正则,^SELECT会匹配所有 SELECT,包括SELECT @@version这类心跳语句,可能干扰健康检测;更稳妥可加NOT match_digest = '^SELECT.*FROM `sys`\.|information_schema|performance_schema',但需 ProxySQL ≥ 2.4.3 - 执行:
LOAD MYSQL QUERY RULES TO RUNTIME;
,然后用SELECT * FROM stats_mysql_query_rules;看hits是否增长 - 验证路由:用客户端执行
SELECT @@server_id;,再查stats_mysql_connection_pool中对应hostgroup的Connections_used是否变化
后端节点宕机后 ProxySQL 仍持续转发请求,直到超时
ProxySQL 自带的健康检测(monitor 模块)默认只检查 PING 和 read_only 状态,但不会主动 kill 已建立的连接;且 ping_interval 默认 10 秒、ping_timeout 默认 1 秒,若后端卡住但未断连,检测可能漏判。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
实操建议:
- 启用更激进的检测:
UPDATE global_variables SET variable_value='2000' WHERE variable_name='mysql-monitor_connect_timeout';
(单位毫秒),并确保mysql-monitor_username和mysql-monitor_password在mysql_servers表中已设好(否则 ping 失败不触发下线) - 设置故障转移延迟:
UPDATE mysql_servers SET max_replication_lag=30 WHERE hostgroup_id=1;
(对读组启用复制延迟检测,需后端开启SHOW SLAVE STATUS权限) - 关键点:检测结果只影响新连接路由,旧连接仍保留在连接池中;如需快速切断,需配合应用层重试 + 设置
mysql-server_max_connections限制单节点承载量
配置保存后重启 ProxySQL,读写分离失效
ProxySQL 分三层配置:内存(RUNTIME)、持久化内存(MEMORY)、磁盘(DISK)。LOAD ... TO RUNTIME 只生效于当前进程;SAVE ... TO DISK 才写入 proxysql.db 文件供重启加载。但默认配置文件(proxysql.cnf)中的 datadir 路径若被改过,或 proxysql.db 权限不对,重启后会回退到初始空配置。
实操建议:
- 每次修改后执行两步:
LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK;
(同理 query rules、users 等) - 检查
proxysql.db是否被写入:sqlite3 /var/lib/proxysql/proxysql.db "SELECT COUNT(*) FROM mysql_servers;"
应返回非零值 - 若使用 systemd 启动,确认
ExecStart中指定的--datadir与配置中一致,且该目录属主为运行 ProxySQL 的用户(如proxysql)
ProxySQL 的“自动”是假象,几乎所有行为都依赖你显式配置表、触发加载、验证状态;最常被忽略的是 TO RUNTIME 和 TO DISK 的区分,以及 monitor 模块权限和超时参数的实际效果。










