Oracle Goldengate 雙向同步機制設定 (Oracle to Oracle, 11g)
最近花了點時間研究Goldengate 的雙向同步架構,大致上架構如下圖: 在Goldengate Director的GUI畫面中大概會長得像下圖這樣子:
這個Test Case中,有兩台VM Server,分別名為oserv01和oserv02,
DB皆為Oracle 11g R2 (含EM)版本,皆已安裝Goldengate 12.1.0。
OGG專用的同步帳號為OGGUSER並給予DBA(db_owner)權限。
(此帳號不可用於執行其他SQL指令)
因為是設定雙向同步,因此如果執行SQL的帳號如果和OGG登入DB的帳號一樣的話,
就會出現無窮循環,所以設定上OGG的DB帳號必須是專用且獨立的。
雙向同步主機:oserv01(id:DBAA) 與 oserv02(id:DBAB)
資料表:USER_T、ACCOUNT_T
P.S.以下稱oserv01 to oserv02為正向同步,oserv02 to oserv01為逆向同步
以正向順序為例 ( 逆向的做法亦同,只有部分參數改變 )
Step1. 在oserv01新增Extract和Trail
“tranlogoptions excludeuser OGGUSER”
這句是排除OGGUSER所執行的指令,以避免無窮同步循環
編輯時記得逗號後面要加上空白,否則執行時會出現OGG-00212的錯誤
另外OGG的指令後面不需要加分號,加了會執行失敗。
(若要整個Schema同步,Table的部分可以使用 Schema名.* 表示)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
GGSCI > add extract EXTR_FJ, tranlog, begin now, threads 1 GGSCI > edit params EXTR_FJ extract EXTR_FJ userid OGGUSER, password 123456 discardfile c:\gg\dirrpt/EXTR_FJ.dsc, purge tranlogoptions excludeuser OGGUSER rmthost oserv02, mgrport 7500 rmttrail dirdat/FJ TABLE DBAA.USER_T; TABLE DBAA.ACCOUNT_T; GGSCI > add rmttrail ./dirdat/FJ, extract EXTR_FJ, megabytes 5 GGSCI > start extract EXTR_FJ |
※ 逆向同步時oserv02的Extract做法亦同,只要修改目標伺服器和來源表格名即可:
1 2 3 4 5 |
.................(略) rmthost oserv01, mgrport 7500 .................(略) TABLE DBAB.USER_T; TABLE DBAB.ACCOUNT_T; |
Step 2. 在oserv02新增Replicat
先設定checkpointtable參數:
1 2 3 |
GGSCI > edit params ./GLOBALS MGRSERVNAME GGMGR checkpointtable DBAB.CHECKPOINT_T |
離開並重新進入GGSCI,登入DB並新增checkpointtable
1 2 |
GGSCI > dblogin userid DBAB, password 654321 GGSCI > add checkpointtable |
接著開始建立Replicat,逗號後面不要忘記加空白。
(若要整個Schema同步,Map和Target的部分亦可使用 Schema名.* 表示)
1 2 3 4 5 6 7 8 9 10 11 12 |
GGSCI > add replicat REPL_FJ, exttrail ./dirdat/FJ GGSCI > edit params REPL_FJ replicat REPL_FJ userid OGGUSER, password 123456 discardfile C:\gg\dirrpt/REPL_FJ.dsc, purge assumetargetdefs handlecollisions MAP DBAA.USER_T, TARGET DBAB.USER_T; MAP DBAA.ACCOUNT_T, TARGET DBAB.ACCOUNT_T; GGSCI > start replicat REPL_FJ |
※ 逆向同步時oserv01的Replicat做法亦同,先設定checkpointtable參數
1 2 3 |
GGSCI > edit params ./GLOBALS MGRSERVNAME GGMGR checkpointtable DBAA.CHECKPOINT_T |
離開並重新進入GGSCI,登入DB並新增checkpointtable
1 2 |
GGSCI > dblogin userid DBAA, password 654321 GGSCI > add checkpointtable |
oserv01的Replicat則修改為:
1 2 3 |
.................(略) MAP DBAB.USER_T, TARGET DBAA.USER_T; MAP DBAB.ACCOUNT_T, TARGET DBAA.ACCOUNT_T; |
Step 3. 設定並啟動完成後,在來源跟目標主機上查詢執行狀態
1 2 3 4 5 6 7 |
GGSCI > info all Program Status Group Lag at Chkpt Time Since Chkpt d MANAGER RUNNING EXTRACT RUNNING EXTR_FJ 00:00:00 00:00:02 REPLICAT RUNNING REPL_FJ 00:00:00 00:00:03 |
如果都是RUNNING就代表設定完成,可以進行SQL的同步測試。
※ 期間可能會遇到的錯誤代碼:
Error 1. OGG-00730 No minimum supplemental logging is enabled ……..
解決方法:
先進入Oracle,查詢是否已開啟最小附加日誌
1 2 3 4 5 |
SQL> select supplemental_log_data_min from v$database; SUPPLEME -------- NO |
如果顯示NO, 執行以下命令即可。
1 2 3 4 |
SQL > alter database add supplemental log data; Database altered. SQL > alter system switch logfile; System altered. |
Error 2. OGG-00717 Found unsupported in-memory undo record ……..
解決方法:
疑似OGG的Bug;進入GGSCI,重新設定啟動時間即可。
1 2 |
GGSCI > alter extract EXTR_FJ, tranlog, begin 2013-03-20, thread 1 GGSCI > alter extract EXTR_FJ, tranlog, begin now, thread 1 |
Error 3. INSERT和DELETE皆可正常同步,但執行UPDATE卻同步失效,
紀錄錯誤訊息ORA-01403………..
解決方法:
原因應該是交易紀錄的問題,進入來源端主機的GGSCI後,執行以下命令:
1 2 |
GGSCI > dblogin userid OGGUSER, password OGGUSER GGSCI > add trandata DBAA.USER_T |
搞定!!