借助OGG完成Oracle到MySQL的數據遷移


現在有個任務是需要把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配置的字符集必須是一樣的,否則可能會導致只導進去一部分數據。

更多內容:http://www.wangzhanjianshegs.com/網站建設


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM