应使用 show grants for 'user'@'host' 查看真实权限,因其动态合并 global/db/table/column 所有显式授权,而直接查 mysql.user 表仅反映部分全局字段,漏掉分层权限、角色继承及 host 精确匹配要求。
直接查 mysql.user 表不准确,别信“全选”显示
phpmyadmin 在「用户账户」页展示的权限只是 mysql.user 表里的全局字段(如 select_priv、insert_priv),但 mysql 8.0+ 的权限是分层存储的:库级权限在 mysql.db,表级在 mysql.tables_priv,列级在 mysql.columns_priv。你看到某个用户“全局权限全勾了”,不代表它真能操作所有库——比如没给 myapp 库的 select,连那张表都查不了。
用 SHOW GRANTS 才算真实权限快照
SHOW GRANTS FOR 'user'@'host' 是 MySQL 服务端动态拼出的完整授权语句,把 global + db + table + column 所有显式授予的权限合并输出,比手动 JOIN 系统表更可靠,也避开字段兼容性问题。
- 在 phpMyAdmin 的 SQL 标签页执行:
SHOW GRANTS FOR 'root'@'localhost'; - 结果里含
GRANT ALL PRIVILEGES ON *.*且末尾带WITH GRANT OPTION→ 这才是真正拥有全部权限并可转授的用户 - 若只看到
GRANT SELECT, INSERT ON `test`.*类语句,哪怕mysql.user显示Super_priv=Y,实际也不具备全局管理能力 - 注意:执行该命令需当前登录账号有
SELECT权限查mysql库,否则报Access denied—— 不是 phpMyAdmin 限制,是 MySQL 本身权限要求
查所有用户是否含 ALL PRIVILEGES ON *.* 的快捷方式
想批量扫一遍谁有全库权限?别翻每个用户点「编辑权限」,直接跑这条 SQL:
SELECT User, Host FROM mysql.user WHERE Super_priv = 'Y' OR (Select_priv = 'Y' AND Insert_priv = 'Y' AND Update_priv = 'Y' AND Delete_priv = 'Y' AND Create_priv = 'Y' AND Drop_priv = 'Y');
但这只能筛出全局字段全开的用户,漏掉靠 mysql.db 授予全库权限的情况。更稳妥的做法是:
- 先用
SELECT User, Host FROM mysql.user;拿到所有账号 - 对每个
'user'@'host'执行SHOW GRANTS FOR 'user'@'host';(可写脚本批量) - grep 输出里是否含
ON *.*和ALL PRIVILEGES字样
容易被忽略的“伪全权”陷阱
有些用户看起来像管理员,其实权限链断在中间:
-
GRANT ALL ON *.* TO 'admin'@'%'但没加WITH GRANT OPTION→ 不能授权给别人,不算次级管理员 -
'admin'@'localhost'有全权,但应用连的是'admin'@'172.18.0.3'→ host 不匹配,权限为零 - MySQL 8.0+ 启用了角色(role),但 phpMyAdmin 不识别角色继承,
SHOW GRANTS仍只显示直接授予的权限 - 权限刚改完没执行
FLUSH PRIVILEGES,或 phpMyAdmin 右上角「Reload privilege tables」按钮点了但后端没生效(如 MariaDB 启用skip-grant-tables)
真正要确认一个用户是不是“拥有全部权限”,必须看 SHOW GRANTS 输出里有没有 ALL PRIVILEGES ON *.* 这一行,且 host 完全匹配连接时用的那个字符串——少一个字符,权限就无效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











