阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

借助OGG完成Oracle到MySQL的数据迁移

169次阅读
没有评论

共计 5747 个字符,预计需要花费 15 分钟才能阅读完成。

现在有个任务是需要把 Oracle 的数据迁移到 MySQL,因为就涉及到了几个表,所以我最先想到了使用 spool 把 Oracle 的数据导成 txt 文件,然后再 load 进去 MySQL。非常遗憾的是,我的有一个表有 110 个字段,并且有 160 万的数据,始终就只能倒进一部分数据,最后由于时间问题,没有继续尝试,然后打算用 golden gate 完成任务。

我们知道 golden gate 主要就在于几个进程的配置,安装很简单,解压缩就可以,下面重点讲解各个进程的配置问题。
整体迁移的思路以及注意事项:
首先在 oracle 端和 mysql 端安装上 OGG,安装很简单,然后在 oracle 源端和目标端配置好 mgr(端口需要一致), 然后在源端配置上抓取进程,在目标端配置上 replicate 进程(只运行一次即可),然后在源端使用 DEFGEN 命令做映射文件,并把文件传到 mysql 端相应目录下。启动源端的抓取进程即可实现数据库初始化,也就完成了数据迁移。
注意事项和相关报错:
1,oracle 到 mysql 的 ogg 属于异构的 ogg, 需要借助 DEFGEN 命令生成一个映射文件,也就是两个表的映射关系,并把文件放到目标端相应位置下。否则会报错 WARNING OGG-01194 EXTRACT task RINIG1 abended : Could not find definition for INFOSERVICE.T_MEMBER_INFO_SUM
2,在源端配置抓取进程,需要注意的是:初始化数据库过程需要一个的抓取进程,之后保持数据同步也需要一个抓取进程,这两个抓取进程是有区别的,然后目的端也需要两个 replicate 进程,一个用来初始化数据库,一个用来实时同步数据。
3,注意 oracle 字段默认是区分大小写的,但是 mysql 默认是不区分的。如下:
mysql> select login_id from T_MEMBER_INFO where login_id = ‘SHFRONT’;
+———-+
| login_id |
+———-+
| shfront |
| SHFRONT |
+———-+
2 rows in set (0.81 sec)
需要这样修改,让 mysql 对大小写敏感。
mysql> alter table T_MEMBER_INFO modify login_id varchar(100) binary;
mysql> select login_id from T_MEMBER_INFO where login_id = ‘SHFRONT’;
+———-+
| login_id |
+———-+
| SHFRONT |
+———-+
1 row in set (0.78 sec)
如果 mysql 的主键是 login_id, 那么可能会遇到下面这个报错,主键冲突,真正的原因是:mysql 字段值默认是不区分大小写
报错:WARNING OGG-01004 Aborted grouped transaction on ‘liuwenhe.T_MEMBER_INFO_SUM’, Database error 1062 ([SQL error 1062]Duplicate entry ‘shandongchaoyue’ for key ‘PRIMARY’
 
从 oracle 转到 MySQL 的 OGG,在使用 mysql 过程中,会遇到很多不同于 oracle 的问题,初始化数据的时候总是报主键冲突,但是这些数据都是从同样表结构的 oracle 数据库中导出来的,当然主键也是一样的。
查看了一下数据文件,发现存在很多数据只是大小写不一样,如’goolen,‘GOOLEN’,‘Goolen’这样的数据,
其实 MySQL 中,字段值默认是不区分大小写的,也就是说插入值‘abc’和 ’ABC‘是等价的,
下面展示具体的配置:
源端 oracle 抓取进程配置:
[oracle@master2 ggs]$ cd   /u01/OGG_linux/ggs 
[oracle@master2 ggs]$ ./ggsci
Oracle GoldenGate Command Interpreter for Oracle
Version 11.2.1.0.1 OGGCORE_11.2.1.0.1_PLATFORMS_120423.0230_FBO
Linux, x64, 64bit (optimized), Oracle 11g on Apr 23 2012 08:32:14
 
Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
 
1,GGSCI (master2) 1>  create  subdirs  
Creating subdirectories under current directory /u01/OGG_linux/ggs
Parameter files                /u01/OGG_linux/ggs/dirprm: already exists
Report files                   /u01/OGG_linux/ggs/dirrpt: created
Checkpoint files               /u01/OGG_linux/ggs/dirchk: created
Process status files           /u01/OGG_linux/ggs/dirpcs: created
SQL script files               /u01/OGG_linux/ggs/dirsql: created
Database definitions files     /u01/OGG_linux/ggs/dirdef: created
Extract data files             /u01/OGG_linux/ggs/dirdat: created
Temporary files                /u01/OGG_linux/ggs/dirtmp: created
Stdout files                   /u01/OGG_linux/ggs/dirout: created,
2,登录数据库 
GGSCI (master2) 3> dblogin userid ogg,password ogg
Successfully logged into database.
 
3,添加需要同步的用户到 ogg
开启 scott 用户下所有表的附加日志
GGSCI (WebServer) 3> add trandata infoservice.*
2013-03-08 11:02:33  WARNING OGG-00869  No unique key is defined for table ‘BONUS’.
All viable columns will be used to represent the key, but may not guarantee
uniqueness.  KEYCOLS may be used to
define the key.
Logging of supplemental redo data enabled
for table SCOTT.BONUS.
Logging of supplemental redo data enabled
for table SCOTT.DEPT.
Logging of supplemental redo data enabled
for table SCOTT.EMP.
2013-03-08 11:02:34  WARNING OGG-00869  No unique key is defined for table
‘SALGRADE’. All viable columns will be used to represent the key, but may not
guarantee uniqueness.  KEYCOLS may be
used to define the key.
Logging of supplemental redo data enabled
for table SCOTT.SALGRADE.
4,GGSCI (WebServer) 4> info trandata scott.*
Logging of supplemental redo log data is
enabled for table SCOTT.BONUS.
Columns supplementally logged for table
SCOTT.BONUS: ENAME, JOB, SAL, COMM.
Logging of supplemental redo log data is
enabled for table SCOTT.DEPT.
Columns supplementally logged for table
SCOTT.DEPT: DEPTNO.
Logging of supplemental redo log data is
enabled for table SCOTT.EMP.
Columns supplementally logged for table
SCOTT.EMP: EMPNO.
Logging of supplemental redo log data is
enabled for table SCOTT.SALGRADE.
Columns supplementally logged for table
SCOTT.SALGRADE: GRADE, LOSAL, HISAL.
 
3,GGSCI (master2) 3>edit params mgr
PORT 7839
4,GGSCI (master2) 3> start  mgr
 
5,GGSCI (master2) 3>info  mgr
Manager is running (IP port
WebServer.7839).
 
1. 抓取进程
GGSCI (oracle3) 10>add extract  ext_1,sourceistable ####sourceistable 代表直接从表中读取数据
 
GGSCI (oracle3) 10> view params ext_1
 
extract ext_1
setenv (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)
userid goldengate@cbl , password ogg123456
rmthost 192.168.0.12,mgrport 7839
rmttask replicat,group rinig1
table INFOSERVICE.T_MEMBER_INFO;
2.DEFGEN 命令生成的映射文件。
1)创建 DEFGEN 工具的参数文件;
GGSCI (oracle3) 3> view params defgen
defsfile ./dirdef/source.def, purge
userid ogg@rman_cbl1 , password ogg
TABLE INFOSERVICE.T_PUBLISH_INFO;
TABLE INFOSERVICE.T_PUBLISH_ZBXX;
TABLE INFOSERVICE.T_MEMBER_INFO;
TABLE INFOSERVICE.T_MEMBER_INFO_FUBIAO1;
TABLE INFOSERVICE.T_MEMBER_INFO_SUM;
TABLE INFOSERVICE.T_MEMBER_MY;
TABLE INFOSERVICE.T_MEMBER_MY_INFO;
TABLE INFOSERVICE.T_PUBLISH_INFO_SUM_TONGJI;
TABLE INFOSERVICE.USER_REGIST_LS_FAIL;
TABLE INFOSERVICE.USER_REGIST_LS;
2))运行 DEFGEN 工具生成数据定义文件
进入 GGSCI 安装目录下,命令行执行:
[oracle@oracle3 ogg]$./defgen paramfile dirprm/defgen.prm
3) 把生成的文件 scp 到目标端相应文件下:
[oracle@oracle3 ogg]scp /home/oracle/ogg/dirdef/source.def root@192.168.0.12:/files/ogg/dirdef/source.def
 
目标端:replicate 配置:
GGSCI (db2) 1> add replicat rinig1,specialrun //specialrun 代表只运行一次
注意下面的 target liuwenhe.T_MEMBER_INFO
GGSCI (server02) 12> view params rinig1
 
replicat rinig1
sourcecharset ZHS16GBK
setenv (NLS_LANG=AMERICAN_AMERICA.zhs16gbk)
sourcedefs ./dirdef/source.def
sourcedb infoservice,userid ogg,password ogg
discardfile ./dirrpt/rinig1.dsc,purge
map infoservice.T_MEMBER_INFO, target liuwenhe.T_MEMBER_INFO REPERROR (1403, discard);
最后打开源端的抓取进程即可
 
GGSCI (oracle3) 3>start ext_1
GGSCI (oracle3) 3> view report ext_1 ### 查看输出结果
最后可以看日志:
ogg 错误日志
[root@server02 dirdef]# find / -name ggserr.log
[root@server02 dirdef]#tail -f /files/ogg/ggserr.log
总结:
oracle 到 mysql 的 ogg 需要借助 defgen 命令生成的映射文件, 并把文件传到目标端相应位置下,才能完成数据库初始化,用于初始化的 replicate 进程,只会运行一次。注意字符集问题,就是源端的抓取进程配置的字符集和目标端 replicate 配置的字符集必须是一样的,否则可能会导致只导进去一部分数据。

更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-03/141916.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计5747字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中