多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第1张图片

引入:写在前面的话,每一篇摘文都以实际案例场景出发,周末抽空余时间记录每一次mark历程,在不一样的业务实际场景下,针对项目阶段所产生的变化,制定不一样的技术方案。不论多么渺小的技术方案,放在其对应的场景下都有着不一样的意义。实践是检验真理的唯一标准,当真正实操过后参与讨论,或许这会让你有一点新发现,希望对读者在思考上有点不一样的IDea,欢迎文末评论投稿,热衷于分享->每天译点晓知识。

下文,小编主要以Oracle->MySQL适配为例->常见问答Q-A的方式阐述:

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第2张图片

补充记录:从高版本->低版本,数据导出->导入会出现如下异常

IMP-00010: not a valid export file, header failed verification

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第3张图片

接着,通过SQL查询当前Oracle版本,

select * from v$version

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第4张图片

此时,通过Notepad++修改dmp文件中版本信息为,

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第5张图片

再次执行imp命令,

[oracle@localhost ~]$ imp yd_dev_tmp/user@ip/orcl file=/home/oracle/xxx.dmp ignore=y full=y;

成功导入数据泵.dmp文件。(其中,可通过su - oracle进入oracle目录,dmp文件可上传到/home/oracle路径)

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第6张图片

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第7张图片

上述列举了部分常见函数

1、COALESCE函数 && NVL函数MySQL:COALESCE()Oracle:COALESCE()、NVL()COALESCE函数在MySQL跟Oracle都适用,NVL函数在Oracle中适用,COALESCE可替换NVL。
2、STR_TO_DATE函数 && TO_DATE函数MySQL:STR_TO_DATE(field,'yyyy-mm-dd')Oracle:TO_DATE(field,'yyyy-mm-dd hh24:mi:ss')
3、CONVERT函数 && TO_CHAR函数MySQL:CONVERT(field,CHAR)Oracle:TO_CHAR(field)
4、DATE_FORMAT函数 && TO_CHAR函数MySQL:DATE_FORMAT(field,'%Y-%m-%d')Oracle:TO_CHAR(field,'yyyy-MM-dd')

MySQL日期区间计算,

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第8张图片

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第9张图片

对应Java中常用ORM映射框架Mybatis中XML写法-SQL,其中MySQL方言可指定databaseId为mysql,Oracle方言可指定databaseId为oracle。

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第10张图片

Oracle日期区间计算,

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第11张图片

MySQL与Oracle正则表达式

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第12张图片

Oracle函数DECODE

DECODE(A.KLX,'01','居民身份证','02','居民户口簿','03','护照','04','军官证','05','驾驶证','06','港澳居民来往内地通行证','07','台湾居民来往内地通行证','其他')

MySQL函数IF可实现Oracle中DECODE效果

IF(A.KLX='01','居民身份证',IF(A.KLX='02','居民户口簿',IF(A.KLX='03','护照',IF(A.KLX='04','军官证',IF(A.KLX='05','驾驶证',IF(A.KLX='06','港澳居民来往内地通行证',IF(A.KLX='07','港澳居民来往内地通行证','其他')))))))

MySQL视图中函数,

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第13张图片

Oracle视图中函数

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第14张图片

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第15张图片

基于Mybatis插件的思想,根据当前数据库databaseId,拦截SQL,加入各自数据库的SQL方言函数兼容,无需多套数据库XML中SQL写法。后续考虑在GitHub上开源一款SQL插件,支持插拔式-需要时开启。

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第16张图片

可自动将复杂SQL填充参数打印SQL语句,

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第17张图片

打印其执行计划及耗时,助力于生产环境分析SQL,排查问题,性能优化

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第18张图片

引出这样一个小场景-思考:当你需要作多数据库兼容适配的时候,想提前预估需要改动的一个数量级,这时若需要对数据库层中各个SQL方言编写测试用例,作成功或失败率评估,那么如何拥有一个Java版本,单元测试用例-代码自动生成器,根据类名配置,即可知晓当前类中所有SQL方言的成功或失败率?^_^

当然,我们也可以在工作之余去看看其他的开发语言,Php,Python,Go......

「 往期文章 」

数据库在线实训平台-MySQL篇

Elasticsearch进阶篇 | 记kibana执行dsl脚本实战过程

Oracle优化案例 | 从执行计划定位SQL查询问题

Kafka | 记一次修复Kafka分区所在broker宕机故障-引发当前分区不可用的思考过程

达梦 | 记一次国产数据库适配的思考过程

扫描二维码

获取更多精彩

扫码关注译点

多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程_第19张图片

你可能感兴趣的:(oracle,mysql,多数据库适配)