权限表与实用查询是什么
MySQL 的账号与权限落在 mysql 系统库里:mysql.user 存账号级全局权限,mysql.db 存库级权限,mysql.tables_priv / columns_priv 存表列级权限,外键列出的 role_edges 记录角色授予关系。日常查看某一个账号用 SHOW GRANTS 最省事;要批量审计、跨账号比对时,直接查 information_schema 的权限视图比翻系统表更稳,因为系统表结构随版本变化很大。
基本信息
| 适用版本 | MySQL 5.7 / 8.0(8.0 数据字典重构,系统表列有变化) |
|---|---|
| 全局权限 | mysql.user(含密码策略与账号锁定状态) |
| 库表级权限 | mysql.db、mysql.tables_priv、mysql.columns_priv |
| 角色相关 | mysql.role_edges 记录「角色授予了谁」 |
| 推荐视图 | SHOW GRANTS FOR 'app'@'%'、information_schema.*_PRIVILEGES |
| 权限要求 | 读取系统库需要相应 SELECT 权限,通常只有 DBA 账号有 |
典型使用场景
- 账号盘点:列出所有账号、主机范围和认证插件,清理离职人员与历史测试账号
- 权限审计:导出某账号的完整权限链,核对是否符合最小权限原则
- 排查连不上:确认账号是否被锁定、密码是否过期、来源主机是否在白名单内
- 角色治理:查看角色授予关系,回收不再使用的角色绑定
- 发布前确认:检查应用账号是否只拿到了必要的库表权限
常用审计查询
常用审计查询
-- 账号清单与状态:注意 account_locked、password_expired
SELECT user, host, account_locked, password_expired, plugin FROM mysql.user ORDER BY user;
-- 单个账号的完整授权链(推荐,含角色展开)
SHOW GRANTS FOR 'app'@'10.%';
-- 角色授予关系
SELECT * FROM mysql.role_edges;
-- 表级权限批量检索
SELECT grantee, table_schema, table_name, privilege_type
FROM information_schema.table_privileges
WHERE grantee LIKE '%app%' LIMIT 20;
-- 库级权限检索
SELECT grantee, table_schema, privilege_type FROM information_schema.schema_privileges WHERE grantee LIKE '%app%';权限视图对照
| 视图 / 表 | 粒度 | 主要用途 |
|---|---|---|
| mysql.user | 全局 | 账号是否存在、是否锁定、认证插件与全局权限 |
| mysql.db | 库 | 库级授权,注意空库名通配的历史写法 |
| mysql.tables_priv | 表 | 表级明细,常用于收窄的临时授权 |
| information_schema.user_privileges | 全局 | 只读视图,跨版本列名更稳定 |
| information_schema.table_privileges | 表 | 按 grantee 批量筛选,写审计脚本用它 |
不要用 INSERT/UPDATE/DELETE 直接改 mysql 系统表:8.0 已改为数据字典管理,绕开语句修改可能造成元数据不一致;账号与权限一律走 CREATE USER / GRANT / REVOKE / ALTER USER。
FLUSH PRIVILEGES 只在直接改系统表之后才需要,正常用 GRANT/REVOKE 时 MySQL 会自动刷新内存权限表;把这个命令当作「万能解药」是常见的误解。