mysql 8.0精细化分配库表权限的核心是按需授予、层级收敛、拒绝通配;必须先create user再grant,禁用on .,限定到database.table层级,启用角色需set default role,且权限生效须重连并验证current_user()与current_role()。

MySQL 8.0 中精细化分配库表权限,核心是「按需授予、层级收敛、拒绝通配」——不能靠 GRANT SELECT ON *.* 偷懒,否则等于把 mysql 和 information_schema 系统库也开放了,既不安全,又容易因查不到系统表误判权限失效。
必须先 CREATE USER,再 GRANT(MySQL 8.0 强制要求)
直接 GRANT 会报错:ERROR 1410 (42000): You are not allowed to create a user with GRANT。8.0 不再允许隐式建用户。
- 先用
CREATE USER明确指定 host 范围,例如'reporter'@'10.20.30.%',避免用'%'开放全网 - 密码需满足
validate_password策略(如至少 8 位、大小写+数字+特殊字符),否则建用户失败 - 旧客户端兼容性问题?加
IDENTIFIED WITH mysql_native_password BY 'xxx',别依赖默认的caching_sha2_password - 建完立刻验证:
SELECT user, host, plugin FROM mysql.user WHERE user = 'reporter';
GRANT 必须限定到 database.table 层级,禁用 *.*
GRANT SELECT ON *.* 是最常见误操作:它不仅授权业务库,还把 mysql.user、performance_schema 全部暴露——而普通用户查这些表实际返回空,让人以为“权限没生效”。
- 只读报表账号:用
GRANT SELECT ON `sales_db`.* TO 'reporter'@'10.20.30.%';(注意反引号,库名含短横或关键字时必需) - 跨多个业务库?逐个写,例如再补一条
GRANT SELECT ON `crm_db`.* TO 'reporter'@'10.20.30.%'; - 敏感表要单独收紧:比如
REVOKE SELECT ON `sales_db`.`customer_pii` FROM 'reporter'@'10.20.30.%'; - 列级控制(极少数场景):
GRANT SELECT (name, email) ON `sales_db`.`customers` TO 'reporter'@'10.20.30.%';
权限是否生效?别只信 FLUSH PRIVILEGES
FLUSH PRIVILEGES 在 8.0+ 中不是万能钥匙,甚至可能掩盖真正问题。权限变更后是否立即可用,取决于三个关键点:
- 连接匹配的账号是否真被命中?执行
SELECT CURRENT_USER();看实际登录的是哪个user@host,'reporter'@'localhost'和'reporter'@'127.0.0.1'是两个账号 - 权限是否真的授给了那个账号?运行
SHOW GRANTS FOR CURRENT_USER();,不是CURRENT_USER()函数值,也不是SHOW GRANTS; - 已有连接不会自动继承新权限,必须重连;连接池(如 HikariCP)需配置
connection-init-sql=SET ROLE NONE或显式激活角色
用角色(ROLE)管理多用户权限更可靠,但必须 SET DEFAULT ROLE
角色不是“赋予权限就自动生效”。MySQL 8.0 的 CREATE ROLE 是权限包抽象,但用户拿到角色后默认不启用。
- 创建角色并授权:
CREATE ROLE 'read_only_sales'; GRANT SELECT ON `sales_db`.* TO 'read_only_sales'; - 绑定用户:
GRANT 'read_only_sales' TO 'reporter'@'10.20.30.%'; - 关键一步:必须执行
SET DEFAULT ROLE 'read_only_sales' TO 'reporter'@'10.20.30.%';,否则登录后权限为空 - 验证角色是否激活:
SELECT CURRENT_ROLE();,返回'read_only_sales'才算成功
最容易被忽略的是 host 匹配细节和角色默认激活——这两个点卡住 80% 的线上权限调试。权限不是“设完就跑”,而是“建对账号、授对范围、连对 host、启对角色”。











