技术分享 | MariaDB 迁移到 MySQL 的部分注意事项

作者:秦福朗

爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查。热爱 IT,喜欢在互联网里畅游,擅长摄影、厨艺,不会厨艺的 DBA 不是好司机,didi~

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


一、背景

MariaDB 的产生背景想必大家都知道,是由 MySQL 的创始人,在 MySQL 卖给 SUN 又被甲骨文收购后,以自己女儿名字命名的一款开源数据库。最初以其与 MySQL 的基本完全的兼容互通和免费开源受到大家的欢迎,甚至 CentOS7 都使用 MariaDB 替换了 MySQL 。所以关于 MariaDB 与 MySQL 的迁移的案例也较多,本公众号之前也有同事写过相关文章,有兴趣可以去看看,本篇写一下最近项目上遇到的迁移发生的问题及注意事项。

环境为 MariaDB 10.3 到 MySQL 5.7.25 。

二、简略操作过程

因 MariaDB 在5.5之后便不在跟随 MySQL 的版本号,所以5.5之后是以10.0.0为版本号起始,官方查询到 MariaDB 10.3 与 MySQL 5.7 是理论上可兼容的,项目操作者把 MariaDB 的 my.cnf 配置文件去掉了不存在 MySQL 中的部分参数,然后用此配置文件安装了 MySQL ,之后 mysqldump 了 MariaDB 的库表数据,导入到 MySQL中 (这是通常使用的迁移方式)。

三、导入数据报错

1、md5(uuid())

在导入过程中有报错信息如下:

从图中可看出导入过程中语法错误,MySQL 不识别 md5(uuid()),根据提示查看表结构:

可以看到主键列 instance_id 有个 default 属性,md5 函数嵌套 uuid 函数。在印象中没见过此种用法,遂以此为方向,去查看官方文档规定,如下:

  • MariaDB:

明确说明了,在10.2.1之后,default可以与表达式或函数一起使用。

  • MySQL:

可以看到 MySQL 中,default 子句中指定的默认值必须是文字常量,不能是表达式或函数。这里就解释了为什么会导入报错,MySQL 不支持 default 中有 md5(uuid())这种函数形式。

2、PAGE_CHECKSUM

从图中依旧可以看出是导入过程中有语法错误,MySQL 不识别“PAGE_CHECKSUM=1”,根据提示查看表结构:

可以看到 engine 为 Aria ,在 engine 的 default 的后面有此参数,查看 MariaDB 官方文档,如下:

可知,PAGE_CHECKSUM 只适用于 Aria 表,而与 MySQL 文档对比可知,Aria 引擎为 MariaDB 独有,MySQL 没有,所以 MySQL 也没有 PAGE_CHECKSUM 参数属性,所以此处会报错。

此 Aria 引擎是 MariaD B用来替换 Myisam 引擎的,甚至在10.4版本后连系统表都是此引擎,故在此之后的版本,更要注意该问题。

四、应用测试报错

应用测试执行 SQL 语句时报错如下:

从报错可知为比较经典的 select 后面查询的字段没有出现在 group by 中的例子,但 my.cnf 用的是 MariaDB 的,应该是没有变化才对,然后查看了 MySQL 的 sql_mode :

可以看到 ONLY_FULL_GROUP_BY 出现在其中,这可以解释为什么会报错的原因,但此参数在 MariaDB 中查询却没有,且 sql_mode 参数没有存在于 my.cnf 文件中,那又是为什么,此时继续查看官方文档(真好东西):

  • MySQL:

可以看到 MySQL 5.7 的 sql_mode 的默认值是包含 ONLY_FULL_GROUP_BY 参数的。

  • MariaDB:

在 MariaDB 中可以看到在10.2.4之后的 sql_mode 的默认值并不包含 ONLY_FULL_GROUP_BY 。

由此可以说明,sql_mode 没有配置在 my.cnf 文件中,部署了新的 MySQL 使用的便是 sql_mode 的默认值,所以此时 sql_mode 会包含 ONLY_FULL_GROUP_BY ,而业务程序 SQL 是以没有开启 ONLY_FULL_GROUP_BY 设计的,所以会在运行时产生报错。

修改了 sql_mode 之后,业务运行正常了。

五、结语

两个数据库的迁移,不是看看网上的文档或者官方文档提到的兼容与不兼容项,操作就稳如泰山了,迁移还是希望能在全面测试的基础上结合官方文档,尽量做到发现各种细节上的不一致,再去做正式的迁移,毕竟数据安全使用最重要。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个命令有一个错误,应该是: ``` rpm -qa | grep -i -E "mysql|mariadb" | xargs -n1 sudo rpm -e --nodeps ``` 具体解释如下: - rpm: Red Hat Package Manager,它是一种用于在 Red Hat 系统中安装、升级、删除软件包的工具。 - -qa: 查询已安装的软件包,其中 -q 表示查询软件包,-a 表示查询全部已安装的软件包。 - |: 管道符,将 rpm -qa 命令的输出作为下一个命令 grep 的输入。 - grep: 这是一个用于在文本中查找特定字符串的命令。 - -i: 在 grep 命令中表示忽略大小写。 - -E: 在 grep 命令中表示使用扩展正则表达式进行匹配。 - "mysql|mariadb": 这里是要查询的字符串,表示同时查询包含 mysqlmariadb 的软件包名称。注意,这里使用了双引号将 mysqlmariadb 括起来,表示将它们作为一个整体进行匹配。 - |: 再次使用管道符将 grep 命令的输出作为下一个命令 xargs 的输入。 - xargs: 一个命令行工具,可以将标准输入中的数据转换成命令行参数。在这里它的作用是将查询到的软件包名称传递给下一个命令进行卸载操作。 - -n1: 表示每次只传递一个参数给下一个命令。 - sudo: 以超级用户身份运行命令。 - rpm -e --nodeps: 卸载软件包,其中 -e 表示卸载软件包,--nodeps 表示忽略依赖关系,强制卸载软件包。 因此,整个命令的意思是查询已安装的 MySQLMariaDB 数据库软件包名称,并强制卸载它们。在卸载过程中,忽略软件包之间的依赖关系。注意,这个命令会卸载整个数据库软件包,包括数据库数据和配置文件等,所以在使用之前请确保已备份重要的数据库数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值