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


沒有留言:

張貼留言