怎么把oracle数据移植到mysql?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么把oracle数据移植到mysql?相关的知识,希望对你有一定的参考价值。

分别在两个Linux服务器上的oracle数据库中的表(每张表差不多千万数据量)有什么好方法能移植到mysql数据库呢?首先字段类型不一样,还有date字段的insert方式也不一样~
我用Oracl to Mysql这个工具导有些字段都是null数据没倒过去~还有中文乱码的问题~谁那有好的工具或者程序借我用用万分感激!(数据量太大,字段又不一样没法用导sql脚本)

OGG全称为Oracle GoldenGate,是由Oracle官方提供的用于解决异构数据环境中数据复制的一个商业工具。相比于其它迁移工具OGG的优势在于可以直接解析源端Oracle的redo log,因此能够实现在不需要对原表结构做太多调整的前提下完成数据增量部分的迁移。本篇文章将重点介绍如何使用OGG实现Oracle到MySQL数据的平滑迁移,以及讲述个人在迁移过程中所碰到问题的解决方案。


(一)OGG逻辑架构

参照上图简单给大家介绍下OGG逻辑架构,让大家对OGG数据同步过程有个简单了解,后面章节会详细演示相关进程的配置方式,在OGG使用过程中主要涉及以下进程及文件:

    Manager进程:需要源端跟目标端同时运行,主要作用是监控管理其它进程,报告错误,分配及清理数据存储空间,发布阈值报告等

    Extract进程:运行在数据库源端,主要用于捕获数据的变化,负责全量、增量数据的抽取

    Trails文件:临时存放在磁盘上的数据文件

    Data Pump进程:运行在数据库源端,属于Extract进程的一个辅助进程,如果不配置Data Pump,Extract进程会将抽取的数据直接发送到目标端的Trail文件,如果配置了Data Pump,Extract进程会将数据抽取到本地Trail文件,然后通过Data Pump进程发送到目标端,配置Data Pump进程的主要好处是即使源端到目标端发生网络中断,Extract进程依然不会终止

    Collector进程:接收源端传输过来的数据变化,并写入本地Trail文件中

    Replicat进程:读取Trail文件中记录的数据变化,创建对应的DML语句并在目标端回放

    二、迁移方案

    (一)环境信息

    OGG版本    OGG 12.2.0.2.2 For Oracle    OGG 12.2.0.2.2 For MySQL    

    数据库版本    Oracle 11.2.0.4    MySQL 5.7.21    

    OGG_HOME    /home/oracle/ogg    /opt/ogg    

    (二)表结构迁移

    表结构迁移属于难度不高但内容比较繁琐的一步,我们在迁移表结构时使用了一个叫sqlines的开源工具,对于sqlines工具在MySQL端创建失败及不符合预期的表结构再进行特殊处理,以此来提高表结构转换的效率。

    注意:OGG在Oracle迁移MySQL的场景下不支持DDL语句同步,因此表结构迁移完成后到数据库切换前尽量不要再修改表结构。

    (三)数据迁移

    数据同步的操作均采用OGG工具进行,考虑数据全量和增量的衔接,OGG需要先将增量同步的抽取进程启动,抓取数据库的redo log,待全量抽取结束后开启增量数据回放,应用全量和增量这段期间产生的日志数据,OGG可基于参数配置进行重复数据处理,所以使用OGG时优先将增量进行配置并启用。此外,为了避免本章节篇幅过长,OGG参数将不再解释,有需要的朋友可以查看官方提供的Reference文档查询任何你不理解的参数。

    1.源端OGG配置

    (1)Oracle数据库配置

    针对Oracle数据库,OGG需要数据库开启归档模式及增加辅助补充日志、强制记录日志等来保障OGG可抓取到完整的日志信息

    查看当前环境是否满足要求,输出结果如下图所示:

    (2)Oracle数据库OGG用户创建

    OGG需要有一个用户有权限对数据库的相关对象做操作,以下为涉及的权限,该示例将创建一个用户名和密码均为ogg的Oracle数据库用户并授予以下权限

    (3)源端OGG 管理进程(MGR)配置

    (4)源端OGG 表级补全日志(trandata)配置

    表级补全日志需要在最小补全日志打开的情况下才起作用,之前只在数据库级开启了最小补全日志(alter database add supplemental log data;),redolog记录的信息还不够全面,必须再使用add trandata开启表级的补全日志以获得必要的信息。

    (5)源端OGG 抽取进程(extract)配置

    Extract进程运行在数据库源端,负责从源端数据表或日志中捕获数据。Extract进程利用其内在的checkpoint机制,周期性地检查并记录其读写的位置,通常是写入到本地的trail文件。这种机制是为了保证如果Extract进程终止或者操作系统宕机,我们重启Extract进程后,GoldenGate能够恢复到以前的状态,从上一个断点处继续往下运行,而不会有任何数据损失。

    (6)源端OGG 传输进程(pump)配置

    pump进程运行在数据库源端,其作用非常简单。如果源端的Extract抽取进程使用了本地trail文件,那么pump进程就会把trail文件以数据块的形式通过TCP/IP协议发送到目标端,Pump进程本质上是Extract进程的一种特殊形式,如果不使用trail文件,那么Extract进程在抽取完数据后,直接投递到目标端。

    补充:pump进程启动时需要与目标端的mgr进程进行连接,所以需要优先将目标端的mgr提前配置好,否则会报错连接被拒绝,无法传输抽取的日志文件到目标端对应目录下

    (7)源端OGG 异构mapping文件(defgen)生成

    该文件记录了源库需要复制的表的表结构定义信息,在源库生成该文件后需要拷贝到目标库的dirdef目录,当目标库的replica进程将传输过来的数据apply到目标库时需要读写该文件,同构的数据库不需要进行该操作。

    2.目标端OGG配置

    (1)目标端MySQL数据库配置

    确认MySQL端表结构已经存在

    MySQL数据库OGG用户创建

    mysql> create user 'ogg'@'%' identified by 'ogg';

    mysql> grant all on *.* to 'ogg'@'%';

    #### 提前创建好ogg存放checkpoint表的数据库

    mysql> create database ogg;

    (2)目标端OGG 管理进程(MGR)配置

    目标端的MGR进程和源端配置一样,可直接将源端配置方式在目标端重复执行一次即可,该部分不在赘述

    (3)目标端OGG 检查点日志表(checkpoint)配置

    checkpoint表用来保障一个事务执行完成后,在MySQL数据库从有一张表记录当前的日志回放点,与MySQL复制记录binlog的GTID或position点类似。

    #### 切换至ogg软件目录并执行ggsci进入命令行终端

    shell> cd $OGG_HOME

    shell> ggsci

    ggsci> edit param ./GLOBALS

    checkpointtable ogg.ggs_checkpoint

    ggsci> dblogin sourcedb ogg@17X.1X.84.121:3306 userid ogg

    ggsci> add checkpointtable ogg.ggs_checkpoint

    (4)目标端OGG 回放线程(replicat)配置

    Replicat进程运行在目标端,是数据投递的最后一站,负责读取目标端Trail文件中的内容,并将解析其解析为DML语句,然后应用到目标数据库中。

    #### 切换至ogg软件目录并执行ggsci进入命令行终端

    shell> cd $OGG_HOME

    shell> ggsci

    #### 添加一个回放线程并与源端pump进程传输过来的trail文件关联,并使用checkpoint表确保数据不丢失

    ggsci> add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint

    #### 增加/编辑回放进程配置文件

    ggsci> edit params r_cms

    replicat r_cms

    targetdb cms@17X.1X.84.121:3306,userid ogg,password ogg

    sourcedefs /opt/ogg/dirdef/cms.def

    discardfile /opt/ogg/dirrpt/r_cms.dsc,append,megabytes 1024

    HANDLECOLLISIONS

    MAP cms.*,target cms.*;

    注意:replicat进程只需配置完成,无需启动,待全量抽取完成后再启动。

    至此源端环境配置完成 

    待全量数据抽取完毕后启动目标端回放进程即可完成数据准实时同步。

    3.全量同步配置

    全量数据同步为一次性操作,当OGG软件部署完成及增量抽取进程配置并启动后,可配置1个特殊的extract进程从表中抽取数据,将抽取的数据保存到目标端生成文件,目标端同时启动一个单次运行的replicat回放进程将数据解析并回放至目标数据库中。

    (1)源端OGG 全量抽取进程(extract)配置

    #### 切换至ogg软件目录并执行ggsci进入命令行终端

    shell> cd $OGG_HOME

    shell> ggsci

    #### 增加/编辑全量抽取进程配置文件

    #### 其中RMTFILE指定抽取的数据直接传送到远端对应目录下

    #### 注意:RMTFILE参数指定的文件只支持2位字符,如果超过replicat则无法识别

    ggsci> edit params ei_cms

    SOURCEISTABLE

    SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")

    SETENV (ORACLE_SID=cms)

    SETENV (ORACLE_HOME=/data/oracle/11.2/db_1)

    USERID ogg@appdb,PASSWORD ogg

    RMTHOST 17X.1X.84.121,MGRPORT 7809

    RMTFILE /opt/ogg/dirdat/ms,maxfiles 100,megabytes 1024,purge

    TABLE cms.*;

    #### 启动并查看抽取进程正常

    shell> nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt &

    ## 查看日志是否正常进行全量抽取

    shell> tail -f ./dirrpt/ei_cms.rpt

    (2)目标端OGG 全量回放进程(replicat)配置

    #### 切换至ogg软件目录并执行ggsci进入命令行终端

    shell> cd $OGG_HOME

    shell> ggsci

    ggsci> edit params ri_cms

    SPECIALRUN

    END RUNTIME

    TARGETDB cms@17X.1X.84.121:3306,USERID ogg,PASSWORD ogg

    EXTFILE /opt/ogg/dirdat/ms

    DISCARDFILE ./dirrpt/ri_cms.dsc,purge

    MAP cms.*,TARGET cms.*;

    #### 启动并查看回放进程正常

    shell> nohup ./replicat paramfile ./dirprm/ri_cms.prm reportfile ./dirrpt/ri_cms.rpt &

    #### 查看日志是否正常进行全量回放

    shell> tail -f ./dirrpt/ri_cms.rpt

    三、数据校验

    数据校验是数据迁移过程中必不可少的环节,本章节提供给几个数据校验的思路共大家参数,校验方式可以由以下几个角度去实现:

    1.通过OGG日志查看全量、增量过程中discards记录是否为0来判断是否丢失数据;

    2.通过对源端、目标端的表执行count判断数据量是否一致;

    3.编写类似于pt-table-checksum校验原理的程序,实现行级别一致性校验,这种方式优缺点特别明显,优点是能够完全准确对数据内容进行校验,缺点是需要遍历每一行数据,校验成本较高;

    4.相对折中的数据校验方式是通过业务角度,提前编写好数十个返回结果较快的SQL,从业务角度抽样校验。

    四、迁移问题处理

    本章节将讲述迁移过程中碰到的一些问题及相应的解决方式。

    (一)MySQL限制

    在Oracle到MySQL的表结构迁移过程中主要碰到以下两个限制:

    1. Oracle端的表结构因为最初设计不严谨,存在大量的列使用varchar(4000)数据类型,导致迁移到MySQL后超出行限制,表结构无法创建。由于MySQL本身数据结构的限制,一个16K的数据页最少要存储两行数据,因此单行数据不能超过65,535 bytes,因此针对这种情况有两种解决方式:

    根据实际存储数据的长度,对超长的varchar列进行收缩;

    对于无法收缩的列转换数据类型为text,但这在使用过程中可能导致一些性能问题;

    2. 与第一点类似,在Innodb存储引擎中,索引前缀长度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且开启innodblargeprefix的场景下,这个限制是3072 bytes,即使用utf8mb4字符集时,最多只能对varchar(768)的列创建索引;

    3. 使用ogg全量初始化同步时,若存在外键约束,批量导入时由于各表的插入顺序不唯一,可能子表先插入数据而主表还未插入,导致报错子表依赖的记录不存在,因此建议数据迁移阶段禁用主外键约束,待迁移结束后再打开。

    mysql>set global foreign_key_checks=off;


    (二)全量与增量衔接

    HANDLECOLLISIONS参数是实现OGG全量数据与增量数据衔接的关键,其实现原理是在全量抽取前先开启增量抽取进程,抓去全量应用期间产生的redo log,当全量应用完成后,开启增量回放进程,应用全量期间的增量数据。使用该参数后增量回放DML语句时主要有以下场景及处理逻辑:

    目标端不存在delete语句的记录,忽略该问题并不记录到discardfile

    目标端丢失update记录

    - 更新的是主键值,update转换成insert

    - 更新的键值是非主键,忽略该问题并不记录到discardfile

    目标端重复insert已存在的主键值,这将被replicat进程转换为UPDATE现有主键值的行

    (三)OGG版本选择

    在OGG版本选择上我们也根据用户的场景多次更换了OGG版本,最初因为客户的Oracle 数据库版本为11.2.0.4,因此我们在选择OGG版本时优先选择使用了11版本,但是使用过程中发现,每次数据抽取生成的trail文件达到2G左右时,OGG报错连接中断,查看RMTFILE参数详细说明了解到trail文件默认限制为2G,后来我们替换OGG版本为12.3,使用MAXFILES参数控制生成多个指定大小的trail文件,回放时Replicat进程也能自动轮转读取Trail文件,最终解决该问题。但是如果不幸Oracle环境使用了Linux 5版本的系统,那么你的OGG需要再降一个小版本,最高只能使用OGG 12.2。

    (四)无主键表处理

    在迁移过程中还碰到一个比较难搞的问题就是当前Oracle端存在大量表没有主键。在MySQL中的表没有主键这几乎是不被允许的,因为很容易导致性能问题和主从延迟。同时在OGG迁移过程中表没有主键也会产生一些隐患,比如对于没有主键的表,OGG默认是将这个一行数据中所有的列拼凑起来作为唯一键,但实际还是可能存在重复数据导致数据同步异常,Oracle官方对此也提供了一个解决方案,通过对无主键表添加GUID列来作为行唯一标示,具体操作方式可以搜索MOS文档ID 1271578.1进行查看。

    (五)OGG安全规则

    报错信息

    2019-03-08 06:15:22  ERROR   OGG-01201  Error reported by MGR : Access denied.


    错误信息含义源端报错表示为该抽取进程需要和目标端的mgr进程通讯,但是被拒绝,具体操作为:源端的extract进程需要与目标端mgr进行沟通,远程将目标的replicat进行启动,由于安全性现在而被拒绝连接。

    报错原因

    在Oracle OGG 11版本后,增加了新特性安全性要求,如果需要远程启动目标端的replicat进程,需要在mgr节点增加访问控制参数允许远程调用

    解决办法

    在源端和目标端的mgr节点上分别增加访问控制规则并重启

    ## 表示该mgr节点允许(ALLOW)10.186网段(IPADDR)的所有类型程序(PROG *)进行连接访问ACCESSRULE, PROG *, IPADDR 10.186.*.*, ALLOW


    (六)数据抽取方式

    报错信息

    2019-03-15 14:49:04  ERROR   OGG-01192  Trying to use RMTTASK on data types which may be written as LOB chunks (Table: 'UNIONPAYCMS.CMS_OT_CONTENT_RTF').


    报错原因

    根据官方文档说明,当前直接通过Oracle数据库抽取数据写到MySQL这种initial-load方式,不支持LOBs数据类型,而表 UNIONPAYCMS.CMSOTCONTENT_RTF 则包含了CLOB字段,无法进行传输,并且该方式不支持超过4k的字段数据类型

    解决方法

    将抽取进程中的RMTTASK改为RMTFILE参数 官方建议将数据先抽取成文件,再基于文件数据解析进行初始化导入

参考技术A 建议还是使用MySQL官方提供的一套工具,以前分开的几个软件工具,目前,已经集成在一个MySQL Workbench (GUI Tools)的一个工具集中。该工具集既有基于GPL使用协议的社区版本,也有基于Commercial License商业许可使用权的标准版本,整个工具中包含了数据库建模与设计、MySQL程序开发集成环境、数据库管理工具,还有就是Migration Toolkits工具,用于将其它数据库源,包含Oralce、SQL Server、DB2、Sybase、PostgreSQL、Access、Excel等等迁移到MySQL的一个工具,按照这个工具要求的几个步骤,就可以比较轻松的把相关数据库源的数据库结构和数据导入到MySQL数据库系统中,如果涉及到数据库端的一些程序,如存储过程、触发器等,可能还需要手动做一些迁移工作;针对每一种数据库的迁移,MySQL也都给出了一份技术指导的白皮书,有兴趣的朋友可以联系我。 参考技术B 建议用PL/SQL,导出成SQL脚本,

然后将SQL脚本执行,导入到mysql。

如果实在不愿意用sql脚本的话,建议使用SQL SERVER的自带的数据迁移工具,设置好目的数据源、源数据源,以及对应关系(能设置字段、修改类型),然后执行导入。
参考技术C 用ora2sqld 把分给我吧 好使本回答被提问者采纳

如何将oracle数据库转换成mysql数据库,现在公司有急用,方法可用的话再加分!

讲解Oracle数据库移植到MySQL
出处:IT专家网 日期:2010-06-24

一、前言

公司原来的项目是基于Oracle数据库的,Oracle功能强大,但是部署和管理较复杂,更重要的是,购买Oracle的费用不是每个客户都愿意承担的。因此,迫切需要把公司项目所用数据库移植到一个简单好用的数据库上。当然,如您所料,我们选择了广受欢迎的MySQL。

作为一个开源数据库,MySQL用无数案例证明了她的可用性,因此让我们把重点放在如何将Oracle移植到MySQL上。已经有很多的文章和专题介绍了Oracle移植到MySQL的方法和步骤,也有相当多的工具可以辅助这种移植过程。但是,由于数据库实现的差异,完美的移植工具是不存在的,移植过程中不断碰到的问题证明了这一点,特别是您使用了Oracle的一些高级特性时。

从Oracle移植到MySQL主要有六个方面的内容需要移植,一是表Table,包括表结构和数据,二是触发器Trigger,三是存储过程Procedure,函数function和包Package,四是任务Job,五是用户等其他方面的移植,六是具体应用程序通过SQL语句访问时的细节差异克服。

笔者用来移植测试的数据库是:Oracle 9i ,MySQL 6.0,Windows 2000环境。

二、表的移植

这个部分的移植是最容易用工具实现的部分,因为很多MySQL的图形管理工具都自带这样的移植工具,比如SQLYog,MySQL Administrator等。但是,这些工具的移植能力各有不同,对字段类型转换、字符集等问题都有自己的处理方式,使用时请注意。

笔者使用“SQLYog Migration Toolkit”工具按提示步骤移植后,表的主要结构和数据将成功移植,主要包括表的字段类型(经过映射转换,比如number会转换为double,date转换为timestamp等,请小心处理日期字段的默认值等),表的主键,表的索引(Oracle的位图索引会被转成BTree索引,另外表和字段的注释会丢失)等信息。需要特别注意的是,Oracle的自增字段的处理。

大家知道,Oracle通常使用序列sequence配合触发器实现自增字段,但是MySQL和SQL Server等一样,不提供序列,而直接提供字段自增属性。所以,请把Oracle里面的自增字段实现直接改为MySQL的字段属性,而且,这个字段必须是主键(key)并且不能有默认值。

还有一个问题,如果您的应用要直接使用Oracle的某个序列,那么您只能在MySQL里面模拟实现一个,具体方法就是利用MySQL的自增字段实现的。

三、触发器的移植

首先,MySQL在6.0以后才支持触发器!

触发器的移植没有现成工具,因为两者之间的语法差异较大,您只能通过手工对照着原来的逻辑一个一个添加。

这里要说明一下,MySQL的SQL过程语法和Oracle PL/SQL大致相同,但还是有些细微差别:

1. 变量声明Declare部分,在Oracle中Declare语句位于Begin之前,在MySQl中,Declare位于Begin之后;

2. 注释不同,在Oracle中,可用 “—“ 注释一行或“/* */”注释一段,在MySQL中,需用 “/* */”或“#”来注释

3. 对触发前后变量值的引用方法不同;在Oracle中,用 :new.eid, :old.eid表示新旧值,

在MySQL中,用 New.eid,old.eid表示新旧值

4. 移植中发现的问题

1) Oracle的自治事务autonomous_transaction ,MySQL不支持,您必须用其他方式实现,MySQL不允许在触发器过程中执行对触发器所在表的操作(包括读写)

2) MySQL函数和trigger中不能执行动态SQL语句,也就是说,您不能在触发器里面组合出来一个SQL字符串,然后用exec来执行

3) Oracle的表级触发器,MySQL还不支持,所以必须改成使用行级触发器,注意这会导致有时SQL语句的执行效率很低

四、存储过程,函数和程序包的移植

程序包是Oracle用来组织逻辑功能的一个Object,MySQL不支持,因此需要将包里的存储过程、函数等全部放到该数据库公有过程和函数里面。

MySQL的过程和函数语法与Oracle类似,但还是有细微差别,除了数据类型需要转换,还有:

1. 格式不同,例如:

Oracle为:

CREATE OR REPLACE procedure procedure1(TableName in varchar2) is

MySQL应该为:

CREATE procedure procedure1( in TableName varchar(200))

2. 赋值语句不同:

Oracle赋值语句为:

strSQL := ‘update table set field1=1’;

MySQL应该为:

Set StrSQL = ‘update table set field1=1’;(用:=也行)

3. 一些要用到游标的过程请注意

MySQL过程不支持嵌套游标,不支持带参游标,不支持记录类型%ROWTYPE,不支持数组等,原Oracle用到这些的必须改写

五、Job的移植

Job是Oracle的定时任务实现的方法,MySQL6中用Event实现,具体语法请参考MySQL手册。

在MySQL中使用event请注意,默认它是不运行的,您可以

1) 保证MySQL定时任务event scheduler运行,需要MySql 5.1.6以上,并且在启动后执行SET GLOBAL event_scheduler = ON;(也可以在初始配置文件比如my.ini中加入event_scheduler = ON的参数)

2) 启用event功能后,每次执行会往MySQL的错误日志文件写一些信息(data目录下的“主机名.err”文件),导致这个文件越来越大(除非经常做flush log操作)。所以,如果您的event执行很频繁,可在my.ini中加参数console=TRUE,这样执行event的信息就不会写进来了
六、用户的移植

Oracle的用户管理和MySQL下有较大区别,请分别建立用户,并赋予合适的权限。

七、应用程序的移植

由于语法细节上的差异,导致很多SQL语句需要改写。笔者记下了所有移植过程中碰到的SQL语句细节差异,这些也是一般项目可能会用到的地方,虽然肯定不全,但也列出来以供参考:

1)Oracle的to_char函数不能再使用,换用如CONCAT(14.3)的形式,为了提高应用程序兼容性,建议手工写一个

2)Oracle的to_date函数不能再使用,建议手工写一个添加到MySQL数据库

3)Oracle的decode函数不能再使用,换用SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END 的形式

4)nvl这样的一些专用函数,MySQL是没有的,可以把

select nvl(to_char(num),'nothing') from t_equipment转换成

select case num when num then num else 'nothing' end from t_equipment

5)instr之类的函数,函数名相同,但参数个数不同

6)Oracle的sysdate要写成sysdate()的形式

7)包的形式已经取消,所以原来以包的方式调用的过程如xx_pack.xxx要写成xxx()

8)带进制字符转数字

Oracle风格:TO_NUMBER(strTmp,'XX') TO_NUMBER(’9’)

MySQL风格:CONV(strTmp,16,10) CONV(’9’,10,10) 如果字符串前后有加减操作,会隐含转换成数字

9) 不能再有直接调用序列的形式,如果一定需要,可以模拟实现一个

10)日期直接加减的含义不同了,比如Oracle中sysdate + 1 变成了sysdate() + interval 1 day(注意如果写成sysdate() + 1 语法还是正确的,但含义是错误的)

查询select sysdate() + 1 from dual 在MySQL得到比如 20080223153234(= 20080223153233 + 1)的数

而在Oracle中会得到第二天当前时刻。

11) MySQL单纯的date类型只是日期不带时间,DATETIME或TIMESTAMP带有时间,用DATE_FORMAT函数可以控制显示形式

12)select 'abc' || 'd' from dual 两个数据执行的结果不同(语法都能通过),MySQL要写成select concat('abc' , 'd')的形式

13) Oracle高级功能,如带有暗示索引的select语句,MySQL是不支持的(语法可以通过)
14)有些MySQL的保留字不能直接用在SQL语句里,要加表名或别名限制,如select RIGHT FROM XX要改成select a.RIGHT FROM XX a

15) Oracle的子查询可以不起别名,但MySQL是必须的,比如下面的别名aa:

select field1 from (select sysdate() as field1 from dual) as aa

16)很多系统表名都是不同的,比如,列出某个表的信息:

select * from tab where TName='T_TEST'改成

select table_name,table_type from information_schema.tables where table_schema = 'user' and table_name=' T_TEST '

17)MySQL下update时不能有本身的子查询

update T_TEST set Flag = 0 where field1 in

(select distinct b.field1 from T_TEST b where b.flag=1)

18)Oracle下’’和null等价,而MySQL则不然

select 1 from dual where '' is null在Oracle下可以取到记录,在MySQL下不能

dual表的使用,substr、trim等函数的主要使用方式和Oracle类似

八、小结和建议

看起来,Oracle移植到MySQL似乎挺麻烦,有没有一键完成的简单办法?呵呵,我没有找到,除非您只使用基本表,只使用基本SQL语句访问它。当然,建议大家初始设计的时侯,就考虑到多数据库的支持,权衡一下使用一些高级功能带来的好处和对可移植性方面带来的损害,这会大大减少后期移植时面对的问题;另外,在应用架构设计时,也建议使用较好的框架去屏蔽这些差异,比如J2EE的Hibernate框架等。

感谢伟大的Oracle,给我们提供了很多的高级功能,有很多是MySQL没有的,因此,在移植时你不得不放弃一些非必须的功能,比如,全表cache、物化视图、函数索引等;如果该功能是必须的,您可能要使用别的方式来实现,或者转到应用程序层面来考虑。当然,这些功能MySQL今天没有,不代表明天也没有,我们可以拭目以待。

由于开源软件的原因,MySQL的bug或者缺陷有时还会干扰你,请仔细测试和优化您的应用程序,调整MySQL的配置参数,确保它可以运行得和Oracle下一样好。

(责任编辑:王倩)
参考技术A 建议使用PowerDesigner将ORACLE转换为物理模型,再转换为逻辑模型,然后通过这个逻辑模型重新选择DBMS(MYSQL),将其转换为MYSQL的物理逻辑模型,在物理逻辑模型上更新触发器,过程等对象,然后生成MYSQL的物理文件,或直接导入到MYSQL数据库实例中。追问

我已经通过powerdesigner将数据库的表结构转换成功了,但是数据没有导入啊!你有什么好的方法能从oracle中将大量的数据导出到mysql中吗?

追答

1.如果每个表的数据量大于100K条的话,通过ORACLE的异构数据库代理建立基于ODBC数据源的异构数据库通道,如果你没有修改过表的字段,就用N个INSERT INTO命令将ORACLE数据库的数据插入到MYSQL中就OK了,如果插入过程中报错,注意数据的类型,必要时在MYSQL中建立中间表,将数据都统一成字符型数据插入中间表,然后再MYSQL中处理。
关于ORACLE异构数据库通道的建立,你可以在网上搜索一下很多。ORACLE的异构数据库访问可以基于ODBC和transparent getway(透明网关)这两种,建议用ODBC的,很好建立(透明网关我现在都没搞好,不知道是什么问题。。。)。
2.数据量小的话可以通过PL/SQL DEVELOPER将数据导成平面文件,然后导入MYSQL(本人没用过MYSQL,所以可行性不清楚,但既然都是比较主流的关系数据库,我想应该可以吧)。
3.通过MSSQL的导入导出工具将ORACLE的数据导进MSSQL数据库中(即将MSSQL数据库看成一个过度数据库或表),再将MSSQL中的数据导入MYSQL,在转换过程中注意数据的类型。
4.在不同的数据库导入导出数据时都要注意数据的类型的选择,如:mssql和oracle之间的数据类型:int(float)/number,varchar/varchar2,date/date,datetime/timestamp等。

本回答被提问者采纳
参考技术B 还简单些啊 对应的数据类型转换 比如 number转成int 序列变成 auto identity 什么primary key啊 自己去看下mysql的例子就清楚了嘛追问

数据库中有非常多的表,难道我要一个一个地去修改吗,现在表结构已经转换成功了,就剩下数据了,希望你能帮到我!

追答

你可以试下CrazyHerozk 所说的

以上是关于怎么把oracle数据移植到mysql?的主要内容,如果未能解决你的问题,请参考以下文章

如何将oracle数据库转换成mysql数据库,现在公司有急用,方法可用的话再加分!

MySQL表与数据向Oracle移植(使用Oracle SQL Developer工具)

怎么把数据从oracle11迁到oracle12

怎么把mysql数据库里面的表及数据 复制到oracle

PostgreSQL数据导出导入问题,谢谢

oracle迁移到mysql注意事项