查 INFORMATION_SCHEMA.USER_PRIVILEGES 可验证全局权限是否加载成功,若 COUNT(*) 为 0,说明权限元数据损坏或系统库未正确迁移,应优先检查 mysql.user 表及执行 mysqld --upgrade=FORCE。

查 INFORMATION_SCHEMA.USER_PRIVILEGES 看全局权限是否加载成功
升级或重装 MySQL 后,USER_PRIVILEGES 表可能为空或字段值异常(如 PRIVILEGE_TYPE 为 NULL),说明权限系统未初始化完成。这不是业务数据问题,但会导致后续所有基于 INFORMATION_SCHEMA 的权限校验失效。
执行:
SELECT COUNT(*) FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE GRANTEE = CURRENT_USER();若返回 0,即使能连上库,也大概率是权限元数据损坏或
mysql 系统库未正确迁移。此时应优先检查 mysql.user 表是否可读、mysqld --upgrade=FORCE 是否已执行,而不是直接排查应用连接配置。
用 SCHEMA_PRIVILEGES 校验库级授权是否生效
SCHEMA_PRIVILEGES 是验证“用户对某库是否有 SELECT/INSERT 权限”的最直接依据,但它不反映动态权限(如 8.0+ 的 APPLICATION_PASSWORD_ADMIN)或角色继承关系。
常见误判点:
- 查询时必须写全
GRANTEE格式,例如'app_user@192.168.1.%',不能只写用户名; - 结果中
IS_GRANTABLE为NO不代表没权限,只是不能转授; - 如果目标库名含下划线或特殊字符,
TABLE_SCHEMA字段需用反引号包裹再比对,否则 LIKE 匹配会漏掉; - 跨版本升级后,该表的
PRIVILEGE_TYPE可能从SELECT变成SELECT,LOCK TABLES(合并显示),需做字符串包含判断而非完全相等。
依赖 TABLE_PRIVILEGES 前先确认表是否存在且可访问
想验证“用户能否查某张业务表”,很多人直接查 TABLE_PRIVILEGES,但这个表本身需要用户有对 information_schema 的 SELECT 权限——形成循环依赖。更可靠的做法是:先用最小化查询试探权限,再查系统表佐证。
推荐组合验证:
- 第一步:执行
SELECT 1 FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_db' AND TABLE_NAME = 'your_table' LIMIT 1; - 第二步:若成功,再查
TABLE_PRIVILEGES确认具体权限项; - 若第一步报错
ERROR 1142 (42000): SELECT command denied,说明连元数据都不可见,TABLE_PRIVILEGES就不必查了; - 注意:MySQL 8.0.23+ 对
TABLE_PRIVILEGES增加了列级权限字段COLUMN_NAME,旧版代码若未兼容该字段,SELECT *可能因列数不匹配抛出异常。
KEY_COLUMN_USAGE 和 TABLE_CONSTRAINTS 能暴露外键与索引权限盲区
很多校验只关注 DML 权限,却忽略 DDL 相关元数据访问能力。比如用户有 SELECT 权限,但查不到外键定义,就无法在应用层做关联预检或生成 ER 图。
关键检查逻辑:
- 执行
SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = 'db' AND TABLE_NAME = 't1',若返回空但实际存在外键,说明用户缺少对KEY_COLUMN_USAGE的访问权(常见于只授予SELECT但未显式给INFORMATION_SCHEMA权限); -
TABLE_CONSTRAINTS.CONSTRAINT_TYPE值为FOREIGN KEY时,UPDATE_RULE/DELETE_RULE字段在 5.7 和 8.0 中默认值不同(RESTRICTvsNO ACTION),若校验脚本硬编码比对,会误报不一致; - 这两个表在 MySQL 8.0.30+ 开始支持隐藏列(如
_tidb_rowid),但普通账号默认查不到,需额外授权SELECTonINFORMATION_SCHEMA才能完整呈现。
真正容易被跳过的不是语句怎么写,而是校验前没确认 information_schema 本身是否处于可用状态——它不像业务库会主动报错,而是在你查 TABLES 或 COLUMNS 时静默返回空集,让你误以为“权限没问题,只是表不存在”。


















