SHOW GRANTS 是 phpMyAdmin 5.1 中唯一准确反映当前会话实际权限的命令,不依赖界面状态、数据库选择或「全服务器」按钮,仅基于 CURRENT_USER() 加载的显式权限。

直接执行 SHOW GRANTS 不依赖界面状态
在 phpMyAdmin 5.1 中,SHOW GRANTS 是唯一能准确反映当前会话实际生效权限的命令。它不读取左侧数据库选择、不依赖当前 USE 的库,也不受顶部「全服务器」按钮是否点击的影响——只要连接成功,执行该语句就立刻返回 CURRENT_USER() 被加载的全部显式权限。
常见错误现象:
– 执行后只看到 GRANT USAGE ON *.* TO 'app'@'%':说明全局权限为空,但可能仍有某库或某表的权限(USAGE 不代表“没权限”,只是没授全局操作权)
– 报错 ERROR 1045 (28000): Access denied for user ... to database 'mysql':不是 SHOW GRANTS 本身的问题,而是你误在 SQL 标签页里先 USE mysql 或加了 -D mysql 参数
必须区分 USER() 和 CURRENT_USER()
phpMyAdmin 底层用的是你登录时提供的凭证,但 MySQL 实际匹配并加载权限的账户是 CURRENT_USER(),它由用户名 + 主机名精确组合决定。运行:
SELECT USER(), CURRENT_USER();
如果两者不一致(比如 USER() 是 'dev'@'192.168.10.5',而 CURRENT_USER() 是 'dev'@'%'),说明存在多个同名不同 host 的授权记录,SHOW GRANTS 显示的是后者权限。
立即学习“PHP免费学习笔记(深入)”;
想查“你声明自己是谁”的权限?得手动写:
SHOW GRANTS FOR 'dev'@'192.168.10.5';
但普通用户通常没这个权限,只有高权限账号才能执行带 FOR 的变体。
图形界面里的「权限」页不可信
phpMyAdmin 5.1 的「用户账户」→「编辑权限」页面显示的是「当前选中用户的全局+数据库级权限快照」,但它:
– 不包含表级、列级、存储过程或角色权限(MySQL 8.0+)
– 不显示 WITH GRANT OPTION 是否启用
– 不反映动态权限(如 BACKUP_ADMIN)
– 若用户权限来自角色(MySQL 8.0+),该页基本为空或仅显示部分继承项
真正有效的做法是:
– 切到顶部「SQL」标签页
– 粘贴并执行 SHOW GRANTS;
– 全选输出结果,复制保存为文本——这才是可审计、可比对、可迁移的权限事实
导出权限按钮只会漏掉关键细节
phpMyAdmin 5.1 右上角「导出所选权限」按钮生成的 SQL:
– 仅从 mysql.db 表提取数据库级权限,跳过 mysql.tables_priv 和 mysql.columns_priv
– 忽略所有列权限(例如 GRANT SELECT (id, name) ON app.users)
– 不含 CREATE USER 语句,也不带密码哈希或认证插件信息
– 若目标库是 MySQL 8.0+ 且未启用 caching_sha2_password,导入会直接失败
别信那个按钮。要还原权限,必须靠 SHOW GRANTS 输出逐条执行;要批量处理多个用户,得先用:
SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user;再把结果粘进 SQL 标签页执行——这才是 phpMyAdmin 5.1 下最接近“自动化”的可靠路径。



















