必须先启用角色支持才能执行create role,否则报error 3719;需由高权限用户执行set global activate_all_roles_on_login = on、grant role_admin on . to 'admin_user'@'%'及flush privileges,并持久化配置至my.cnf。

CREATE ROLE前必须先启用角色支持,否则报错ERROR 3719
直接执行 CREATE ROLE 'report_reader' 会失败,报 ERROR 3719 (HY000): 'role_admin'@'%' is not set as a role。这不是语法问题,而是 MySQL 8.0 默认关闭角色功能。必须由高权限用户(如 root)先运行:
SET GLOBAL activate_all_roles_on_login = ONGRANT ROLE_ADMIN ON *.* TO 'admin_user'@'%'FLUSH PRIVILEGES
注意:activate_all_roles_on_login 是动态变量,MySQL 重启后失效。生产环境务必写入 my.cnf 的 [mysqld] 段落并重启服务,否则每次重启后角色功能又“消失”。
只读角色必须显式包含information_schema权限,否则SHOW CREATE TABLE失败
只授 SELECT ON report_db.* 后,报表工具或 DBA 执行 SHOW CREATE TABLE sales_summary 仍会报 ERROR 1142 (42000): SELECT command denied。因为该语句底层依赖 information_schema.TABLES 表。
- 补授权:
GRANT SELECT ON `information_schema`.`TABLES` TO 'report_reader'@'%' - 若报表需字段注释或类型信息,还需:
GRANT SELECT ON `information_schema`.`COLUMNS` TO 'report_reader'@'%' - 禁止用
GRANT SELECT ON information_schema.*—— 范围过大,且部分表(如PROCESSLIST)需额外权限,反而引发安全风险
GRANT角色给用户 ≠ 权限生效,必须SET DEFAULT ROLE才可用
执行 GRANT 'report_reader'@'%' TO 'bi_user'@'10.20.%' 只是建立绑定关系,bi_user 登录后 CURRENT_ROLE() 返回 NULL,所有查询仍被拒绝。
- 必须紧接着执行:
ALTER USER 'bi_user'@'10.20.%' DEFAULT ROLE 'report_reader'@'%' - 该语句有三个硬性前提:执行者有
ROLE_ADMIN权限;'report_reader'@'%'已被明确授过权;'bi_user'@'10.20.%'已存在(哪怕只有USAGE) - 主机名必须完全匹配:角色是
'report_reader'@'%',就不能对'bi_user'@'localhost'设默认角色
验证只读权限是否真生效,不能只看SHOW GRANTS FOR
SHOW GRANTS FOR 'bi_user'@'10.20.%' 只显示 GRANT 'report_reader'@'%' TO ...,不会展开角色内部的 SELECT 权限——这不是配置失败,是 MySQL 的默认行为。
- 查真实权限:
SHOW GRANTS FOR 'bi_user'@'10.20.%' USING 'report_reader'@'%' - 确认激活状态:
SELECT CURRENT_ROLE(),返回非NULL值才算成功 - 查角色绑定关系:
SELECT * FROM mysql.role_edges WHERE to_user = 'bi_user' AND to_host = '10.20.%' - 旧版客户端(如 MySQL 5.7 客户端连接 8.0 服务端)可能忽略角色信息,建议用
mysql --version ≥ 8.0.11验证
最容易被跳过的断点是:设了默认角色但忘了先给角色授业务库和 information_schema 权限。这两步缺一不可,顺序也不能颠倒。











