mysql 8.0+ 须用角色实现批量权限重置:先 create role,再 grant 权限给角色,最后 grant 角色给多个用户;5.7 及更早版本只能脚本生成 grant/revoke 语句逐条执行。

确认 MySQL 版本决定能走哪条路
执行 SELECT VERSION(); —— 如果结果小于 8.0.0,角色(ROLE)功能不存在,硬写 CREATE ROLE 会直接报错 ERROR 1064 (42000)。此时所谓“批量重置”只能靠脚本生成一堆 GRANT/REVOKE 语句逐个执行,没有真正意义上的统一模板。别跳过这步,否则后面所有操作都白忙。
MySQL 8.0+:用角色实现权限重置,三步缺一不可
角色不是声明完就自动生效的配置项,必须严格按顺序完成创建 → 授权 → 绑定:
-
CREATE ROLE 'dev_team';(角色名必须加单引号,且需显式创建) -
GRANT SELECT, INSERT, UPDATE ON app_db.* TO 'dev_team';(ON后必须写明库名,ON *.table是非法语法) -
GRANT 'dev_team' TO 'alice'@'%', 'bob'@'%', 'charlie'@'%';(可一次绑定多个用户,但主机名必须精确匹配,'dev'@'192.168.%'和'dev'@'10.%.%'是不同账号)
漏掉任意一步,后续 SET ROLE 或权限检查都会失败。特别注意:GRANT 对角色授予权限时,不带 WITH GRANT OPTION 就无法转授;也不建议给开发角色加 GRANT OPTION,安全风险高。
重置权限 = 改角色定义,不是改用户列表
真正“批量重置”的核心逻辑是:后续所有权限调整只动角色,不动用户绑定关系。比如团队要禁用 DROP 权限:
REVOKE DROP ON app_db.* FROM 'dev_team';- 不用再对每个用户执行
REVOKE DROP ON app_db.* FROM 'alice'@'%';等重复操作 - 所有已绑定该角色的用户,下次新建连接或执行
SET ROLE 'dev_team';就立即生效
但要注意:角色权限不会自动扩展到未来新建的数据库。例如之后建了 archive_db,得单独执行 GRANT SELECT ON archive_db.* TO 'dev_team';,否则开发连不上。
权限变更后用户仍报错?不是没生效,是连接没刷新
执行完 GRANT 'dev_team' TO ... 后,已有连接不会自动获得新权限——MySQL 只在连接建立时加载一次权限快照。常见现象:
- DBA 在终端执行完授权,开发刷新页面仍报
ERROR 1142 (42000): SELECT command denied - 应用用 HikariCP 这类连接池,重启前一直走旧权限
解决方法分两类:
- 对单个会话:登录后手动执行
SET ROLE 'dev_team'; - 对所有新连接:执行
SET PERSIST activate_all_roles_on_login = ON;(推荐,避免每次手动激活)
FLUSH PRIVILEGES 对角色权限完全无效,别浪费时间执行它。











