必须用SHOW GRANTS导出权限,而非查mysql.user表或phpMyAdmin导出;需处理认证插件差异、确保GRANT顺序正确、禁用NO_AUTO_CREATE_USER模式,且DEFINER/SQL SECURITY需单独补全。
导出用户权限SQL必须用SHOW GRANTS,不是从mysql.user表直接SELECT
phpmyadmin界面里点“用户账户”只能看到用户名、主机、全局权限勾选框,但这些ui字段不包含数据库级、表级权限,更不包含grant option或密码哈希细节。直接查mysql.user表会漏掉mysql.db、mysql.tables_priv等权限表里的规则,还原时权限必然不全。
正确做法是:在SQL标签页手动执行SHOW GRANTS FOR 'username'@'host';,逐个用户导出。如果用户多,用以下命令批量生成语句:
SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user != 'root';
复制结果执行,再全选所有GRANT语句粘贴保存为permissions.sql。
跨服务器迁移前必须处理IDENTIFIED WITH和密码哈希格式差异
MySQL 5.7+默认用caching_sha2_password插件,而旧版常用mysql_native_password。若目标服务器是8.0且未启用对应插件,导入GRANT语句时会报错ERROR 1410 (42000): You are not allowed to create a user with GRANT——本质是IDENTIFIED WITH子句不被识别。
- 检查源库用户认证方式:
SELECT user, host, plugin FROM mysql.user; - 若plugin为
caching_sha2_password,迁移前需在目标库启用该插件,或改用兼容方式创建用户:CREATE USER 'u'@'h' IDENTIFIED WITH mysql_native_password BY 'pwd'; - 避免用
SET PASSWORD语句,它不更新plugin字段,只改密码哈希
导入权限SQL时GRANT语句顺序不能乱,且要关掉sql_mode=NO_AUTO_CREATE_USER
MySQL 5.7.21+默认禁用GRANT隐式创建用户,所以先执行GRANT再CREATE USER会失败;反过来,如果用户已存在又执行CREATE USER则报错重复。实际操作中必须保证:
立即学习“PHP免费学习笔记(深入)”;
- 先用
CREATE USER(不含密码)建空用户,再用GRANT赋权(含WITH GRANT OPTION) - 目标服务器
sql_mode不能含NO_AUTO_CREATE_USER,否则GRANT ... IDENTIFIED BY语法被拒 - 导入前加
SET sql_mode = '';,避免模式限制干扰 -
FLUSH PRIVILEGES;不是必须的——GRANT语句本身会自动重载权限表
phpMyAdmin导出功能本身不支持权限导出,别点“导出”按钮
界面上的“导出”选项卡针对的是数据表内容,选中“用户账户”列表后点导出,实际只导出mysql.user等系统表的行数据,不是可执行的GRANT语句。这种SQL无法直接导入复原权限,因为缺少ON db.tbl范围声明、权限合并逻辑、以及角色关联信息(MySQL 8.0+)。
唯一可靠路径是:SQL标签页 → 手动SHOW GRANTS → 复制 → 本地保存 → 导入目标库。中间任何一步用“导出”按钮生成的文件都要丢掉。
最易忽略的是DEFINER和SQL SECURITY——视图、存储过程的权限依赖它们,但SHOW GRANTS不体现。这类对象得单独用SHOW CREATE VIEW等补全。











