GoldenGate在異種OS上同種DB之間的數據同步

Oracle GoldenGate在異種OS上同種DB之間的數據同步




Oracle GoldenGate (以下簡稱OGG)在異種OS上同種DB之間的數據同步。

ogg能實現的功能:
 
可以細化到單表同步,符合特定where條件的rows同步,指定column的同步。
 
ogg 的競爭對手:ibm cdc;dell shareplex;dsg;dds等等
 
環境描述:
 源頭:windows 2003x64bit, oracle db 11.2.0.3 x64bit
 目的端:SUSE linux ,oracle db 11.2.0.3
 
預先準備:
 1.Microsoft Visual C ++ 2005 SP1 Redistributable Package
  注意點:第一:該c++的package 區分bit數,並且一定要下載sp1版本的package。
          第二:只要是在windows上使用ogg,這個c++的package就一定得裝,
            不管db是不是oracle ,sqlserver,不管ogg用於源頭數據庫還是用於目的端數據庫。
 
2.ogg for windows x64bit 下的 oracle db 11.2.0.3 x64bit介質。--p18794252_1121023_MSWIN-x86-64.zip
 3.ogg for linux  x64bit 下的 oracle db 11.2.0.3 x64bit介質。--p18794252_1121023_Linux-x86-64.zip
 
  注意點:
  第一:ogg介質,除了基礎版(比如說11.2.1.0.1,最後的這個.1就是基礎版本)可以從www.oracle.com下載,
  ogg的後續補丁只能從mos上下載。
  第二:ogg的介質區分os類型,db類型,db 版本,db bit數。
  但是對於如下的情況是同一個ogg介質:oracle db 11.2.0.3 x64bit 安裝在suse11下和安裝在suse 10下。

--------------------------------------------------------------------------------

Linux-6-64下安裝Oracle 12C筆記 http://www.linuxidc.com/Linux/2013-07/86805.htm

CentOS 6.4下安裝Oracle 11gR2(x64) http://www.linuxidc.com/Linux/2014-02/97374.htm

Oracle 11gR2 在VMWare虛擬機中安裝步驟 http://www.linuxidc.com/Linux/2013-09/89579p2.htm

Debian 下 安裝 Oracle 11g XE R2 http://www.linuxidc.com/Linux/2014-03/98881.htm

--------------------------------------------------------------------------------
 
實施過程
 1.上傳介質到源頭和目的端。
 2.在源頭的實施過程:
 2.1 創建goldengate系統用戶並授權
  Sql> create tablespace GGTBS datafile 'd:\相關路徑\ggtbs01.dbf'size 1024M auextend on;
  Sql> Create user Goldengate default tablespace ggtbs identified by oracle;(目標數據庫也創建這一個goldengate用戶)
  Sql> grant dba to goldengate;
 2.2 將數據庫設置爲歸檔模式--一般的生產庫都處於歸檔模式。
 2.3 打開源端數據庫的附加日誌
    Sql>alter databse add supplemental log data;
    切換日誌使附加日誌生效:
    Sql>alter system archive log current;
 2.4 檢查源端數據庫的附加日誌
    Sql>select supplemental_log_data_min from v$database;
    --返回yes表示附加日誌已經打開。
 2.5 打開源頭數據庫的force logging:
    sql> alter database force logging;
 2.6 對 主庫 執行檢查腳本,確認如下情況是否存在:找出唯一索引的索引列的列定義允許爲null的
 
select dic.table_owner, dic.table_name, dic.index_name, di.uniqueness,dic.column_name
 from dba_ind_columns  dic , dba_indexes di,dba_tab_columns dtc
 where dic.table_owner=’自行添加用戶’and dtc.OWNER='自行添加用戶’
 AND dic.table_owner=di.table_owner and dic.TABLE_NAME=di.table_name 
and dic.index_name=di.index_name
 and di.uniqueness='UNIQUE'    and dtc.owner=di.table_owner  
and dtc.TABLE_NAME=di.table_name and dic.column_name=dtc.COLUMN_NAME  and dtc.nullable='Y'
 and dic.TABLE_NAME=dtc.TABLE_NAME
 
--->自行添加用戶請用需要同步的user來代替。
 對於查詢出來的表和唯一索引名,請修改:要麼變爲非唯一索引,要麼在保留唯一索引的情況下,將列的定義置爲not null。
 
2.7 假設將ogg軟件放在d:\ggs目錄下,cmd界面下進入d:\ggs
    ggsci>create subdirs  -->該命令的作用是在d:\ggs下建立dirprm、dirdat、dirrpt等下級目錄。
 2.8 ggsci>edit params ./GLOBALS
    添加如下的字符,之後保存退出
    MGRSERVNAME GGSSERVICE
 2.9 建立ogg的 windows service 
  D:\ggs>install addservice autostart
 

2.10 爲表添加補充日誌
    ggsci>dblogin userid goldengate password oracle
    ggsci> add trandata USER1.*    --->注意:*後別加分號。
    ggsci> add trandata USER2.*    --->注意:*後別加分號。
    ggsci> add trandata USER3.*    --->注意:*後別加分號。   

    確認表的補充日誌是否已經添加:
    select table_name from all_tables 
    where owner='USER1' and table_name not in (select distinct table_name from dba_log_groups where owner='USER1');
 
2.11 配置DDL複製
 SQL> GRANT EXECUTE ON UTL_FILE TO goldengate;
 ggsci>edit params ./GLOBALS  添加如下的字符,之後保存退出
 GGSCHEMA goldengate
 
cmd下 cd 到d:\ggs目錄
 退出所有的oracle session
 sqlplus / as sysdba
 SQL> @marker_setup.sql
 SQL> @ddl_setup.sql
 SQL> @role_setup.sql
 SQL> grant ggs_ggsuser_role to goldengate;
 SQL> @ddl_enable.sql
 
2.12 配置sequence的同步(若是備庫是報表查詢需求,請忽略此步)
 cmd下 cd 到d:\ggs目錄
 sqlplus / as sysdba
 SQL> @sequence.sql
 --->源頭執行:SQL> GRANT EXECUTE on goldengate.updateSequence TO goldengate;
 --->目的端執行:SQL> GRANT EXECUTE on goldengate.replicateSequence TO goldengate;
 2.13 源端配置參數文件
 ggsci > edit params mgr
 添加如下參數,之後保存退出。
 port 7809
 autostart extract *
 autorestart extract *, waitminutes 1, retries 60, RESETMINUTES 60
 PURGEOLDEXTRACTS d:\ggs\dirdat\st*, USECHECKPOINTS, MINKEEPHOURS 2
 

ggsci> add  extract  extfull, tranlog, Threads 2, begin now
 --->以上命令是針對主庫是rac2個節點的情況,若是單機,請忽略Threads 2
 
ggsci >edit  params  extfull
 添加如下參數,之後保存退出
 extract extfull
 setenv ( NLS_LANG = " AMERICAN_AMERICA.ZHS16GBK " )
 --TRANLOGOPTIONS ASMUSER SYS@ASM1, ASMPASSWORD oracle
 --THREADOPTIONS MAXCOMMITPROPAGATIONDELAY 80000 IOLATENCY 160000
 
DBOPTIONS ALLOWUNUSEDCOLUMN
 userid goldengate, password oracle
 
ddl include mapped
 
ddloptions addtrandata RETRYOP MAXRETRIES 1000 RETRYDELAY 10, REPORT
 
WARNLONGTRANS 1h, CHECKINTERVAL 5m
 
exttrail d:\ggs\dirdat\st
 gettruncates
 dynamicresolution
 
tableexclude 'USER.cncdata';
 tableexclude 'USER.sb_czm_pyDD';
 
table USER1.*;
 table USER2.*;
 table USER3.*;
 
sequence USER1.*;
 sequence USER2.*;
 sequence USER3.*;
 
2.14 添加trail文件,文件名爲d:\ggs\dirdat\st,是由extfull抽取進程來寫這個trail文件,每個trail文件的最大大小爲50M
 ggsci> add exttrail  d:\ggs\dirdat\st, extract extfull, MEGABYTES 50
 --->注意:
 注意:源頭的trail文件名一定要與目的端的trail文件名用不同的名稱,比如:
 源頭的trail文件名/u02/ggs/dirdat/sd
 目的端的trail文件名/u02/ggs/dirdat/td
 原因是:ogg trail文件的刪除機制(檢查點機制)是以一整套複製環境(源頭和目的端)爲標準判斷的:
 這樣就有可能造成這麼一個後果:源頭的trail文件號到了1000,目的端trail文件號到了100,並且源頭和目的端trail文件名同名,由於存在
 
100,所以,源頭能刪除的trail文件號是<100的。這樣會導致源頭trail 不能及時刪除,進而造成源頭$GG_HOME的文件系統使用率100%,進而造
 
成ext進程抽取形成的trail文件無處存放而導致ext進程 abend。
 
2.15 在源端添加傳輸進程dpfull,此傳輸進程傳輸的是源端形成的d:\ggs\dirdat\st這個trail文件
 ggsci> add extract dpfull exttrailsource d:\ggs\dirdat\st
 
2.16 創建遠程隊列文件(文件名爲/u02/ggs/dirdat/tt)並將其指定給傳輸進程,同樣可以指定大小爲50M
 ggsci> add rmttrail /u02/ggs/dirdat/tt, extract dpfull, MEGABYTES 50
 
2.17 編輯dpfull進程的參數:
 ggsci> edit params dpfull
 添加如下參數,之後保存退出
 extract dpfull
 passthru
 rmthost 目的端IP, mgrport 7809
 rmttrail /u02/ggs/dirdat/tt
 gettruncates
 table USER1.*;
 table USER2.*;
 table USER3.*;
 
sequence USER1.*;
 sequence USER2.*;
 sequence USER3.*;
 

2.18 源端數據庫查詢出一個scn號:
 select current_scn from v$database;
 --12754579013479
 
請牢記這個scn號,在目的端第一次啓動rep進程時,會用到這個scn號
 
源端開始按照此scn號開始導出數據
 expdp  sys/****** directory=exp dumpfile=trff_app%U.dmp logfile=trff_app_exp.log schemas=trff_app  parallel=4
 
flashback_scn=12754579013479
 
 
 
3.在目的端的實施過程:
 3.1 配置環境變量信息:
 備庫是Linux os時:
 vi .bash_profile
 export PATH=$PATH:$ORACLE_HOME/bin:/u02/ggs
 export LD_LIBRARY_PATH=/u02/ggs:$ORACLE_HOME/lib

3.2 創建goldengate系統用戶並授權
  Sql> create tablespace GGTBS datafile '/u02/相關路徑/ggtbs01.dbf'size 1024M auextend on;
  Sql> Create user Goldengate default tablespace ggtbs identified by oracle;(目標數據庫也創建這一個goldengate用戶)
  Sql> grant dba to goldengate;
 3.3配置mgr參數文件:
 ggsci > edit params mgr
 port 7809
 --autostart replicat *
 --autorestart replicat *, waitminutes 1, retries 60, RESETMINUTES 60
 --PURGEOLDEXTRACTS /u02/ggs/dirdat/tt*, USECHECKPOINTS, MINKEEPHOURS 2
 
3.4 在目的端添加checkpointtable
 ggsci> dblogin  userid goldengate, password oracleoracle
 ggsci> ADD CHECKPOINTTABLE goldengate.ckptfull
 ggsci> add replicat repfull, exttrail /u02/ggs/dirdat/tt, CHECKPOINTTABLE goldengate.ckptfull
 ggsci> edit params repfull
 replicat repfull
 setenv ( NLS_LANG =  " AMERICAN_AMERICA.ZHS16GBK " )
 
assumetargetdefs
 
userid goldengate, password oracle
 
DBOPTIONS DEFERREFCONST, SUPPRESSTRIGGERS
 gettruncates
 ALLOWNOOPUPDATES
 ddl include mapped
 
discardfile ./dirrpt/repfull.dsc, append, megabytes 5000
 
map USER1.*, target USER1.*;
 map USER2.*, target USER2.*;
 map USER3.*, target USER3.*;
 
配置完畢:
 
注意:以上repfull進程請不要啓動,repfull進程在impdp導入完數據之後再啓動。
 
在目的庫執行impdp執行數據導入,完成導入後,再執行下面的步驟。
 啓動目的端rep進程之前, 請務必確認如下的事項已經完成:
 
第一, 在rep參數文件中有參數DEFERREFCONST禁用級聯刪除
 
第二, 在rep參數文件中有參數SUPPRESSTRIGGERS 在rep進程運行時抑制目的端數據庫的觸發器生效。
 注意:SUPPRESSTRIGGERS此參數僅僅對10.2.0.5 及以後,11.2.0.2及以後的oracle 數據庫版本纔有效,所以,若是目的端數據庫是10.2.0.4,還需要在目的端數據庫中手工禁用觸發器(用plsql dev就可以禁用)
 
第三, Impdp已經導入完成,這是必須的,這一點我不用再多解釋了。
 
第一次啓動repfull進程時,請使用如下的命令來啓動:
 start repfull, aftercsn 12754579013479

更多Oracle相關信息見Oracle 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新鏈接地址http://www.linuxidc.com/Linux/2014-07/104279.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章