proxysql不能自动同步mysql权限,必须手动配置mysql_users表(填哈希密码、有效default_hostgroup、active=1)、mysql_query_rules规则,并执行load to runtime和save to disk双步生效,缺一不可。

ProxySQL 不能自动同步 MySQL 后端权限,也不能靠改个配置就“统一鉴权”或“一键过滤高危 SQL”——所有规则都得手动建、手动映射、手动加载,漏一步就白配。
为什么连 ProxySQL 报 Access denied,但直连后端 MySQL 没问题
根本原因:ProxySQL 完全不查 MySQL 的 mysql.user 表。它只认自己内存里 mysql_users 表中 active = 1 的记录。
-
password字段必须填哈希值,不是明文:MySQL 5.7+ 用authentication_string值(如*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9);MySQL 8.0+ 默认用caching_sha2_password,但 ProxySQL 只支持mysql_native_password插件,得先在后端执行ALTER USER 'xxx'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd' -
default_hostgroup必须指向一个真实存在的hostgroup_id(查mysql_server_groups确认),否则认证通过后也会在路由阶段静默失败,日志只显示模糊的Connection refused - 改完
mysql_users后,必须执行LOAD MYSQL USERS TO RUNTIME生效,再执行SAVE MYSQL USERS TO DISK持久化;漏掉任一环节,重启即丢失
如何让 app_user 统一连接,但按实际操作人走不同权限
这不是 ProxySQL 的职责,得靠 MySQL 原生的 PROXY 用户机制,在后端 MySQL 配置,ProxySQL 只负责透传连接。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 先在后端 MySQL 开启
check_proxy_users = ON(写入my.cnf并重启,或执行SET PERSIST check_proxy_users = ON) - 创建被代理用户,例如:
CREATE USER 'alice'@'%' IDENTIFIED BY 'xxx';再授权代理关系:GRANT PROXY ON 'alice'@'%' TO 'app_user'@'%';最后FLUSH PRIVILEGES - 客户端连接时必须显式声明目标:
mysql -uapp_user -p --proxy-user=alice;JDBC URL 加&proxyUser=alice(驱动 ≥ 8.0.22);Pythonmysql-connector-python用proxy_user='alice'参数 - 验证是否生效:登录后执行
SELECT USER(), CURRENT_USER(),前者应为app_user@client_ip,后者为alice@%——只有CURRENT_USER()决定权限
怎么拦截 DROP 和无 WHERE 的 DELETE
MySQL 原生权限拦不住:DROP 是库级,DELETE 授权后无法限制无 WHERE 全表删;而 ProxySQL 的 mysql_query_rules 可基于正则 + 上下文做前置拦截,不依赖后端权限。
- 匹配
DROP TABLE要加边界:用^DROP[[:space:]]+TABLE[[:space:]]+[a-zA-Z0-9_]+,避免误中ALTER TABLE DROP COLUMN - 拦截无
WHERE的DELETE:用^DELETE[[:space:]]+FROM[[:space:]]+[a-zA-Z0-9_]+[[:space:]]*;$,注意结尾分号和空格组合,避开带子查询或JOIN的合法语句 - 规则必须设
active = 1且apply = 1;destination_hostgroup必须与mysql_servers中已定义的hostgroup_id对得上,否则规则根本不触发 - 配置后必须执行
LOAD MYSQL QUERY RULES TO RUNTIME+SAVE MYSQL QUERY RULES TO DISK;测试时用真实 TCP 连接(如mysql -h 127.0.0.1 -P 6033),别用 Unix socket(mysql -S /tmp/proxysql.sock)——它绕过 query rules
最易忽略的一点:ProxySQL 的所有配置变更都是“两步走”——先 LOAD 到运行时生效,再 SAVE 到磁盘持久化。中间任何一步失败或遗漏,都会导致你以为配好了,其实没生效,或者重启后全丢。










