2022年8月26日 星期五

5. Replicate

OGG Replicate 主要的功能就是將 Trail File 的內容 Apply 到 Target 資料庫,目前 Replicate 總共有四種模式, Classic Replicate 、 Coordinated Replicate 、 Integrated Replicate 以及 Parallel Replicate 。


  • Classic Replicate

Classic Replicate 為 OGG 軟體最源生的同步模式,由 OGG 軟體本身啟動 Replicate Process 來讀取 Trail File 的內容以及將異動更新到 Target 資料庫,同樣的需先設定 Replicate 參數,例如建立一個名為 rep1 的 Replicate Group :

$ ./ggsci

GGSCI> edit param rep1


REPLICAT REP1

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="ORCL")

SETENV (ORACLE_HOME="/u01/app/oracle/product/11.2.0.4/dbhome_1")

USERID ogg, PASSWORD ogg

ASSUMETARGETDEFS 

APPLYNOOPUPDATES

DISCARDFILE ./dirrpt/REP1.dsc, MEGABYTES 10, PURGE

DDL INCLUDE MAPPED

DDLOPTIONS REPORT

DBOPTIONS DEFERREFCONST

DBOPTIONS SUPPRESSTRIGGERS 


MAP HR.*, TARGET HR.*;


ASSUMETARGETDEFS : 表示 Target Table 的表格定義與 Source Table 相同。

APPLYNOOPUPDATES : 表示當 Update 的 Before Value 與 After Value 相同時,仍然執行 Update 的操作。

DDL INCLUDE MAPPED : 只有下列 Mapping 的物件才執行 DDL 的操作。

DBOPTIONS DEFERREFCONST : 資料同步時忽略 Constraint 的限制。

DBOPTIONS SUPPRESSTRIGGERS : 資料同步時不觸發 Trigger 。

MAP HR.*, TARGET HR.* : 同步 HR 底下所有物件。


設定完參數就可以新增 Replicate Group ,指定 rep1 這個 Replicate 同步 R1 開頭的 Trail 內容 :

GGSCI> add replicat rep1, exttrail ./dirdat/R1


基於 Source 端 export 的 SCN Number ,新增完 Replicate Group 之後就可以由這個 SCN Number 之後開始同步,例如 :

GGSCI> start replicat rep1, aftercsn 34821758


  • Coordinated Replicate

Classic Replicate 除非是使用 Range 函數將資料切分,否則只能使用單線程進行同步, Coordinated Replicate 是 OGG 12c 的新功能,可以使用多線程進行同步,同一組 Replicate 可以產生出多個 Replicate Thread ,並且前端由一個 Coordinated Replicate 進行整合,並且每一個 Process 都有各自的 Checkpoint File :


使用 Coordinated Replicate 需要在參數中新增 USEDEDICATEDCOORDINATIONTHREAD 參數,同步的物件可以指定或不指定 Thread :

REPLICAT REP1

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="ORCL")

SETENV (ORACLE_HOME="/u01/app/oracle/product/11.2.0.4/dbhome_1")

USERID ogg, PASSWORD ogg

ASSUMETARGETDEFS 

APPLYNOOPUPDATES

DISCARDFILE ./dirrpt/REP1.dsc, MEGABYTES 10, PURGE

DDL INCLUDE MAPPED

DDLOPTIONS REPORT

DBOPTIONS DEFERREFCONST

DBOPTIONS SUPPRESSTRIGGERS 

USEDEDICATEDCOORDINATIONTHREAD  


MAP HR.*, TARGET HR.*;

MAP SCOTT.*, TARGET SCOTT.*, THREADRANGE(1-3);

MAP JOHN.*, TARGET JOHN.*, THREAD(4);


以上參數同步 HR 不指定 Thread 、 同步 SCOTT 指定使用第 1 ~ 第 3 個 Thread 進行同步 , 同步 JOHN 指定只使用第 4 個 Thread 進行同步 。


參數編輯完就可以新增 Coordinated Replicate Group ,使用 maxthreads 來定義最多可以產生幾個 Threads :

GGSCI> add replicat rep1, coordinated, exttrail ./dirdat/R1, maxthreads 10

GGSCI> start replicat rep1, aftercsn 34821758


  • Integrated Replicate

Integrated Replicate 為 OGG 12c 的新功能,主要是針對 Oracle 資料庫,於資料庫內部產生 Apply Process 來進行同步,藉由 Oracle 原本擁有的 Stream 功能於資料庫內建立一個 Inbound Server ,其中包含了 Receiver 、 Preparer 、 Coordinator 以及 Applier 這四種 Process :


Receiver : 用來將 OGG Trail File 的格式轉換為資料庫可以讀取的 LCRs 格式 (Logical Change Records) 。

Preparer : 可以稱做是 Reader Process ,用來讀取 LCRs 的內容。

Coordinator 與 Applier : 將 LCRs 的內容同步到資料庫中。


使用 Integrated Replicate 需在參數中加入 INTEGRATEDPARAMS 相關設定 :

REPLICAT REP1

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="ORCL")

SETENV (ORACLE_HOME="/u01/app/oracle/product/11.2.0.4/dbhome_1")

USERID ogg, PASSWORD ogg

ASSUMETARGETDEFS 

APPLYNOOPUPDATES

DISCARDFILE ./dirrpt/REP1.dsc, MEGABYTES 10, PURGE

DDL INCLUDE MAPPED

DDLOPTIONS REPORT

DBOPTIONS DEFERREFCONST

DBOPTIONS SUPPRESSTRIGGERS 

DBOPTIONS INTEGRATEDPARAMS (MAX_SGA_SIZE 2048, MAX_PARALLELISM 4)  


MAP HR.*, TARGET HR.*;


MAX_SGA_SIZE 2048 : 使用資料庫的 Stream Pools 上限為 2G 。

MAX_PARALLELISM 4 : 最多產生四個 Applier Threads 。


參數編輯完就可以新增 Integrated Replicate Group :

GGSCI> dblogin userid ogg, password ogg

GGSCI> add replicat rep1, integrated, exttrail ./dirdat/R1

GGSCI> start replicat rep1, aftercsn 34821758


Integrated Replicated 等於是利用 Oracle Stream 的特性將 OGG 與 Oracle 資料庫做一個整合,由於使用的是 Stream ,所以 Oracle 資料庫必須要設定足夠大的 Stream Pool Size ,否則有可能產生效能或是記憶體不足等問題。 Integrated Replicated 要求 Oracle 資料庫必須為 11.2.0.4 以上的版本才可以使用。


  • Parallel Replicate

Parallel Replicate 為 OGG 12.3 版本的新功能,由 OGG 軟體本身使用多個 Threads 來進行 Apply ,功能上與 Coordinated Replicate 相同,但整體架構是不同的,等於是針對 Coordinated Replicate 做一個加強與改進。 Parallel Replicate 主要會產生一個 Master Process ,其中包含了兩大 Process , Collater 與 Scheduler , Collater 用來管理 Mapper Process , Mapper 主要是用來讀取 Trail File 的內容所用,可以設定一個或多個 Mapper 來增加讀取速度; Scheduler 用來管理 Applier Process , Applier 主要是將變更同步到資料庫中所用 :


由此可知與 Coordinator 最大的不同是, Parallel Replicate 添加了 Mapper Process ,可以多線程讀取 Trail File 來增加速度。使用 Parallel Replicate 於需添加相關參數 :

REPLICAT REP1

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="ORCL")

SETENV (ORACLE_HOME="/u01/app/oracle/product/11.2.0.4/dbhome_1")

USERID ogg, PASSWORD ogg

ASSUMETARGETDEFS 

APPLYNOOPUPDATES

DISCARDFILE ./dirrpt/REP1.dsc, MEGABYTES 10, PURGE

DDL INCLUDE MAPPED

DDLOPTIONS REPORT

DBOPTIONS DEFERREFCONST

DBOPTIONS SUPPRESSTRIGGERS 

MAP_PARALLELISM 2

APPLY_PARALLELISM 4

MIN_APPLY_PARALLELISM 2

MAX_APPLY_PARALLELISM 4

SPLIT_TRANS_RECS 100  


MAP HR.*, TARGET HR.*;


MAP_PARALLELISM : 設定 Mapper Process 數量。

APPLY_PARALLELISM : 設定 Applier Process 數量。

MIN 、 MAX_APPLY_PARALLELISM : 設定 Applier 最大最小數量。

SPLIT_TRANS_RECS : 將 Large Transaction 拆分為每個 Transaction 為多少數量來進行同步。


參數設定完之後就可以來新增 Parallel Replicate Group ,這邊比較特殊的是, Parallel Replicate 可以基於 Classic Replicate 或者是 Integrated Replicate 來使用,一般來說基於 Classic Replicate 來使用還是比較多的,畢竟 Classic Replicate 原本是不具有多線程的功能,有了 Parallel Replicate 加強之後, Classic Replicate 可以運用的場合又更多了 :

GGSCI> add replicat rep1, parallel, exttrail ./dirdat/R1

GGSCI> start replicat rep1, aftercsn 34821758


如果是要添加基於 Integrated 的 Parallel Replicate ,只要加上 Integrated 關鍵字就可以了:

GGSCI> dblogin userid ogg, password ogg

GGSCI> add replicat rep1, integrated, parallel, exttrail ./dirdat/R1

GGSCI> start replicat rep1, aftercsn 34821758


最後值得一提的是, Parallel Replicate 必須是 OGG Trail File Format 為 12.1 以上才可以使用,因此對於 Oracle 資料庫也必須要求是 12c 以上的版本才可以使用。


雖然 OGG Replicate 有這麼多種模式可以使用,不過與 Extract 的搭配上並沒有所限制,例如 Source 端可以使用 Classic Extract ,而 Target 端可以使用 Integrated Replicate ,不過到了 OGG 21c 的版本之後,將不再支援 Classic Replicate / Extract ,因此熟悉其它新功能還是必須的。



2022年8月24日 星期三

4. Initial Load

在進行 OGG 資料的差異同步之前,必須先把資料做一次初始化的同步,資料初始化 (Initial Load) 的方式有兩種,一種是使用 OGG 的機制做初始化,另一種方式是使用 Oracle 資料庫的 export 、 import ,如果同步的資料庫不全部為 Oracle ,那麼就只能使用 OGG 本身的機制來做初始化了。


使用 OGG來做資料初始化同樣的需設定一組 Extract 與 Replicate , Extract 用來抽取來源端的資料,而 Replicate 則是把這些資料餵進 Target 端資料庫,這組 Extract 與 Replicate 只執行這一次的任務,也就是資料初始化完成後,這組 Extract 與 Replicate 就不再使用了。


建立 Initial Load Extract 與一般的 Extract 沒有太多的差別,在於 Initial Load Extract 的參數檔多了 SOURCEISTABLE 這個參數,表示 Extract 只執行這一次的任務,另外 Initial Load Extract 是直接把抽取出來的 Trail File 傳送到 Target 端,無須再設定一個 Pump 來傳送,例如要初始化 HR 這個使用者底下所有的 Table ,設定 Initial Load Extract 的參數 initload.prm 如下:

SOURCEISTABLE

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="ORCL")

SETENV (ORACLE_HOME="/user1/OraHome/db")

USERID ogg, PASSWORD ogg

RMTHOST 192.168.49.20 , MGRPORT 7809

RMTFILE ./dirdat/ia , MAXFILES 9999 , Megabytes 200


TABLE HR.*;


  • RMTHOST : 設定 Target 端的 IP 與 MGR PORT 。

  • RMFILE : 設定 Target 端的 Trail File 名稱,以 ia 開頭 。


設定完 Initial Load Extract 的參數之後,接下來就可以直接執行 extract 來抽取 Source 端的資料:

$ cd $GG_HOME

$ ./extract paramfile ./dirprm/initload.prm


在執行完 Initial Load Extract 之後,接下來就可以在 Target 端設定 Initial Load Replicate 將資料餵進 Target 資料庫,在 Target 端設定參數 initrep.prm 如下:

SPECIALRUN

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID="ORCL")

SETENV (ORACLE_HOME="/user1/OraHome/db")

USERID ogg, PASSWORD ogg

EXTFILE ./dirdat/ia , MAXFILES 9999 , Megabytes 200 , append 


MAP HR.*, TARGET HR.*;


  • SPECIALRUN : 表示 Replicate 只執行這一次的任務。

  • EXTFILE : 設定要 Apply 的 Trail File 名稱,這邊設定為 ia 開頭的 Trail 。


設定完 Initial Load Replicate 之後,在 Targert 端就可以直接執行 replicat 來 Apply 這些初始化的資料:

$ cd $GG_HOME

$ ./replicat paramfile ./dirprm/initrep.prm


Initial Load Replicate 任務結束後就完成了資料初始化的工作了。


如果 Source 與 Target 都是 Oracle 資料庫,那麼就可以使用 export 、 import 來完成資料的初始化,首先在 Source Oracle 資料庫查詢當前的 SCN Number :

$ sqlplus / as sysdba

SQL> select to_char(dbms_flashback.get_system_change_number)  A from dual;


A

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

137091649905


在獲得 SCN Number 之後,就可以使用以指定 flashback_scn 的方式來將資料 export 出來 :

$ expdp \'/ as sysdba\' directory=expdir dumpfile=exp%U.dmp schemas=HR exclude=statistics parallel=2 flashback_scn=137091649905 logfile=exp.log


如果是 9i 以前的版本,傳統的 exp 指令也可以指定 flashback_scn :

$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

$ exp \'/ as sysdba\' file=/dmp/exp.dmp owner=HR buffer=1000000 flashback_scn=137091649905 recordlength=65535 log=exp.log


export 完成後,接下來把資料 import 到 Target 資料庫便完成了資料初始化的動作 :

$ impdp \'/ as sysdba\' directory=impdir dumpfile=exp%U.dmp parallel=2 logfile=imp.log


9i 以前的版本,傳統 imp 指令:

$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

$ imp \'/ as sysdba\' file=/dmp/exp.dmp full=y buffer=1000000 commit=y recordlength=65535 log=imp.log


兩種初始化資料方法的最大差別在於,使用 Oracle export 、 import 可以指定資料起始點的 SCN ,在資料初始化結束之後的同步,可以使用 aftercsn 讓 Replicate 直接從這個 SCN 時間點之後的資料開始同步就好;而 OGG 本身的 Initial Load 並沒有 SCN 的機制,所以在資料初始化結束後的同步,必須先使用 HANDLECOLLISIONS 與 END RUNTIME 兩個參數來解決 Initial Load 過程中資料的衝突 :


這邊要注意的是 HANDLECOLLISIONS 只有在解決資料初始化的衝突才使用,在完成資料衝突的處理之後,由於 END RUNTIME 的參數,這時 Replicate 就會自動停止下來,此時再把 HANDLECOLLISIONS 與 END RUNTIME 兩個參數從 Replicate 參數檔移除,然後才是真正開始資料差異的同步,在進行資料差異化的同步是不使用 HANDLECOLLISIONS 的參數的。

除此之外,對於 Oracle 資料庫來說,在基於 SCN 的前提下,也可以使用 RMAN Restore 將整個資料庫還原到某一個 SCN 完成初始化的動作,例如我們已經有一份 RMAN 的備份,那麼就可以透過 preview summary 這個命令來檢視這份備份至少要還原到哪一個 SCN 才可以達到一致 :

RMAN> restore database preview summary;


Media recovery start SCN is 34821758

Recovery must be done beyond SCN 34822578 to clear datafile fuzziness

Finished restore at 10-OCT-10

Note for future use the second SCN (34822578) returned from the command, it appears at the end of the output.


由 preview summary 得知這份備份至少要還原到 34821758 這個 SCN :

RMAN> run {

         set until scn 34821758;

         restore database;

         recover database;

        }


由於已經將整個資料庫的狀態還原到 34821758 這個 SCN ,對於 OGG 的 Replicate 來說,只要從這個 SCN 之後開始同步資料就好了 :

GGSCI> start replicat rep1, aftercsn 34821758