从oracle到mysql模型转换的自动化实现

Oracle 数据如何迁移到MySQL 图文详细教程 先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。点击工具选择数据传输,注意;如果是从OracleMySQL,就选中Oracle库,然后在使用数据传输,这个是传输和被传输的关系。... 阅读详情

众所周知,同为IT民工,但是只有程序员称之为码农,因为搞开发的其实有很多重复劳动,至于交付实施则重复劳动更多。所以,相对没那么多重复劳动,高瞻远瞩的设计同学,虽然头上的发量堪忧,头上的包却也比较多,但是还是站在了民工金字塔的顶端(众所周知,领导不是IT民工,是包工头),大家还是比较羡慕的。

01 开端

然而在轰轰烈烈的去O运动中,设计同学也开始为大量的重复劳动发愁了。

发愁的原因,是因为去O本身就是一个数据库转型的动作,有太多从oracle语法转向其他数据库语法的工作,如建表语句、程序SQL,存储过程等等,而这种工作,基本都是重复性的搜索和替换动作(键盘“R”键也需要加固了),大部分工作,都需要设计同学的参与,尤其是建表部分。特别是稍大点的系统,动则就上千张表,如何能够快速而准确的转为新数据库(我们一般是mysql或pg),想想都头疼。

本文讨论怎么将oracle建表语句转换为mysql的建表语句。这算是开了个头,写了一些段子,不符合技术类文章的风格,强行辩护一下,是因为这活实在太无聊了。

02 现有可用工具

可能没有实际处理过这种工作的同学会觉得数据库都大同小异,标准SQL已经多少年了,还存在这么多需要翻译的模型和SQL吗?实际上,在我看来,标准SQL只有每条语句的开头的第一个单词是标准的(select,insert,delete),其他的都有很多夹带的“私货”,这一方面是标准SQL其实是一个很松散的标准,没法把所有的SQL都标准化;另外一方面,其实也是每个数据库都不想被标准化,特别是占据大市场份额的ORACLE。所以,去O远比想象的要难得多。

当然,现在SQL翻译的软件很多,也很强大,比如powerdesigner,又比如我强烈推荐的如下SQL翻译网站:http://www.sqlines.com/online

这些软件都可以将各个数据库之间的建表语句互转,对于小规模的转换,基本够用,但是对于大规模的,还是存在较多难以满足的地方,主要有如下几个方面:

oracle导出建表语句本身也不够标准。Oracle导出的建表语句,就不是那么“干净”,不符合标准SQL的部分比较多,需要逐个表修改。

很多字段类型并不是一对一的关系,有些时候要分析实际数据才知道到底需要转换为何种类型,比如number类型,在mysql中存在多种类型与之对应,比如tinyint ,smallint,mediumint ,bigint,decimal等等,在上面的图中,其实可以看到将number转为double实际是不准确的。

目的数据库对于可执行的ddl语句可能存在限制。如teledb,存在限制说必须有表必须要有主键、字段必须要有描述、索引等要写在建表语句中等诸多限制,而转出来的SQL往往不那么符合要求。

费用,你懂的。

总的来说,就是各种不好用,虽然减少了部分劳动,但是还是进行各种手工操作,只能算是个半自动产品。所以,为了更快地提高效率,减少重复劳动,还是自己写个小工具来实现比较好。

嗯,我就写了一个。以下的部分,是介绍这个工具的实现以及一些经验的总结,供有需要的同学参考。鉴于oracle本身的复杂性以及我的知识有限,错误之处在所难免,请各位大拿批评指正(诚恳的、谦虚的语气)。

03 自研发工具的整体实现逻辑

本来首先想的,也是先通过get_ddl函数将表和索引语句导出,然后通过一些SQL语法分析引擎来实现,并解决前文说到的不足的问题。找了一下主流的分析引擎了解了一下,发现第一较为复杂,学习的时间会比较长;第二感觉这个事情用分析引擎也属于高射炮打蚊子,未必好用。其实建表语句无非就那么几个关键点,拿oracle系统表完全可以提炼出来。

以一个mysql风格的建表语句为例,主要由如下几个部分组成(/**/部分):

CREATE TABLE trans_table /*表名*/ (`table_id`/*字段名*/   int /*字段类型,长度*/    NOT NULL /*是否可空*/   COMMENT 'ID配置生成,不需要填值' /*描述*/ ,`data_source_name`  varchar(100)        COMMENT '数据源' ,`table_name`  varchar(50)        COMMENT '表名' ,`table_desc`  varchar(1024)        COMMENT '描述' ,`table_type`  tinyint       COMMENT '表类型--预留' ,`clean_way`  tinyint  DEFAULT 0 /*默认值*/ ,primary key (`table_id`) /*索引和主键部分*/  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

这里面,表相关主要有表名、字段名、字段类型、是否可空、默认值,索引相关主要有索引名、索引字段、是否主键索引等信息,可以看到,并不复杂。于是就果断的选择了直接用oracle系统表提炼出建表语句的各个部分,然后再拼接起来实现(相当于实现一个异库get_ddl函数)。

这里没有太多复杂的流程问题,相信各位码农同学们根本不需要我画什么流程图。嗯,我知道你要什么,主要是需要将涉及的系统表整理出来,上菜:

与之对应的系统视图,列表如下:

04 转换难点:字段类型转换

确定了目标语言的风格以及要素之后,最核心的东西,当然是字段类型如何转换。

熟悉oracle数据类型的同学知道,oracle在弄字段类型时看上去比较简单粗暴,但是mysql做的比较精细。但这并不是oracle偷懒,恰恰相反,其中原因,是oracle比较勤快。高情商的说法,是客户需求的推动,低情商的说法,就是为了掌握更多的数据库市场话语权,把更多的“业务”逻辑放在了数据库自身(对于“数值”类型的处理就能看出来)。而mysql、pg等数据库理念则反之,字段类型的定义与程序语言中数据类型的定义符合度更高,对于业务回归到程序本身处理更加友好。

当然以上纯属个人观点,两者取舍之间,也说不上谁对谁错。

正因为如此,在处理oracle与其他数据库的映射关系时,大部分时候都是一对多的关系,所以转起来比较麻烦,不仅需要参考字段类型本身,还需要明确精度,甚至有时候需要参考实际数据的值。

我整理了ORACLE常用的数据类型与mysql的对应关系,如下:

      

最复杂莫过于number(p,s),以这个举例来说明如何转换。

p是指有效位数,s是小数位,需要以p和s的实际取值来确定mysql的字段类型:

当p,s均为空时,此时需要参考表内的实际数值或者根据具体业务来确定转换的类型。参考实际数值时,可以采用获取表中max(length(column_name))-1(包含一个小数点)来确定p,用max(length(column_name)-instr(column_name ||'.','.'))(查找小数点后的位数)来确定s的值。

另外,一定要注意mysql的int(2)这种写法,并不是smallint的别名,不管是int(2)还是int(8),实际都是int。

除了最复杂的number类型以外,其他字段还有几点小建议:

  1. 除非要修改设计以支持秒以下级别的精度,Date最好转换为datetime而不要转为TIMESTAMP,因为TIMESTAMP存在2038年问题。
  2. ORACLE FLOAT不要转为MYSQL FLOAT,要转为DOUBILE避免精度丢失。
  3. 处理char时,要注意最大的长度。
  4. BLOB,CLOB转换时,MYSQL也有众多不同长度的类型选择,最好根据实际业务需要和业务数据来判断选择何种长度。

05 其他要素:主键、索引、外键

首先还是提醒特别要注意目的数据库的建表风格问题。现在使用的Mysql,大部分为mysql集群产品,对于使用会存在一些限制,比如主键必须存在,建主键的语句必须放到建表语句“里面”等等。所以,在转换之前,要先考虑目的数据库的建表限制以及语句风格。根据风格确定模板后,再进行转换。

其次再说说oracle和mysql对于索引和主键上的一些差异。

主键判断:在索引是否主键的判断上,oracle使用约束视图ALL_CONSTRAINTS的约束类型CONSTRAINT_TYPE=“P”来判断,转换时,应该先查找all_index来查找所有索引,再根据ALL_CONSTRAINTS判断是否主键。值得一提的是,mysql只需要通过索引的索引名称判断即可,即索引名称为“PRIMARY”的为主键,其他则为普通索引。

主键名称:这两者的主键的创建语法,也有差异,Oracle主键的创建语法,可以有名字,也可以没名字,如果没有名字,则系统会自动加上一个名字;但是mysql则不同,就算是创建时有名字,到了mysql系统视图中,也会被“PRIMARY”替换。所以,mysql创建主键时,建议是不写名字。

主键判断:在索引是否主键的判断上,oracle使用约束视图ALL_CONSTRAINTS的约束类型CONSTRAINT_TYPE=“P”来判断,转换时,应该先查找all_index来查找所有索引,再根据ALL_CONSTRAINTS判断是否主键。值得一提的是,mysql只需要通过索引的索引名称判断即可,即索引名称为“PRIMARY”的为主键,其他则为普通索引。

主键序列:Mysql主键支持自增列(AUTO_INCREMENT),而ORACLE则需要先定义序列,再设置默认值,这一点Mysql比较方便,当遇到在oracle中主键默认值为序列时,转为自增长处理,注意把自增列数据类型设置为无符号型。当在oracle中没有主键时,推荐增加一个自增列作为主键。

索引名称:Oracle索引名称是owner下唯一,而mysql索引名称是表下唯一,也就是说,原有oracle一些分表,比如分月等索引带月份的,在mysql下可以不带月份。

联合索引字段顺序:在ALL_IND_COLUMNS中查找索引字段时,注意按照COLUMN_POSITION排序避免准换后丢失顺序。

外键:建议直接丢弃不用。主要是因为现在用的Mysql基本都是集群的mysql,分库分表无法使用外键,另外去O的主流数据库设计,也会推荐尽量减少数据库层面的外键关联,转而交由业务逻辑实现。

06 结尾

以上,是我写完这个小工具的一些经验总结。

再次诚恳地说明,确实模型转换这个问题博大精深,很多地方我只是浅尝则止,还需要更深入地去研究,写出来的工具,也只能解决90%左右的问题,很多实际情况,还是要根据业务情况去转换去设计。

谢谢大家耐心看完,也真诚希望能提出错误和宝贵意见。

不过既然气氛都烘托到这儿了,我贴一张成果图不算过分吧:)。

轻量级的解决OracleMysql之间结构转换 最近在做OracleMysql之间的库迁移,度娘了很多资料,大部分都是基于powerdesigner 或者Navicat等重量级的工具,鉴于各种限制原因,不能使用工具来实现数据库迁移。数据库迁移拆分成语句、数据迁移、存储过程、视图等部分。苦于手撕语句,寻找一种快速转换结构的方式尤为重要,本文章可用于解决语句部分。通过自定义oracle函数的方式,在方法体中对数据类型进行转换,去生成具体的DDL语句Mysql语法)。 阅读详情

相关推荐

PDM模型转换MySQL兼容SQL语句自动化解决方案

约束命名策略差异显著。Oracle 允许为约束显式命名,便于后期维护:MySQL 也支持命名,但若未指定,系统会自动生成名称(通常为第一个字段名),不利于统一管理。另一个关键区别在于NULL 值处理Oracle 认为''(空字符串)等于NULL;MySQL 区分''和NULL,除非启用了特定 SQL 模式。这会导致应用程序在判断空值时产生歧义。例如,PDM 中若某字段标记为“非空”,在 Oracle 中插入''会被视为NULL而报错;

weixin_35755562的博客 898

oraclemysql语句迁移

oraclemysql语句的迁移。 直接结构的生成sql脚本

OracleMySQL数据库迁移工具:自动化SQL转换

数据库迁移工具作为现代IT基础设施中不可或缺的一部分,它们支持不同数据库系统之间的无缝迁移,无论是从一个版本升级到另一个版本,还是将系统迁移到全新的数据库平台。本章将对数据库迁移工具的基本功能进行概述,并详细介绍其在企业级数据迁移中所扮演的角色。数据库迁移工具的主要目标是简化和自动化复杂的迁移过程,减少手动干预,并最小化迁移过程中的停机时间。它们通常提供以下功能:自动化数据迁移:自动处理数据转换和迁移过程,支持数据类型、存储过程、触发器等的转换。语法转换

weixin_29717341的博客 1017

oracle数据转换mysql数据

右边选择高级可以修改转换后的数据库名字,以及字段相关的操作。

m0_53658634的博客 6502

oraclemysql语句转换

oraclemysql语句转换

supuerlovepc的博客 9193

mysql语句转换oracle_MyBatis项目实战 快速将MySQL转换Oracle语句

一、前言因项目需求,小编要将项目从mysql迁移到oracle中 ~现在将完成 基于MyBatis-Plus将项目中的MySQL语句全部转换Oracle语句大概实现步骤:将项目改成支持双库配置(因项目基于mysql数据库已经全部完成,也不想直接替换掉,于是新增oracle库,让整个项目可支持多个数据库,这里不是多数据源哦!)Oracle中创常用函数遍历项目中的xxxMapper.xml文件,找...

weixin_42393315的博客 4305

MyBatis sql语句mysql转换Oracle

配置迁移规则,指定源数据库(MySQL)和目标数据库(Oracle)- 编写迁移SQL脚本,工具会自动根据规则转换- 执行迁移,生成Oracle兼容的SQL脚本这种方式简单高效,可以将大量SQL语句快速转换完成,但是转换结果的准确性还需要开发人员进一步检查与优化。MySQLOracle的数据类型也存在差异,需要将语句中使用的类型进行转换,比如:- INT -> NUMBER。MySQLOracle的SQL语法有一定差异,需要进行对应的转换,比如:- LIMIT -> ROWNUM。

lzl41108891的专栏 2971

OracleMySQL到MyBatis转换指南

MyBatis的Mapper XML文件是MyBatis项目中核心的SQL配置文件。它以标准的XML格式书写,可以包含以下基本元素:<mapper>:根元素,用于定义命名空间,与接口进行绑定。<select>:用于编写查询的SQL语句。<insert>:用于编写插入数据的SQL语句。<update>:用于编写更新数据的SQL语句。<delete>:用于编写删除数据的SQL语句。:用于自定义参数映射,已较少使用,通常使用注解或#{}占位符。

weixin_35826166的博客 1116

OracleMysql的区别

OracleMysql的区别 OracleMysql都是流行的关系数据库管理系统(RDBMS),在世界各地广泛使用;大多数数据库以类似的方式工作,但Oracle数据库和Mysql数据库之间总是存在一些差异的,本篇文章就给大家比较Oracle数据库和MySQL数据库. 文章目录OracleMysql的区别一、本质的区别二、数据库安全性三、SQL语法的区别四、对事务的提交五、存储上的区别六、分页查询七、MySQLOracle的字符数据类型比较八、事务隔离级别九、MySQLOracle中的备份类型十

顾优秀的博客 2万+

MySQL迁移到Oracle的全面指南

Oracle提供了官方的数据迁移工具,这些工具是企业迁移项目中不可或缺的一部分。Oracle Data Pump(expdp和impdp)是Oracle官方提供的高效的数据导入导出工具,支持大规模的数据迁移任务,具备并行处理的能力,能够加速数据的迁移过程。数据泵工具的主要特点如下:高效性:使用LZOW(LZO和ZIP)压缩算法,减少磁盘I/O操作,并能并行执行以提高速度。可管理性。

weixin_42497762的博客 1445

终极数据库迁移指南:Yugong如何轻松实现OracleMySQL的无缝转换

在当今企业数字化转型的浪潮中,数据库迁移工具已成为技术架构升级的关键支撑。Yugong作为阿里巴巴开源的数据库迁移同步工具,为企业提供了从OracleMySQL/DRDS的完整迁移解决方案。 ## 项目亮点 **全链路自动化迁移** 🚀 - 支持全量迁移和增量迁移两种模式 - 自动创Oracle的增量物化视图 - 完整的数据校验机制确保迁移准确性 **高性能数据处理** ⚡ - 纯J

gitblog_00035的博客 1101

Oracle、SQL Server和MySQL的隐式转换异同

这次的组内分享,选择了在不同数据库中的隐式转换这个话题。隐式转换是个老生常谈的问题了,不同的数据库,隐式转换的影响因素有所不同,我们通过一些例子来看一下。但是问题来了,如何避免隐式转换带来...

bisal的专栏 612

MySQLOracle数据库迁移工具实战指南

MySQL中,主键和唯一键通常随一并声明,语法简洁。但在Oracle中,虽然支持内联定义,但更推荐使用独立的CONSTRAINT子句以便统一管理和命名。-- MySQL风格(不推荐在Oracle中使用)-- Oracle推荐写法逻辑分析:替代,是Oracle 12c及以上版本的标准自增字段语法;- 所有约束均显式命名(pk_uk_fk_前缀),便于后期维护与错误定位;- 外键引用必须确保被引用列已立主键或唯一约束。

weixin_42502089的博客 719

MySQLOracle SQL语言差异比较

数据类型 编号 ORACLE MYSQL 注释 1 NUMBER int / DECIMAL DECIMAL就是NUMBER(10,2)这样的结构INT就是是NUMBER(10),示整型; MYSQL有很多类int型,tinyint mediumint bigint等,不同的int宽度不一样 2 Var

World_2015的专栏 1万+

mysqloracle_oracle 自动生成 MYSQL脚本

create or replace function fnc_table_to_mysql( i_owner in string,i_table_name in string,i_number_default_type in string := 'decimal',i_auto_incretment_co...

weixin_28716723的博客 363

Oracle结构转成MySQL结构

Oracle数据库中一些特殊的功能或数据类型(如ROWID、UUID、网络数据类型等)在MySQL中可能没有直接的对应项,需要找到合适的替代方案或转换逻辑。确保目标MySQL数据库使用与Oracle数据库相同的字符集和排序规则,这通常在MySQL中通过CHARACTER SET和COLLATE语句来指定。在进行数据库迁移时,务必确保备份原始数据,并在迁移后进行全面的测试,以确保数据的完整性和应用程序的功能性。Oracle使用的是固定的字符集和排序规则,而MySQL使用的是可变字符集和排序规则。

qq_38519364的博客 3487

Oracle Skills实战:AI辅助MySQL迁移Oracle

Oracle Database Skills 把 Oracle 官方技术文档结构化地注入了 AI Agent,让数据库迁移从「人肉逐行审查」变成了「Agent 自动扫描 + 官方文档验证」。安装 db 域本地缓存:把等常用文件下载到目录,避免 GitHub 不可达时影响工作编写自脚本:官方 Skill 保证类型映射的准确性,自脚本保证检测和修正的效率——两者加起来才是完整的 Oracle AI 工作流。

renkejia1988的博客 455

JSqlParser在数据迁移中的应用:自动化SQL转换工具开发

企业数据迁移过程中,SQL语句的兼容性处理往往成为效率瓶颈。不同数据库管理系统(DBMS)间的语法差异(如MySQL的`LIMIT`与PostgreSQL的`LIMIT OFFSET`、SQL Server的`TOP`)、函数实现差异(如字符串拼接`CONCAT`与`+`运算符)以及数据类型映射问题,需要大量人工介入修改。据DORA《2024年DevOps状态报告》显示,数据迁移项目中约43%的时...

gitblog_00812的博客 932
上一篇: WhaleDI自助建模实践与探索
下一篇: 浅析云原生
鲸品堂
博客等级 码龄5年 773粉丝 127原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值