MySQL 8.0 迁移到 MariaDB 10.5 需要注意哪些兼容性问题?

文章导读
MySQL 8.0 迁移到 MariaDB 10.5 最核心的兼容性问题集中在字符排序规则(Collation)和认证插件上,必须将 MySQL 8.0 默认的 utf8mb4_0900_ai_ci 替换为 MariaDB 支持的 utf8mb4_unicode_ci,并确认应用驱动支持 caching_sha2_password 认证。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

MySQL 8.0 迁移到 MariaDB 10.5 最核心的兼容性问题集中在字符排序规则(Collation)和认证插件上,必须将 MySQL 8.0 默认的 utf8mb4_0900_ai_ci 替换为 MariaDB 支持的 utf8mb4_unicode_ci,并确认应用驱动支持 caching_sha2_password 认证。

先说结论:迁移可行但需手动修正 SQL 脚本,重点解决排序规则不识别和存储引擎差异问题。

  • 适合场景:希望降低授权成本或利用 MariaDB 特定优化,且业务能接受停机维护的迁移。
  • 先准备:全量备份数据,检查所有表的字符集排序规则和非 InnoDB 引擎。
  • 再验证:导入后核对表结构 Collation 字段,并测试应用连接认证是否通过。

命令速用版

导出 MySQL 8.0 数据后,使用 sed 批量替换不支持的排序规则和语法,再导入 MariaDB 10.5。

# 1. 导出时跳过触发器和表空间,减少兼容干扰
mysqldump `--skip-triggers` `--no-tablespaces` -u root -p mydb > mydb.sql

# 2. 批量替换 MySQL 8.0 特有排序规则为 MariaDB 通用规则
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' mydb.sql
sed -i 's/utf8mb4_0900_as_cs/utf8mb4_general_ci/g' mydb.sql

# 3. 移除 MySQL 8.0 隐藏主键语法,防止 MariaDB 报错
sed -i 's/INVISIBLE //g' mydb.sql

为什么会这样

MySQL 8.0 引入了基于 Unicode 9.0 的新排序规则,而 MariaDB 10.5 内核尚未集成该标准。utf8mb4_0900_ai_ci 是 MySQL 8.0 及以上版本专属的排序规则,MariaDB 10.5 及以下版本并不支持该规则,仅能识别 utf8mb4_unicode_ci 或 utf8mb4_general_ci 这类通用规则。此外,MySQL 8.0 默认认证插件变更为 caching_sha2_password,部分老旧驱动或配置可能导致连接失败。

分步处理

第一步:检查存储引擎
在 MySQL 8.0 源库执行查询,确保没有使用 MariaDB 不支持或非标准的引擎(如 Aria)。

SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys') AND ENGINE NOT IN ('MyISAM','InnoDB');

若查出非 InnoDB/MyISAM 引擎,需先转为 InnoDB。

MySQL 8.0 迁移到 MariaDB 10.5 需要注意哪些兼容性问题?

第二步:导出与清洗
使用 mysqldump 导出逻辑备份,不要加`--set-gtid-purged`=ON,因为低版本不识别该语句。导出后立即执行上述 sed 命令清洗 SQL 文件。

第三步:导入与配置
在 MariaDB 10.5 创建空库,导入清洗后的 SQL。检查 my.cnf 配置,注意连接管理、缓存设置等参数名称在两个数据库中可能有变化。

怎么验证是否生效

1. 验证排序规则
登录 MariaDB 执行 SHOW CREATE TABLE 表名,确认 COLLATE 字段已变为 utf8mb4_unicode_ci,无报错信息。

2. 验证应用连接
启动应用程序,观察日志是否有 Authentication plugin 'caching_sha2_password' cannot be loaded 错误。若有,需在 MariaDB 中为用户重置密码或更新驱动。

3. 验证数据完整性
对比源库和目标库的表行数,使用 CHECKSUM TABLE 命令校验关键表数据一致性。

常见坑

1. 排序规则报错中断
导入时会卡在第一条非法语句并报错退出,Unknown collation: 'utf8mb4_0900_as_cs'。不能依赖`--default-character-set` 参数,它只影响客户端连接,不改表定义中的 COLLATE,必须手动替换 SQL 文件。

MySQL 8.0 迁移到 MariaDB 10.5 需要注意哪些兼容性问题?

2. 虚拟列与检查约束
测试从 MariaDB 10.5 向 MySQL 8.0 的数据迁移时,需要特别关注虚拟列 (Virtual Column) 和检查约束 (Check Constraint) 的兼容性,反向迁移也需检查这些特性语法是否一致。

3. 整数显示宽度警告
MySQL 8.0 已弃用 INT(11) 显示宽度,虽然 MariaDB 10.5 通常兼容,但建议迁移时统一移除显示宽度定义,避免未来版本升级报错。

常见问题

导入时报 Unknown collation 错误怎么办?

必须在导入前用文本工具或 sed 命令将 SQL 文件中的 utf8mb4_0900_ai_ci 全部替换为 utf8mb4_unicode_ci。

应用连不上 MariaDB 报认证错误?

MySQL 8.0 默认使用 caching_sha2_password,若驱动过旧,需在 MariaDB 中执行 ALTER USER 用户@'%' IDENTIFIED BY '密码' 重置认证方式。

迁移后查询变慢是否正常?

公开资料中没有看到可靠的量化数据表明 MariaDB 10.5 一定比 MySQL 8.0 快或慢,需使用 EXPLAIN 命令检查查询计划,比较在两个数据库中的差异并根据需要进行索引调整。

参考来源

  • 数据库迁移踩坑实录:从排序规则不兼容到后台报错全解决(2025 年 11 月 5 日)
  • MySQL 迁移到 MariaDB 时注意事项(2024 年 12 月 2 日)
  • mysql 在迁移过程中解决数据库版本不兼容问题(2026 年 2 月 1 日)
  • VPS 服务器购买跨地域 MySQL 版本兼容的校验方案(2025 年 5 月 17 日)