phpmyadmin 4.9「导出所选用户」生成的sql不可直接执行,因其硬编码identified by明文密码、缺失create user语句、忽略认证插件及列级/角色权限,且不导出mysql.db等权限表内容。

phpMyAdmin 4.9 的「导出所选用户」功能生成的 SQL 不可直接执行,尤其在 MySQL 8.0+ 环境下大概率失败——它硬编码 IDENTIFIED BY 明文密码,却忽略认证插件、WITH GRANT OPTION、列级权限和角色权限。
为什么“导出所选用户”不能直接用
点击「用户账户」页勾选多个用户 → 「导出所选用户」,实际执行的是:SELECT * FROM mysql.user WHERE user IN (...),然后转成 INSERT INTO mysql.user 语句。问题在于:
- MySQL 8.0+ 的
authentication_string是哈希值,但导出语句写成IDENTIFIED BY 'xxx',触发ERROR 1827 - 不包含
CREATE USER语句,只含INSERT,而目标库若启用NO_AUTO_CREATE_USER(5.7.21+ 默认开启),会全量报错 -
plugin字段被原样插入,但目标库未启用对应插件(如caching_sha2_password)时,CREATE USER那行就卡死 - 完全不导出
mysql.db、mysql.tables_priv等权限表内容,列权限、过程权限、角色绑定全部丢失
手动拼接 CREATE + GRANT 才真正可控
绕过图形界面限制,直接在 phpMyAdmin 的「SQL」标签页运行查询,动态生成可执行语句:
SELECT CONCAT(
'CREATE USER ''', user, '''@''', host, ''' IDENTIFIED WITH ', plugin, ' BY ''', authentication_string, ''';',
' GRANT ', GROUP_CONCAT(privilege SEPARATOR ', '), ' ON ', db, '.* TO ''', user, '''@''', host, ''';'
) AS stmt
FROM (
SELECT u.user, u.host, u.plugin, u.authentication_string,
d.db,
CASE WHEN d.Select_priv = 'Y' THEN 'SELECT' END AS privilege
FROM mysql.user u
LEFT JOIN mysql.db d ON u.user = d.user AND u.host = d.host
WHERE u.user NOT IN ('root', 'debian-sys-maint')
AND d.db IS NOT NULL
) t
GROUP BY user, host, plugin, authentication_string, db;
- 这个查询只覆盖数据库级权限(
mysql.db),如需列级或过程权限,得额外JOIN mysql.columns_priv或mysql.procs_priv - 输出每行是完整可执行语句,复制粘贴进新环境即可运行
- 务必检查
plugin值是否与目标库兼容,不匹配时手动替换为mysql_native_password
导入前必须确认的三件事
哪怕你手动生成了正确 SQL,导入仍可能静默失败:
- 目标 MySQL 版本是否 ≥ 8.0?若是,确认
sql_mode中不含NO_AUTO_CREATE_USER(SELECT @@sql_mode查看) - 执行用户是否拥有
CREATE USER和GRANT OPTION权限?否则GRANT语句会跳过 - 所有
host值(如'%'、'localhost'、'192.168.1.%')在目标库是否允许连接?host不匹配会导致用户创建成功但无法登录
最易被忽略的是:导出语句里 FLUSH PRIVILEGES 不会自动执行,必须手动补上,否则权限变更不生效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











