MySQL 8.0角色功能需四步闭环才能生效:开启全局开关、授予ROLE_ADMIN、刷新权限、设置默认角色;缺一环则权限不生效,且角色变更仅对新登录用户即时生效。

MySQL 8.0 的角色功能本身不简化分配,它只简化后续变更;但前提是四步闭环全部走完——缺一环,所有用户都拿不到权限,哪怕 SHOW GRANTS 看起来正常。
CREATE ROLE 报 ERROR 3719 是因为全局开关没开
直接执行 CREATE ROLE 'dev_role' 大概率失败,错误是 ERROR 3719 (HY000): 'role_admin'@'%' is not set as a role。这不是语法错,而是 MySQL 8.0 默认关闭角色支持。
- 必须由 root 或高权限用户先运行:
SET GLOBAL activate_all_roles_on_login = ON; - 再授予权限:
GRANT ROLE_ADMIN ON *.* TO 'admin_user'@'%'; - 立即刷新:
FLUSH PRIVILEGES; - 生产环境务必写入
my.cnf持久化,否则重启后失效:[mysqld]\nactivate_all_roles_on_login=ON
给角色授权限时别用 ALL PRIVILEGES
开发环境常误授 ALL PRIVILEGES,但实际只需最小集:建表、改结构、读写数据、执行存储过程。过度授权会绕过审计、放大误操作风险。
- 推荐组合:
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX, EXECUTE ON `dev_%`.* TO 'dev_role'; - 数据库名必须用反引号包裹通配符:
`dev_%`才能匹配所有以dev_开头的库(MySQL 8.0 支持) - 严禁对
mysql、information_schema等系统库授权 - 如需创建用户,单独加:
GRANT CREATE USER ON *.* TO 'dev_role';(慎用)
批量分配角色不能靠一条 SQL 完成
MySQL 不支持 GRANT 'dev_role' TO 'u1','u2','u3' 这类语法。必须逐条生成或脚本驱动,且每个用户的 Host 必须精确匹配。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 确认用户存在:
SELECT User, Host FROM mysql.user WHERE User LIKE 'dev_%' AND Host = '10.20.%'; - 生成批量语句(用
CONCAT):SELECT CONCAT('GRANT dev_role TO ''', User,'''@''', Host,''';') \nFROM mysql.user \nWHERE User LIKE 'dev_%' AND Host = '10.20.%'; - 导出后执行:
mysql -u root -p - 用户名含特殊字符(如
dev-team)必须用反引号:GRANT dev_role TO `dev-team`@'10.20.%';
SET DEFAULT ROLE 是权限真正生效的临门一脚
即使 GRANT 'dev_role' TO 'dev_a'@'10.20.%' 执行成功,用户登录后仍无任何开发权限——因为角色默认不激活。
- 必须显式执行:
SET DEFAULT ROLE 'dev_role' TO 'dev_a'@'10.20.%'; - 若用户有多个角色,可设为默认全部激活:
SET DEFAULT ROLE ALL TO 'dev_a'@'10.20.%';(违背最小权限原则,慎用) -
SET DEFAULT ROLE需要SYSTEM_VARIABLES_ADMIN权限,普通用户无法自行执行 - 验证是否生效不能只看
SHOW GRANTS FOR 'dev_a'@'10.20.%'(它不展开角色继承链),应查:SHOW GRANTS FOR 'dev_a'@'10.20.%' USING 'dev_role'; - 确认当前会话是否激活:
SELECT CURRENT_ROLE();,返回非NULL值才算成功
最容易被忽略的是:角色权限变更后,老用户不会自动继承——必须等他们下次登录(或手动 SET ROLE)才生效;而新用户只要绑定了角色且设置了默认角色,就能立刻获得最新权限。这点在紧急修复权限漏洞时特别关键。










