一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

phpMyAdmin如何迁移MySQL 5.7到MySQL 8.0

时间:2026-08-07 11:26:55 编辑:袖梨 来源:一聚教程网

phpMyAdmin 不是迁移工具,直接导出再导入 MySQL 5.7→8.0 会因 SQL 兼容性断层失败;需手动清理导出文件:替换 DEFAULT CHARSET=utf8 为 utf8mb4、删除 mysql 库 INSERT 语句、修正 CREATE USER 语法、移除 NO_AUTO_CREATE_USER 等不兼容项,并导入前执行 SET NAMES utf8mb4。

phpMyAdmin 本身不是迁移工具,它只是数据库管理界面。直接用它“导出再导入”5.7 → 8.0,大概率失败——不是界面问题,而是底层 SQL 兼容性断层导致的。

phpMyAdmin 导出的 SQL 在 MySQL 8.0 上执行报错

常见错误包括:ERROR 1064 (42000)(语法错误)、ERROR 1292 (HY000)(隐式转换警告升级为错误)、ERROR 1054 (42S22)(Unknown column 'password' in 'field list')。这些都不是 phpMyAdmin 的 bug,而是它默认导出的语句含 5.7 特有结构:

  1. CREATE USER 语句带 PASSWORD 子句(8.0 已废弃,改用 IDENTIFIED WITH caching_sha2_password BY 'xxx'
  2. INSERT INTO mysql.user 直写 password 字段(8.0 表结构已改为 authentication_string
  3. DEFAULT CHARSET=utf8(实际是 utf8mb3,8.0 默认拒绝该声明,需显式写成 utf8mb4
  4. sql_mode 包含 NO_AUTO_CREATE_USER(8.0 已移除,导入时直接报错)

用 phpMyAdmin 迁移前必须手动清理导出文件

不能跳过这步。导出后打开 .sql 文件,逐项处理:

  1. 全局搜索替换:DEFAULT CHARSET=utf8DEFAULT CHARSET=utf8mb4(注意:只换建表语句里的,别动注释或数据值)
  2. 删掉所有 INSERT INTO `mysql`. 开头的语句(系统库严禁导入)
  3. CREATE USER 'xxx'@'%' IDENTIFIED BY 'xxx'; 改成:CREATE USER 'xxx'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx';(若应用不支持 caching_sha2_password
  4. 删掉 SET @@sql_mode= 开头的整行(尤其含 NO_AUTO_CREATE_USER 的)
  5. 检查是否有 TYPE=MyISAM,替换成 ENGINE=MyISAM(8.0 仍支持 MyISAM,但语法已变)

导入时必须指定字符集和兼容模式

即使改完 SQL,直接在 phpMyAdmin 界面导入仍可能失败。原因:phpMyAdmin 默认用 utf8 连接,而 8.0 要求连接层也用 utf8mb4

  1. 登录 phpMyAdmin 后,先执行:SET NAMES utf8mb4;(在 SQL 窗口运行一次)
  2. 导入页面勾选 “**忽略插入错误**”(否则单条 INSERT 失败会中断整个导入)
  3. 若提示 “Maximum execution time exceeded”,不要点重试——改用命令行:mysql -u root -p --default-character-set=utf8mb4 your_db

权限和用户必须单独重建

phpMyAdmin 导出的 SHOW GRANTS 结果无法直接在 8.0 执行。正确做法是:

  1. 导出用户权限用:SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user != 'mysql.infoschema';,然后逐条运行结果得到 grant 语句
  2. 复制这些 GRANT 语句,手动改成 8.0 兼容格式(比如去掉 WITH GRANT OPTION 后面的 MAX_QUERIES_PER_HOUR 0 等已弃用参数)
  3. 8.0 中创建用户必须显式指定插件:CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; GRANT SELECT ON db.* TO 'app'@'%';

真正卡住人的地方不在操作步骤多,而在「哪些语句要删、哪些要改、哪些看似无关实则致命」——比如一个没注意到的 password 字段 INSERT,会让整个 mysql.user 表损坏,后续所有用户都登不上。

热门栏目