首页/数据/数据库速查/代理用户与 mysql.proxies_priv 概念

代理用户与 mysql.proxies_priv 概念

代理用户允许一组账号以另一账号身份执行(服务层免密协作场景);企业内多系统共享连接时能避免密码扩散。

数据库速查数据更新于 2026-10-13

代理用户是什么

代理用户(proxy user)是 MySQL 的账号复用机制:客户端用代理账号完成认证,服务端却按被代理账号的身份与权限执行语句。应用连接串里的用户名口令可以不变,只调整被代理账号的权限,就能整体改变这组连接的权限范围。授权记录持久化在 mysql.proxies_priv 表里。

基本信息

适用平台MySQL 5.7 / 8.0,MariaDB 亦支持;云托管实例常被禁用
语法GRANT PROXY ON '目标账号' TO '代理账号'
通配写法''@'' 表示允许代理任意账号,范围最宽
存储位置mysql.proxies_priv 表
认证方式客户端仍使用代理账号自身的口令
查看授权SHOW GRANTS FOR '代理账号';或直接查 proxies_priv

典型使用场景

  • 多套系统共用一个权限基线:各自建代理账号,避免业务库口令扩散
  • 应用零改造切换权限来源,只改被代理账号的授权
  • 按调用方分配代理账号,便于区分来源做审计
  • 临时接入外部供应商,回收时只删代理账号即可
  • 同一个服务账号在高权与低权之间按环境切换

配置与回收

配置与回收
# 建代理账号,口令由连接串或密管系统注入
CREATE USER 'svc-a'@'10.0.%' IDENTIFIED BY '占位口令';
CREATE USER 'svc-b'@'10.0.%' IDENTIFIED BY '占位口令';

# 允许它们以只读账号身份执行
GRANT PROXY ON 'report_ro'@'%' TO 'svc-a'@'10.0.%';
GRANT PROXY ON 'report_ro'@'%' TO 'svc-b'@'10.0.%';

# 核对授权
SHOW GRANTS FOR 'svc-a'@'10.0.%';
SELECT user, host, proxied_host, proxied_user FROM mysql.proxies_priv;

# 回收:先撤代理授权再删账号
REVOKE PROXY ON 'report_ro'@'%' FROM 'svc-b'@'10.0.%';
DROP USER 'svc-b'@'10.0.%';

权限与审计要点

要点说明注意
权限来源执行期按被代理账号的权限判定不是代理与被代理账号取交集
身份函数CURRENT_USER() 是被代理账号,USER() 是代理账号审计需明确记录哪一个
授权范围ON 后写目标账号,可精确到主机''@'' 等于放开全部账号
存储表mysql.proxies_priv删账号后要确认记录已清理
可见性被代理身份出现在多数权限判断与日志中排查问题时要换位思考
代理机制在云数据库往往被禁用,方案评审阶段先实测能否建代理授权。多数业务用 8.0 的角色加上集中式账号管理就能满足需求,代理属于进阶用法,好处是连接串层面完全不需要改动。

易错点

  • 把代理账号的权限当成自身权限:实际完全跟随被代理账号,调整目标账号会同时影响所有代理它的连接
  • 用 ''@'' 放开任意代理:等于给该账号在所有账号之间切换身份的能力,生产环境禁止
  • 方案定稿前没验证云数据库支持度:托管实例常直接报错,实现阶段才发现要返工
  • 回收时只删代理账号不查 proxies_priv:残留授权记录会让审计结论出错
  • 用代理做权限隔离却忽略审计身份:日志里看到的是被代理账号,追责时容易指错人

数据来源与参考

  • MySQL 8.0 Reference Manual: Proxy Users

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌