藉助ogg完成oracle到mysql的資料遷移

賀子_DBA時代發表於2017-03-02
現在有個任務是需要把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欄位值預設是不區分大小寫

從oracle轉到MySQL的OGG,在使用mysql過程中,會遇到很多不同於oracle的問題,初始化資料的時候總是報主鍵衝突,但是這些資料都是從同樣表結構的oracle資料庫中匯出來的,當然主鍵也是一樣的。
檢視了一下資料檔案,發現存在很多資料只是大小寫不一樣,如’goolen,‘GOOLEN’,‘Goolen’這樣的資料,
其實MySQL中,欄位值預設是不區分大小寫的,也就是說插入值‘abc’和'ABC‘是等價的,
下面展示具體的配置:
源端oracle 抓取程式配置:
[ ggs]$ cd   /u01/OGG_linux/ggs 
[ 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配置的字符集必須是一樣的,否則可能會導致只導進去一部分資料。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-2134611/,如需轉載,請註明出處,否則將追究法律責任。

相關文章