proxysql 用户权限和账号同步依赖手动映射后端 mysql 的 mysql.user 表到 proxysql 的 mysql_users 表,并执行 load mysql users to runtime 和 save mysql users to disk 生效。

ProxySQL 用户权限和账号同步靠什么机制
ProxySQL 本身不管理 MySQL 后端用户的权限,它只做连接路由和认证代理。账号同步不是自动的,而是靠你手动把后端 MySQL 的 mysql.user 表结构“映射”到 ProxySQL 的 mysql_users 表里——本质是两套独立账户系统,ProxySQL 只信任自己 mysql_users 表里配的那些账号。
常见错误现象:Access denied for user 'xxx'@'%' (using password: YES),但这个用户在后端 MySQL 能正常登录。原因往往是 ProxySQL 的 mysql_users 表没加、密码没对、或 active=0。
-
mysql_users表中的username和password必须与后端 MySQL 实际账号一致(注意:ProxySQL 不支持密码哈希自动同步,得自己填明文或 MySQL 5.7+ 的authentication_string哈希值) -
default_hostgroup必须指向一个已存在的mysql_server_groups中的hostgroup_id,否则登录会失败且无明确提示 - 改完
mysql_users后必须执行LOAD MYSQL USERS TO RUNTIME,再执行SAVE MYSQL USERS TO DISK,否则重启就丢
如何让 ProxySQL 用户和后端 MySQL 用户保持一致
没有内置同步工具,只能靠脚本或定时任务拉取后端账号并写入 ProxySQL。最轻量的做法是用 SELECT 查 MySQL 的 mysql.user,过滤掉系统账号(如 'root'@'localhost'),拼成 INSERT ... ON DUPLICATE KEY UPDATE 语句导入 ProxySQL。
使用场景:多实例共用一套 ProxySQL、DBA 批量创建账号后需快速透传到代理层。
- MySQL 8.0+ 注意
plugin字段,ProxySQL 只认mysql_native_password或caching_sha2_password(需 ProxySQL ≥ 2.4.0) - 避免同步
mysql.sys、information_schema相关账号,它们在 ProxySQL 里无意义 - 如果后端用了 PAM 或 LDAP 认证,ProxySQL 无法代理这类认证方式,账号必须是本地可验的
ProxySQL 的 mysql_users 表字段哪些不能乱设
几个关键字段一旦设错,会导致连接被静默拒绝或路由错乱,而且错误日志里往往只显示“connection reset”,不提具体字段问题。
参数差异直接影响行为:
-
active:为 0 时账号不可用,但不会报错,只会断连;排查时先查这个字段是否为 1 -
use_ssl:若后端 MySQL 强制 SSL,而这里设为 0,连接会失败,且错误码可能被 ProxySQL 吞掉 -
default_schema:若设了但后端不存在该库,部分客户端(如某些 JDBC 版本)会在初始化阶段报Unknown database -
transaction_persistent:设为 1 时,事务内所有语句强制发往同一 hostgroup,但若该 hostgroup 下无可用节点,会直接报错而非降级
为什么改了账号 ProxySQL 还不生效
最常踩的坑是混淆了 ProxySQL 的三层配置模型:MEMORY(运行时)、RUNTIME(生效中)、DISK(持久化)。只改 mysql_users 表本身,不做加载操作,等于没改。
性能影响:频繁执行 LOAD MYSQL USERS TO RUNTIME 不会影响查询性能,但会触发内部用户缓存重建,高并发建连瞬间可能有毫秒级延迟波动。
- 执行顺序必须是:先
INSERT/UPDATE到mysql_users表 → 再LOAD MYSQL USERS TO RUNTIME→ 最后SAVE MYSQL USERS TO DISK - 不要在生产环境用
LOAD MYSQL USERS FROM DISK替代TO RUNTIME,它只从磁盘读,不校验语法,容易带入脏数据 - ProxySQL 2.2+ 支持
admin_variables中设置mysql-users_auto_reload,但默认关闭,不建议开启——自动 reload 时机不可控,反而增加风险
真正麻烦的是跨版本兼容性:ProxySQL 2.0 的密码哈希格式和 2.4 不兼容,升级前必须导出 mysql_users 并重算密码字段,否则所有账号失效。










