phpmyadmin无法一键导出所有用户权限明细表,需通过sql查询mysql系统表或执行show grants获取完整权限;直接查mysql.user会遗漏库级、表级等细粒度权限;最可靠方式是用mysqldump结合show grants生成标准可执行的grant语句清单。
phpmyadmin 本身不提供“导出所有用户权限明细表”的一键功能
它只允许你逐个查看用户权限(通过 users 标签页点击某行的 edit privileges),但无法直接导出全部用户的 grant 语句或结构化权限列表。想拿到完整权限明细,必须绕过界面,走 sql 查询 + 导出流程。
用 SELECT 查询 mysql.user 表只能看到全局权限字段
mysql.user 表只存了 Select_priv、Insert_priv 等布尔型全局权限字段,不包含数据库级、表级、列级等细粒度授权信息。真正完整的权限记录分散在多个系统表中:
-
mysql.db:库级权限 -
mysql.tables_priv:表级权限 -
mysql.columns_priv:列级权限 -
mysql.procs_priv:存储过程/函数权限
直接查 mysql.user 会漏掉大量实际生效的权限,尤其当 DBA 用 GRANT ... ON db.* TO 'u'@'h' 授权时。
最可靠的方式:用 mysqldump + SHOW GRANTS 生成可读权限清单
在服务器命令行执行以下操作(需有 SELECT 权限访问 mysql 库,且能执行 SHOW GRANTS):
mysql -Nse "SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user != 'mysql.session' AND user != 'mysql.sys'" | mysql -N | sed 's/$/;/g' > all_grants.sql
说明:
-
-N去掉列名,-s去掉分隔符,确保输出是纯 SQL 语句 - 过滤掉系统内置用户(
mysql.session、mysql.sys),避免报错 -
sed 's/$/;/g'给每行末尾补上分号,方便后续导入或阅读 - 导出的
all_grants.sql是标准GRANT语句集合,可直接被 MySQL 执行,也便于人工审计
如果必须从 phpMyAdmin 界面触发,可把上面那条命令的查询结果粘贴进 SQL 标签页执行(先去掉 | mysql -N 那段,只留前面的 SELECT CONCAT(...)),再手动复制结果去执行 SHOW GRANTS —— 但超过 20 个用户就容易出错。
导出成 CSV 表格需额外拼接字段,且无法反映嵌套权限逻辑
若硬要导出为带列头的 CSV(如用户名、主机、数据库、权限类型),得写多表 JOIN 查询,例如:
SELECT u.User, u.Host, d.Db, CONCAT_WS(',', d.Select_priv, d.Insert_priv) AS DbPrivs
FROM mysql.user u
LEFT JOIN mysql.db d ON u.User = d.User AND u.Host = d.Host
WHERE u.User NOT IN ('mysql.session', 'mysql.sys');
但这类查询有明显缺陷:
- 权限字段是
'Y'/'N'字符串,不是可读的SELECT,INSERT - 无法合并同一用户在不同层级(全局+库+表)的权限,易误判实际能力
- phpMyAdmin 导出 CSV 时对换行、逗号、单引号处理不稳定,可能损坏数据
真正需要审计权限时,SHOW GRANTS 输出才是唯一权威来源 —— 它反映的是 MySQL 实际校验时使用的权限规则,而不是某张表里的静态快照。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











