SHOW GRANTS最直接查当前用户权限,加FOR子句可查其他用户;需联合查询mysql.user、mysql.db等表才能全面掌握权限;SELECT权限不等于能查所有表,受库级权限、大小写、视图权限等影响。

查看当前用户权限用 SHOW GRANTS
最直接的方式是查自己拥有的权限,执行 SHOW GRANTS 即可。它会返回当前登录用户的完整授权语句,比如:
SHOW GRANTS;如果想查其他用户(需有
SELECT 权限访问 mysql.user 表或具备 GRANT OPTION),可以加 FOR 子句:SHOW GRANTS FOR 'username'@'host';注意
'username'@'host' 必须和 mysql.user 表中记录完全一致,包括引号、大小写和主机名('localhost' 和 '127.0.0.1' 是两个不同用户)。
查所有用户及其权限要连查 mysql.user 和 mysql.db 等系统表
MySQL 的权限分散在多个系统表中:mysql.user(全局权限)、mysql.db(数据库级)、mysql.tables_priv(表级)、mysql.columns_priv(列级)。只看 user 表容易误判——比如某用户在 user 表里 Select_priv='N',但在 db 表里对某个库有 Select_priv='Y',那他依然能查那个库。
常用组合查询示例(仅查全局+库级):
SELECT u.User, u.Host, u.Select_priv, u.Insert_priv, u.Update_priv,<br> d.Db, d.Select_priv AS db_select, d.Insert_priv AS db_insert<br>FROM mysql.user u<br>LEFT JOIN mysql.db d ON u.User = d.User AND u.Host = d.Host<br>WHERE u.User != '';记得先
FLUSH PRIVILEGES 确保内存权限与磁盘一致,否则查到的可能是旧状态。
SELECT 权限不等于能查所有表
即使用户有 SELECT 权限,也可能因以下原因查不到数据:
- 没被授予对应数据库的访问权(
mysql.db表中该库记录缺失或权限为N) - 表名大小写敏感(Linux 下默认开启,
lower_case_table_names=0),而授权时用了错误大小写 - 使用了视图或存储过程,但缺少
EXECUTE或SELECT视图定义的权限 - 开启了
sql_mode=STRICT_TRANS_TABLES等模式,导致隐式权限检查更严格
SHOW DATABASES;,看是否列出目标库;再进库执行 SHOW TABLES;,确认能否看到表。
用 mysqlshow 命令行工具快速核验权限
不用进 MySQL 客户端,也能快速试探权限:
mysqlshow -u username -p -h host database_name如果提示
Access denied for user,说明连库级权限都没有;如果能列出库但报 ERROR 1142 (42000): SHOW command denied,说明有库访问权但缺 SHOW VIEW 或 SELECT 权限。这个命令特别适合运维批量检查,比写 SQL 更轻量。但注意:它不会显示具体哪些表/列受限,只能做粗粒度判断。
权限逻辑是叠加生效的,不是“全有”或“全无”。最容易忽略的是主机名匹配规则(比如 '%' 不匹配 'localhost')、大小写一致性、以及 FLUSH PRIVILEGES 是否真正执行成功——改完 mysql.user 表后忘记刷新,权限就永远不生效。










