跳转到主内容
极星编程网:以代码为星,赴技术山海!

mysql如何通过ProxySQL实现权限路由_在中间件层配置用户映射

ProxySQL不自动继承MySQL权限,需手动配置mysql_users表(password用哈希值、default_hostgroup指向真实hostgroup、active=1)、执行LOAD/SAVE同步,并通过mysql_query_rules实现SQL级拦截;不支持PROXY用户透传。 ProxySQL 本身不继承 MySQL 后端权限,所谓“中间件层权限路由”不是自动映射,而是靠你手动把用户、密码、默认路由组、SQL 拦截规则四者配齐,缺一不可。 mysql _users 表必须填对 password 和 default_hostgroup 直接连 ProxySQL 报
Access denied
,但连后端 MySQL 没问题?大概率是
mysql_users
表里填错了这两项:
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
或
mysql_servers
确认),否则认证成功也会在路由阶段静默失败,日志只显示模糊的
Connection refused
账号状态必须是
active = 1
,否则 ProxySQL 直接忽略该记录 LOAD 和 SAVE 必须成对执行,否则重启就丢 改完
mysql_users
后,仅执行
INSERT
不生效。ProxySQL 的三层配置模型(
RUNTIME
/
MEMORY
/
DISK
)决定了你必须显式同步: MySQL(Linux) MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。 下载
LOAD MYSQL USERS TO RUNTIME
:让新配置立即生效,影响当前连接
SAVE MYSQL USERS TO DISK
:写入
proxysql.db
SQLite 文件,保证重启不丢失 漏掉任一环节,要么不生效,要么重启后恢复旧配置 权限路由 ≠ 权限下放,SQL 级拦截得靠 mysql_query_rules 仅靠
mysql_users.default_hostgroup
只能控制“默认发往哪组”,无法实现“只允许 SELECT、禁止 DROP”。真要限制操作类型,必须配
mysql_query_rules
: 用
match_digest
匹配语句模式,比如
'^SELECT '
或
'^INSERT '
用
destination_hostgroup
显式指定目标组(覆盖
default_hostgroup
) 用
error_msg
拦截并返回自定义错误,例如:
insert into mysql_query_rules(rule_id,active,match_digest,error_msg,apply) values(1000,1,'^DROP ','Operation not allowed',1)
规则顺序很重要:
apply=1
表示匹配后终止匹配,
apply=0
继续往下比;务必把精确规则放前面 别指望 ProxySQL 做 PROXY 用户透传 想让应用统一用
app_user
连 ProxySQL,再由 ProxySQL 根据实际操作人身份走不同后端权限?这超出了 ProxySQL 能力范围。它不解析客户端连接时带的
PROXY
用户信息,也不转发
CURRENT_USER()
上下文。这类需求必须回到 MySQL 原生机制:
CREATE PROXY user
+
GRANT PROXY ON ...
,并在后端开启
check_proxy_users
,ProxySQL 只负责原样透传连接。

相关文章