生产环境从 MySQL 5.7 无缝升级到 MariaDB 10.5 需要注意哪些兼容性?
核心结论:MySQL 5.7 升级到 MariaDB 10.5 可直接卸载 MySQL 后用 MariaDB 启动并执行 mysql_upgrade 命令完成迁移,但需注意 MySQL 5.7 已于 2023 年 10 月结束生命周期 (EOL),迁移前必须处理存储引擎和默认值差异问题。
原因分析
MySQL 5.7 与 MariaDB 10.5 的兼容性差异主要源于三个技术层面:首先,存储引擎架构不同,MariaDB 用 Aria 引擎代替 MyISAM 引擎,从 MariaDB 10.4 开始所有系统表都默认使用 Aria 存储引擎,而 Aria 是 MariaDB 独有,MySQL 没有 PAGE_CHECKSUM 参数属性。其次,默认值推导规则存在差异,根据版本对比测试,MariaDB 10.1 中 varchar(N) 类型字段没有默认值,而 MySQL 5.7 的默认值是 NULL,MySQL 5.5、5.6 的默认值是空串''。第三,认证插件和 SQL 模式变更,MySQL 8.0 默认使用 caching_sha2_password,且 sql_mode 中 STRICT_TRANS_TABLES 和 ONLY_FULL_GROUP_BY 在 8.0 默认开启,这些在旧版本中需提前测试。
解决方案
1. 数据迁移路径选择
根据官方文档阐述,MySQL 5.7 升级为 MariaDB 10.5 非常轻松,不需要通过 mysqldump 命令导出和导入数据,只需要卸载 MySQL,再用 MariaDB 启动,然后执行 mysql_upgrade 命令即可。但需注意:若从 MySQL 8.0 迁移到 MariaDB 10.5,则必须基于 mysqldump 命令进行一次全库导出再导入操作,因为 MySQL 8.0 的数据格式变了。
2. 存储引擎参数调整
迁移过程中处理内部临时表时,需通过设置参数"default_tmp_storage_engine='Aria'"将 Aria 作为内部临时表存储引擎。如果临时表很多,则要增加 aria_pagecache_buffer_size 参数的值,该参数用于设置缓存数据和索引的大小,默认是 128MB。至于 key_buffer_size,建议设置为一个非常低的值 (比如 16KB),因为该值不被使用。
3. 默认值语法修正
在导入过程中若遇到 md5(uuid()) 报错,需注意 MySQL 中 default 子句中指定的默认值必须是文字常量,不能是表达式或函数,而 MariaDB 在 10.2.1 之后 default 可以与表达式或函数一起使用。解决方案是移除表结构中的函数默认值,改为在应用层处理。
4. 审计插件兼容性验证
根据兼容性验证表格,MySQL 5.7.33 与 MariaDB 10.1.34/10.1.41/10.1.48 的 server_audit.so 完全兼容 (√),但 MySQL 5.7.34 和 5.7.39 与这些 MariaDB 版本会出现 Crash(×)。若需使用审计插件,建议先验证具体版本组合,或修改源码后适配。
注意事项
1. GTID 复制不兼容:若 MariaDB 是主库,MySQL 是从库,在 GTID 模式下,从 MariaDB 同步复制数据时,GTID 与 MySQL 不兼容,大多数 MySQL 版本不允许从 MariaDB 中复制数据。
2. Binlog 格式差异:MariaDB 的 Binlog 默认采用 row 格式,而原生 MySQL 5.6 和原生 MariaDB 10.2.3 之前的版本,都默认采用 statement 格式,迁移前需确认复制配置。
3. PAGE_CHECKSUM 参数报错:导入过程中若出现"PAGE_CHECKSUM=1"语法错误,需知该参数只适用于 Aria 表,MySQL 没有此参数属性,需在导出时移除。
4. sql_mode 兼容性:应用测试执行 SQL 语句时若出现 select 后面查询的字段没有出现在 group by 中的报错,需检查 MySQL 的 sql_mode 设置,MariaDB 的 my.cnf 配置可能不直接适用于 MySQL。
5. 内存管理器优化:官方推荐使用的 jemalloc 内存管理器可以获取更好的性能,若使用 CentOS 系统,需要先安装 epel.repo 源,将参数加入 my.cnf 可使 jemalloc 在启动时生效。
参考来源
来源:Go-MySQL-Driver 官方文档 - Go-MySQL-Driver 版本兼容性终极指南:全面支持 MySQL 5.7+ 和 MariaDB
来源:腾讯云开发者社区 - 1.3 如何将 MySQL 迁移至 MariaDB 中 (2025 年 2 月 17 日收录)
来源:阿里云开发者社区 - 技术分享 | MariaDB 迁移到 MySQL 的部分注意事项 (2021 年 8 月 2 日发布)
来源:腾讯云开发者社区 - 技术分享 | MySQL5.7 与 MariaDB10.1 审计插件兼容性验证 (截至 2023 年 8 月 18 日)