oracle数据库迁移mysql
1. 怎么使用powerdesinger 16.5将oracle的表和数据转到mysql
1、工具的准备
1.1、安装Oracle SQL Developer,我是用的是最新版本,下载后解压到任意目录即可(不含中文,空格)。
1.2、下载mysql的驱动jar文件,官网地址查出后忘了,此处免费提供下载;下载后解压到任意目录
1.3、打开Oracle SQL Developer,菜单栏中选择 工具-->首选项-->数据库-->第三方JDBC驱动程序中选择mysql驱动解压后的jar文件,然后点击确定。
2、建立Oracle数据库与用户(用来承载mysql移植来的数据)-->此处操作后续补齐,网上资料很多,当然,此处也可以省略(如果你的项目中不需要额外的数据库和用户的话)
2.1、在数据库建好之后,为了给用户授予权限,我们创建一个管理员的连接(当然,你也可以在命令行中连接oracle完成授权操作)
2.2、建立用户并授予权限,授予权限(此处指你已经创建了自己的数据库,或者使用oracle默认的数据库)
另:此处提供简略版创建用户与表空间的结构,此处不做解释,后期补充
--创建临时表空间 aaaa意义:临时表空间,临时表空间文件
create temporary tablespace aaaa_temp
tempfile 'G:\software\Java_database\oracle\runtimebj\aaaa_temp.dbf'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;
--创建数据表空间 aaaa意义:表空间,表空间文件
create tablespaceaaaa
logging
datafile 'G:\software\Java_database\oracle\runtimebj\aaaa.dbf'
size 100m
autoextend on
next 32m maxsize 2048m
extent management local;
--创建用户并指定表空间 aaaa顺序意义:用户名,密码,表空间,临时表空间
create user aaaa identified byaaaa
default tablespaceaaaa temporary tablespaceaaaa_temp;
--授予message用户DBA角色的所有权限 此处的aaaa只表示用户名
GRANT DBA TOaaaa;
grant resource to aaaawith admin option; --需添加这句话否则连接的时候会报错...
2.3再次创建连接,使用新创建的用户连接
2.4、连接建立后,右键连接,移植资料档案库-->关联移植资料档案库-->点击确定
2.5、连接mysql(就是需要进行移植到的mysql数据库),点击选择数据库后确定
3、移植mysql中的表到数据库
3.1、在刚刚建立的mysql中选择需要进行移植的数据库(也可以点击加号,批量选择需要移植的表,此处移植整个数据库,所以我在数据库上右键了),右键选择捕获方案
等待
3.2、在刚捕获的模型中选择需要的数据库或者表等,点击转换为Oracle模型
3.3、设置数据映射,一般默认即可(但是我的项目中mysql使用了datetime和timestamp,如果默认会转为oracle中的date,从而失去了时分秒,如果必须需要十分秒的话,此处映射可以将timestamp-->timestamp,但是datetime这里好像是无法转换为timestamp,只能后面手动修改了...悲剧...),此后点击应用,同样进入进度条
3.4、右键点击刚刚捕获的方案,因为在生成的时候,他会根据方案名称重新创建用户,并将生成的表存放到该用户下,所以建议重命名方案,将其修改为我们需要的用户名称(用户名与密码相同),用户名称也就是我们jdbc或者hibernate连接数据库时将要使用的名称。完成后点击生成。
3.5、生成建立表的sql语句,点击下列红色框按钮开始执行...等待
3.6、执行后,在创建连接,使用我们执行sql中的用户名密码(也就是方案名称),连接后,你会发现,表已经生成了
表移植完毕
4、数据的移植
4.1、右键上次我们创建的转换的模型,选择移动数据
4.2、选择源与目标(目标是我们刚刚建立表的那个连接)
4.3、进入移动数据进度条,等待后,数据移动完成。
2. 请问如何将oracle数据库中的数据迁移到mysql数据库中 谢谢
建议使用工具来做,直接手工命令相当的麻烦的。
1、
建议使用:Toad for Oracle 10、PLSQL Developer等Oracle工具操作。
把Oracle数据库中的数据转为文本或Excel或保存为sql插入语句,再插入Mysql中,这样就不存在接口字符集差异问题。
2、
也可以使用管道方式直接导入,使用PowerBuilder工具导入。
直接dmp是不现实的!
3. oracle的数据库可以导到mysql吗
你好。
当然可以
这就是 数据迁移
从数据类型,数据,函数,存储过程等等,进行改写
上层代码的改写
反正去IOE挺麻烦的
4. 可以吧oracle数据库转换成mysql嘛
技术上可以实现,需要处理两个数据库之间的差异,比如表结构定义的语法和类型,如果是项目中使用,还需要修改连接的驱动类和url。
5. 如何将oracle数据库转换成mysql数据库,现在公司有急用,方法可用的话再加分!
讲解Oracle数据库移植到MySQL
出处:IT专家网 日期:2010-06-24
一、前言
公司原来的项目是基于Oracle数据库的,Oracle功能强大,但是部署和管理较复杂,更重要的是,购买Oracle的费用不是每个客户都愿意承担的。因此,迫切需要把公司项目所用数据库移植到一个简单好用的数据库上。当然,如您所料,我们选择了广受欢迎的MySQL。
作为一个开源数据库,MySQL用无数案例证明了她的可用性,因此让我们把重点放在如何将Oracle移植到MySQL上。已经有很多的文章和专题介绍了Oracle移植到MySQL的方法和步骤,也有相当多的工具可以辅助这种移植过程。但是,由于数据库实现的差异,完美的移植工具是不存在的,移植过程中不断碰到的问题证明了这一点,特别是您使用了Oracle的一些高级特性时。
从Oracle移植到MySQL主要有六个方面的内容需要移植,一是表Table,包括表结构和数据,二是触发器Trigger,三是存储过程Procere,函数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 procere procere1(TableName in varchar2) is
MySQL应该为:
CREATE procere procere1( 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 scheler运行,需要MySql 5.1.6以上,并且在启动后执行SET GLOBAL event_scheler = ON;(也可以在初始配置文件比如my.ini中加入event_scheler = 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 al 在MySQL得到比如 20080223153234(= 20080223153233 + 1)的数
而在Oracle中会得到第二天当前时刻。
11) MySQL单纯的date类型只是日期不带时间,DATETIME或TIMESTAMP带有时间,用DATE_FORMAT函数可以控制显示形式
12)select 'abc' || 'd' from al 两个数据执行的结果不同(语法都能通过),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 al) 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 al where '' is null在Oracle下可以取到记录,在MySQL下不能
al表的使用,substr、trim等函数的主要使用方式和Oracle类似
八、小结和建议
看起来,Oracle移植到MySQL似乎挺麻烦,有没有一键完成的简单办法?呵呵,我没有找到,除非您只使用基本表,只使用基本SQL语句访问它。当然,建议大家初始设计的时侯,就考虑到多数据库的支持,权衡一下使用一些高级功能带来的好处和对可移植性方面带来的损害,这会大大减少后期移植时面对的问题;另外,在应用架构设计时,也建议使用较好的框架去屏蔽这些差异,比如J2EE的Hibernate框架等。
感谢伟大的Oracle,给我们提供了很多的高级功能,有很多是MySQL没有的,因此,在移植时你不得不放弃一些非必须的功能,比如,全表cache、物化视图、函数索引等;如果该功能是必须的,您可能要使用别的方式来实现,或者转到应用程序层面来考虑。当然,这些功能MySQL今天没有,不代表明天也没有,我们可以拭目以待。
由于开源软件的原因,MySQL的bug或者缺陷有时还会干扰你,请仔细测试和优化您的应用程序,调整MySQL的配置参数,确保它可以运行得和Oracle下一样好。
(责任编辑:王倩)
6. 如何把oracle的表结构导入mysql
为了生产库释放部分资源,需要将API模块迁移到mysql中,及需要导数据。
尝试了oracle to mysql工具,迁移时报错不说,这么大的数据量,用这种简陋的工具不大可靠。
意外发现平时用的数据库视图工具Navicat Premium中有数据迁移工具,意外的好用。这个工具本身支持mysql,oracle,sqlLite,PostgreSql数据库,因此而也提供了在不同数据库之间迁移数据的功能。
迁移之前,先确保你建立了这两个数据库的connection。选择Tools/DataTransfer。
7. 如何将oracle的数据迁移到mysql
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语句并在目标端回放
确认MySQL端表结构已经存在
MySQL数据库OGG用户创建
mysql> create user 'ogg'@'%' identified by 'ogg';
mysql> grant all on *.* to 'ogg'@'%';
#### 提前创建好ogg存放checkpoint表的数据库
mysql> create database ogg;
shell> cd $OGG_HOME
shell> ggsci
ggsci> edit param ./GLOBALS
checkpointtable ogg.ggs_checkpoint
ggsci> dblogin sourcedb [email protected]:3306 userid ogg
ggsci> add checkpointtable ogg.ggs_checkpoint
#### 切换至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 [email protected]: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.*;
#### 切换至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
#### 切换至ogg软件目录并执行ggsci进入命令行终端
shell> cd $OGG_HOME
shell> ggsci
ggsci> edit params ri_cms
SPECIALRUN
END RUNTIME
TARGETDB [email protected]: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
根据实际存储数据的长度,对超长的varchar列进行收缩;
对于无法收缩的列转换数据类型为text,但这在使用过程中可能导致一些性能问题;
- mysql>set global foreign_key_checks=off;
目标端不存在delete语句的记录,忽略该问题并不记录到discardfile
目标端丢失update记录
- 更新的是主键值,update转换成insert
- 更新的键值是非主键,忽略该问题并不记录到discardfile
目标端重复insert已存在的主键值,这将被replicat进程转换为UPDATE现有主键值的行
报错信息
- 2019-03-08 06:15:22 ERROR OGG-01201 Error reported by MGR : Access denied.
报错原因
解决办法
- ## 表示该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').
报错原因
解决方法
二、迁移方案
(一)环境信息
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数据库配置
(2)目标端OGG 管理进程(MGR)配置
目标端的MGR进程和源端配置一样,可直接将源端配置方式在目标端重复执行一次即可,该部分不在赘述
(3)目标端OGG 检查点日志表(checkpoint)配置
checkpoint表用来保障一个事务执行完成后,在MySQL数据库从有一张表记录当前的日志回放点,与MySQL复制记录binlog的GTID或position点类似。
#### 切换至ogg软件目录并执行ggsci进入命令行终端
(4)目标端OGG 回放线程(replicat)配置
Replicat进程运行在目标端,是数据投递的最后一站,负责读取目标端Trail文件中的内容,并将解析其解析为DML语句,然后应用到目标数据库中。
注意:replicat进程只需配置完成,无需启动,待全量抽取完成后再启动。
至此源端环境配置完成
待全量数据抽取完毕后启动目标端回放进程即可完成数据准实时同步。
3.全量同步配置
全量数据同步为一次性操作,当OGG软件部署完成及增量抽取进程配置并启动后,可配置1个特殊的extract进程从表中抽取数据,将抽取的数据保存到目标端生成文件,目标端同时启动一个单次运行的replicat回放进程将数据解析并回放至目标数据库中。
(1)源端OGG 全量抽取进程(extract)配置
(2)目标端OGG 全量回放进程(replicat)配置
三、数据校验
数据校验是数据迁移过程中必不可少的环节,本章节提供给几个数据校验的思路共大家参数,校验方式可以由以下几个角度去实现:
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,因此针对这种情况有两种解决方式:
2. 与第一点类似,在Innodb存储引擎中,索引前缀长度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且开启innodblargeprefix的场景下,这个限制是3072 bytes,即使用utf8mb4字符集时,最多只能对varchar(768)的列创建索引;
3. 使用ogg全量初始化同步时,若存在外键约束,批量导入时由于各表的插入顺序不唯一,可能子表先插入数据而主表还未插入,导致报错子表依赖的记录不存在,因此建议数据迁移阶段禁用主外键约束,待迁移结束后再打开。
(二)全量与增量衔接
HANDLECOLLISIONS参数是实现OGG全量数据与增量数据衔接的关键,其实现原理是在全量抽取前先开启增量抽取进程,抓去全量应用期间产生的redo log,当全量应用完成后,开启增量回放进程,应用全量期间的增量数据。使用该参数后增量回放DML语句时主要有以下场景及处理逻辑:
(三)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安全规则
错误信息含义源端报错表示为该抽取进程需要和目标端的mgr进程通讯,但是被拒绝,具体操作为:源端的extract进程需要与目标端mgr进行沟通,远程将目标的replicat进行启动,由于安全性现在而被拒绝连接。
在Oracle OGG 11版本后,增加了新特性安全性要求,如果需要远程启动目标端的replicat进程,需要在mgr节点增加访问控制参数允许远程调用
在源端和目标端的mgr节点上分别增加访问控制规则并重启
(六)数据抽取方式
根据官方文档说明,当前直接通过Oracle数据库抽取数据写到MySQL这种initial-load方式,不支持LOBs数据类型,而表 UNIONPAYCMS.CMSOTCONTENT_RTF 则包含了CLOB字段,无法进行传输,并且该方式不支持超过4k的字段数据类型
将抽取进程中的RMTTASK改为RMTFILE参数
官方建议将数据先抽取成文件,再基于文件数据解析进行初始化导入
8. 怎么把oracle数据移植到mysql
建议还是使用MySQL官方提供的一套工具,以前分开的几个软件工具,目前,已经集成在一个MySQL Workbench (GUI Tools)的一个工具集中。该工具集既有基于GPL使用协议的社区版本,也有基于Commercial License商业许可使用权的标准版本,整个工具中包含了数据库建模与设计、MySQL程序开发集成环境、数据库管理工具,还有就是Migration Toolkits工具,用于将其它数据库源,包含Oralce、SQL Server、DB2、Sybase、PostgreSQL、Access、Excel等等迁移到MySQL的一个工具,按照这个工具要求的几个步骤,就可以比较轻松的把相关数据库源的数据库结构和数据导入到MySQL数据库系统中,如果涉及到数据库端的一些程序,如存储过程、触发器等,可能还需要手动做一些迁移工作;针对每一种数据库的迁移,MySQL也都给出了一份技术指导的白皮书,有兴趣的朋友可以联系我。