ERROR 1064说明MySQL版本低于8.0.1,角色功能不支持;ERROR 3719需先执行SET GLOBAL activate_all_roles_on_login = ON并授予ROLE_ADMIN权限,再FLUSH PRIVILEGES持久化。

CREATE ROLE 报错 ERROR 1064 或 ERROR 3719 怎么办
直接执行 CREATE ROLE 就报错,大概率不是语法写错了,而是环境没准备好。
-
ERROR 1064:说明 MySQL 版本低于 8.0.1 —— 角色功能从 8.0.1 才正式引入。运行SELECT VERSION();确认,若输出是5.7.32或类似,就别用角色,老实用GRANT SELECT ON db.* TO 'u'@'%'; -
ERROR 3719(提示'role_admin'@'%' is not set as a role):说明角色支持未启用。必须由 root 或高权限用户先执行:SET GLOBAL activate_all_roles_on_login = ON;和GRANT ROLE_ADMIN ON *.* TO 'admin_user'@'%';,再FLUSH PRIVILEGES; - 持久化防重启失效:在
my.cnf的[mysqld]段加一行:activate_all_roles_on_login=ON - 角色名必须用单引号,如
'app_reader';写成`app_reader`或"app_reader"可能触发语法错误
GRANT 权限给角色 vs GRANT 角色给用户,两步不能跳
很多人以为“给角色授了权,再把角色给用户”,权限就自动生效了——其实这是两个独立动作,缺一不可,且顺序不能反。
- 第一步(填充角色):
GRANT SELECT, INSERT ON app.* TO 'app_writer';—— 这是对角色本身赋权,对象是角色名(带单引号),不是用户 - 第二步(绑定用户):
GRANT 'app_writer' TO 'dev_user'@'%';—— 这只是建立关联,mysql.role_edges表里多一条记录,但用户登录后仍无权限 - 角色不支持列级授权:
GRANT SELECT(col1) ON t1 TO 'r1';会直接报错 - 角色名含
-或.(如ci-pipeline),必须用反引号:GRANT SELECT ON logs.* TO `ci-pipeline`; - 系统级权限可授给角色(如
CREATE, DROP ON *.*),但加WITH GRANT OPTION会报ERROR 3529;要用WITH ADMIN OPTION控制角色分发权
SET DEFAULT ROLE 是权限生效的临门一脚
执行完前两步后,用户登录仍被拒,SELECT CURRENT_ROLE(); 返回 NULL,问题几乎一定出在这步没做。
-
SET DEFAULT ROLE 'app_writer' TO 'dev_user'@'%';—— 让该用户每次连接自动激活指定角色(注意 host 必须精确匹配,'dev_user'@'%'不能对'dev_user'@'localhost'设默认角色) - 普通用户无法自行执行
SET DEFAULT ROLE,需管理员具备APPLICATION_PASSWORD_ADMIN或SYSTEM_VARIABLES_ADMIN权限 -
SET DEFAULT ROLE ALL TO 'dev_user'@'%';会激活所有已授予角色,但违背最小权限原则,慎用 - 用户自己执行
SET ROLE 'app_writer';仅当前会话有效,且需要ROLE_ADMIN权限,或管理员已通过GRANT PROXY ON 'app_writer' TO 'dev_user'@'%';显式放行
SHOW GRANTS 看不到角色权限?查法不对
SHOW GRANTS FOR 'dev_user'@'%'; 输出为空或只有 GRANT 'app_writer' TO ...,不代表权限没配好——这是 MySQL 默认行为,它不展开角色继承链。
- 查角色本身有哪些权限:
SHOW GRANTS FOR 'app_writer'; - 查该角色带给用户的实际权限:
SHOW GRANTS FOR 'dev_user'@'%' USING 'app_writer'; - 确认当前会话是否激活:
SELECT CURRENT_ROLE();,返回NULL就说明根本没生效 - 查用户被授予了哪些角色:
SELECT * FROM mysql.role_edges WHERE to_user = 'dev_user' AND to_host = '%'; - 旧版客户端(如 MySQL 5.7 客户端连 8.0 服务端)可能忽略角色信息,建议用
mysql --version ≥ 8.0.11验证
真正卡住人的地方,从来不是某条命令写错,而是漏掉其中一环:没启角色支持、没给角色赋权、没绑定用户、没设默认角色、或者验证时用了错误的 SHOW GRANTS 语法。流程上少一步,权限就停在半路。


















