作者:秦福朗
爱可生 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 之后,业务运行失常了。
五、结语
两个数据库的迁徙,不是看看网上的文档或者官网文档提到的兼容与不兼容项,操作就稳如泰山了,迁徙还是心愿能在全面测试的根底上联合官网文档,尽量做到发现各种细节上的不统一,再去做正式的迁徙,毕竟数据安全应用最重要。