mysql 5.7 不支持 create role,需用 proxies_priv 表模拟角色:启用 check_proxy_users 和 mysql_native_password_proxy_users 全局变量后,通过 grant proxy on 'role_user' to 'real_user' 实现权限继承,但仅单向、不叠加、需重连生效,且 host 必须完全匹配。

MySQL 5.7 没有 CREATE ROLE,硬写会报错
执行 CREATE ROLE 'reader' 或 GRANT 'reader' TO 'u1'@'%' 在 5.7 中直接触发 ERROR 1064 (42000)。角色是 MySQL 8.0+ 的语法特性,5.7 解析器根本不认识 ROLE 关键字。别试图“降级兼容”写法——不是语法微调问题,是根本不存在该功能层。
用 proxies_priv 表模拟角色:必须开两个全局变量
5.7 提供了 mysql.proxies_priv 表和代理机制,可实现“一个账号权限被多个账号继承”的效果,但前提是启用底层开关:
SET GLOBAL check_proxy_users = ON;SET GLOBAL mysql_native_password_proxy_users = ON;
这两个变量默认为 OFF,且仅在重启后或写入 my.cnf 并重启才持久生效。临时设置后不重启 MySQL,GRANT PROXY 会静默失败,SHOW GRANTS 看不到代理关系。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
GRANT PROXY 的权限流向是单向且不可叠加的
模拟角色的核心操作是:GRANT PROXY ON 'role_user' TO 'real_user';。这里要注意:
-
'role_user'是一个真实存在的普通用户(如report_role),它本身必须先被授予具体权限,比如GRANT SELECT ON sales.* TO 'report_role'@'%'; -
'real_user'(如analyst1)不能有自己的显式权限,否则proxies_priv不会覆盖;它的全部权限完全来自代理目标 - 一个用户只能代理一个角色用户,不支持多代理(如
GRANT PROXY ON a TO u; GRANT PROXY ON b TO u;第二条会覆盖第一条) -
SHOW GRANTS FOR 'real_user'输出里不会显示被代理的权限——得查SELECT * FROM mysql.proxies_priv WHERE User='real_user';才能看到映射关系
权限变更必须重连,且无法自动激活
给 'role_user' 新增 INSERT 权限后,已连接的 'real_user' 会话仍然只有旧权限。原因和角色一样:MySQL 只在连接建立时读取一次权限快照。但 5.7 没有 SET ROLE 或 activate_all_roles_on_login 这类机制,所以唯一办法是:
- 让应用主动断开重建连接
- 或强制所有用户重新登录(对线上服务不现实)
-
FLUSH PRIVILEGES对proxies_priv生效,但只刷新元数据,不改变已有连接的权限上下文
真正容易被忽略的是:代理权限不随 host 模糊匹配生效。比如 GRANT PROXY ON r TO u@'%',但 u@'192.168.1.100' 实际登录时若 host 字段在 mysql.user 里存的是 '192.168.1.%',代理关系就断了——proxies_priv 的 Host 列必须和登录时解析出的 host 完全一致。










