1. 目的說明
本文提供Oracle GoldenGate在Oracle db到Oracle db的數據復制安裝配置指導,適用于入門練習使用,生產環境配置,在關鍵步驟和重要參數設置需要小心對待。
2. 參考文檔
《叱咤風云GoldenGate企業級運維實戰》
《Expert Oracle GoldenGate》
Oracle GoldenGate Document
戴明明博客
惜分飛博客
3. 準備系統
準備好兩套已經裝好Oracle db和Oracle GoldenGate for Oracle的環境。
source db:
ip:192.168.5.191
db type:Oracle db 11.2.1.0.4
target db:
ip:192.168.5.191
db type:Oracle db 11.2.1.0.4
GoldenGate:
ogg type:GoldenGate for Oracle 12.2.0.1
4. 配置source db
4.1 配置source db參數
source db的配置主要是歸檔模式修改、附加日志的添加、強制日志和ddl語句的支持。
查看source db歸檔、附加日志和強制日志:
select log_mode,supplemental_log_data_min,force_logging from v$database;
4.1.1 修改歸檔模式
創建歸檔目錄,archivelog目錄用sid區別
mkdir -p /u02/archivelog/orcl
修改歸檔日志存儲目錄
alter system set log_archive_dest_1 = 'location=/u02/archivelog/orcl' scope = both;
修改歸檔日志格式
alter system set log_archive_format = 'arc_%t_%s_%r.arc' scope = spfile;
重啟數據庫,修改歸檔模式
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
4.1.2 強制日志變更
alter database force logging;
4.1.3 添加附加日志
alter database add supplemental log data;
4.1.4 修改GoldenGate參數
alter system set enable_goldengate_replication = true scope = both;
4.1.4 配置DDL語句支持
創建存放ddl信息的GoldenGate用戶:
create tablespace tbs_ogg datafile '/u02/oradata/orcl/tbs_ogg_dat01.dbf' size 10M autoextend on next 8M maxsize 32000M;
create user ogg identified by ogg default tablespace tbs_ogg;
授權GoldeGate用戶 :
grant dba to ogg ;
進入GoldenGate目錄,調用SQL腳本:
cd $GGATE
sqlplus / as sysdba
SQL> @marker_setup.sql;
#輸入準備好的用戶ogg
SQL> @ddl_setup.sql;
#輸入準備好的用戶ogg
SQL> @role_setup.sql;
#輸入準備好的用戶ogg
#根據上面執行結果的提示授權角色給ogg用戶
SQL> grant GGS_GGSUSER_ROLE to ogg;
SQL> @ddl_enable.sql;
SQL> @ddl_pin ogg
至此,ddl語句的支持配置完成。
4.2 配置source db manager進程
進入GoldenGate目錄,創建工作區目錄:
cd $GGATE
./ggsci
GGSCI (dbserver) 1> create subdirs
Creating subdirectories under current directory /u01/ogg/12.2.0/oggcore_1
Parameter files /u01/ogg/12.2.0/oggcore_1/dirprm: created
Report files /u01/ogg/12.2.0/oggcore_1/dirrpt: created
Checkpoint files /u01/ogg/12.2.0/oggcore_1/dirchk: created
Process status files /u01/ogg/12.2.0/oggcore_1/dirpcs: created
SQL script files /u01/ogg/12.2.0/oggcore_1/dirsql: created
Database definitions files /u01/ogg/12.2.0/oggcore_1/dirdef: created
Extract data files /u01/ogg/12.2.0/oggcore_1/dirdat: created
Temporary files /u01/ogg/12.2.0/oggcore_1/dirtmp: created
Credential store files /u01/ogg/12.2.0/oggcore_1/dircrd: created
Masterkey wallet files /u01/ogg/12.2.0/oggcore_1/dirwlt: created
Dump files /u01/ogg/12.2.0/oggcore_1/dirdmp: created
編輯配置manager參數文件 :
#確認下進程
GGSCI (dbserver) 2> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER STOPPED
#編輯manager參數文件
GGSCI (dbserver) 4> edit params mgr
#添加以下內容
port 7809
accessrule, prog *, ipaddr 192.168.5.192, allow
dynamicportlist 7800-7900
accessrule, prog server, allow
autorestart extract *, retries 5, waitminutes 7
purgeoldextracts /u01/ogg/12.2.0/oggcore_1/dirdat/*, usecheckpoints, minkeepdays 10
lagreporthours 1
laginfominutes 30
lagcriticalminutes 45
manager參數文件解釋:
port 7809
通信端口7809,source db和target db需要保持一致。
dynamicportlist 7800-7900
動態端口列表的范圍從7800到7900。當制定端口被占用或者出現通信故障,管理進程將會從列表中選擇下一個端口嘗試連接,避免通信端口的單點故障。
autorestart extract *, retries 5, waitminutes 7
當提取進程中斷后嘗試自動重啟,每隔7分鐘嘗試啟動一次,嘗試5次。OGG運維人員通常會注釋掉這條配置,更喜歡用手工重啟的方式來控制。
purgeoldextracts ./dirdat/*, usecheckpoints, minkeepdays 10
定期清理dirdat路徑下的本地隊列(local trail)。保留期限10天,過期后自動刪除。從而控制隊列文件的目錄不會增長過大。
lagreporthours 1
每隔一小時檢查一次傳輸延遲情況
laginfominutes 30
傳輸延時超過30分鐘將寫入錯誤日志
lagcriticalminutes 45
傳輸延時超過45分鐘將寫入警告日志
對需要的表添加trandata
cd $GGATE
./ggsci
GGSCI (oracledb1 as ogg@orcl) 3> dblogin userid ogg password ogg
Successfully logged into database.
#對需要的表添加trandata
GGSCI (oracledb1 as ogg@orcl) 4> add trandata scott.emp
Logging of supplemental redo log data is already enabled for table SCOTT.EMP.
TRANDATA for instantiation CSN has been added on table 'SCOTT.EMP'.
4.3 配置source db extract進程
添加一個extract進程 :
GGSCI (dbserver) 11> add extract exta,tranlog,begin now
EXTRACT added.
編輯extract參數文件:
GGSCI (dbserver) 13> edit params exta
#添加以下內容
extract exta
setenv (nls_lang="american_america.utf8")
userid ogg, password ogg
reportcount every 30 minutes, rate
discardfile /u01/ogg/12.2.0/oggcore_1/dirrpt/ea.dsc, append, megabytes 1024
discardrollover at 3:00
warnlongtrans 2h, checkinterval 300
exttrail /u01/ogg/12.2.0/oggcore_1/dirdat/ea
--dynamicresolution
dboptions allowunusedcolumn
fetchoptions nousesnapshot
fetchoptions fetchpkupdatecols
--cachemgr cachesize 8000mb, cachedirectory /u01/ogg/12.2.0/oggcore_1/temp
ddl &
include mapped objname scott.emp &
include mapped objname scott.dept ;
table scott.emp;
table scott.dept;
extract參數文件說明:
setenv (NLS_LANG="american_america.utf8")
設置字符集環境變量為UTF8
如果系統中存在多個數據庫有時候會用參數SETENV設置ORACLE_HOME、ORACLE_SID等,例如:
setenv (ORACLE_HOME = "/u01/app/oracle/product/11.2.0/dbhome_1")
setenv (ORACLE_SID = "orcl")
reportcount every 30 minutes, rate
每隔30分鐘報告一次從程序開始到現在的抽取進程或者復制進程的事物記錄數,并匯報進程的統計信息
discardfile /u01/ogg/12.2.0/oggcore_1/dirrpt/exta.dsc, append, megabytes 1024
將執行失敗的記錄保存在discard file中,
該文件位于/u01/ogg/12.2.0/oggcore_1/dirrpt/exta.dsc,大小為1024MB。 文件中已經包含記錄的話,再后面繼續追加,不刪除之前的記錄。
discardrollover at 3:00
為了防止discard file被寫滿,每天3:00做一次文件過期設定
warnlongtrans 2h, checkinterval 300
每隔300s檢查一下大事務,超過2小時還沒結束的進行報告
exttrail /u01/ogg/12.2.0/oggcore_1/dirdat/ea
隊列文件路徑
dynamicresolution
有時候開啟OGG進程的時候較慢,可能是因為需要同步的表太多,OGG在開啟進程之前會將需要同步的表建立一個記錄并且存入到磁盤中,這樣就需要耗費大量的時間。使用該參數來解決此問題。
dboptions allowunusedcolumn
當抽取進程遇到一個沒有使用的字段時只生成一個警告,進程會繼續執行而不會被異常終止(abend)
fetchoptions nousesnapshot
不會從閃回日志中獲取數據
fetchoptions fetchpkupdatecols
當使用了HANDLECOLLISIONS時,請使用該參數。
復制進程出現丟失update記錄(missing update)并且更新的是主鍵,update將轉換成insert。由于插入的記錄可能不是完整的行,若要保證完整需要加入此參數
cachemgr cachesize 8000mb, cachedirectory /u01/ogg/12.2.0/oggcore_1/temp
在/u01/ogg/12.2.0/oggcore_1/temp目錄設置虛擬內存
創建本地trail文件 :
GGSCI (dbserver) 13> add exttrail /u01/ogg/12.2.0/oggcore_1/dirdat/ea,extract exta
EXTTRAIL added.
4.4 配置source db pump進程
添加一個pump進程(本質上也是extract進程),并指定本地trail文件:
GGSCI (dbserver) 14> add extract pumpa,exttrailsource /u01/ogg/12.2.0/oggcore_1/dirdat/ea
EXTRACT added.
編輯pump參數文件:
GGSCI (dbserver) 16> edit params pumpa
#添加以下內容
extract pumpa
rmthost 192.168.5.192, mgrport 7809, compress
passthru
numfiles 5000
rmttrail /u01/ogg/12.2.0/oggcore_1/dirdat/pa
--dynamicresolution
ddl
table scott.emp;
table scott.dept;
pump參數文件說明:
rmthost 10.10.10.1, mgrport 7839, compress
target db主機ip,管理進程端口號,投遞前壓縮隊列文件
numfiles 5000
最多處理5000張表
rmttrail /u01/ogg/12.2.0/oggcore_1/dirdat/pt
target db保存隊列文件的目錄
passthru
采用pass-through模式處理表
dynamicresolution
動態解析表名,此參數在12.2中start進程時會提示已經deprecated(廢棄)
指定遠程trail文件:
GGSCI (dbserver) 19> add rmttrail /u01/ogg/12.2.0/oggcore_1/dirdat/pa,extract pumpa
RMTTRAIL added.
指定本地trail文件:
GGSCI (dbserver1 20> add exttrail /u01/ogg/12.2.0/oggcore_1/dirdat/pa, extract pumpa
EXTTRAIL added.
4.5 啟動source進程
新開一個ssh窗口,打開ggserr.log日志,實時等待查看啟動日志:
cd $GGATE
tail -f 50 ggserr.log
切回前面配置窗口,檢查各項配置,然后啟動進程:
cd $GGATE
./ggsci
#查看extrac進程,啟動進程后注意查看ggserr.log的日志信息,確認無警告錯誤,啟動pump進程需先啟動target db的mgr進程,否則會報錯無法啟動:
GGSCI (oracledb1) 2> start mgr
GGSCI (oracledb1) 2> start exta
GGSCI (oracledb1) 2> start pumpa
GGSCI (oracledb1) 2> info mgr detail
GGSCI (oracledb1) 2> info exta detail
GGSCI (oracledb1) 2> info pumpa detail
如果發現錯誤和異常,根據OGG_ERROR_CODE排查問題。
5. 配置target db
5.1 配置target db參數
5.1.1 創建GoldenGate用戶
創建GoldenGate用戶:
create tablespace tbs_ogg datafile '/u02/oradata/orcl/tbs_ogg_dat01.dbf' size 10M autoextend on next 8M maxsize 32000M;
create user ogg identified by ogg default tablespace tbs_ogg;
授權GoldeGate用戶 :
grant dba to ogg;
5.1.2 添加checkpoint表
GGSCI (dbserver) 21> edit params ./GLOBALS
#添加以下內容
ggschema ogg
checkpointtable ogg.checkpoint
#登陸target db添加checkpoint表
GGSCI (dbserver) 1> dblogin userid ogg, password ogg
Successfully logged into database.
GGSCI (dbserver as ogg@orcl) 2> add checkpointtable ogg.checkpoint
Successfully created checkpoint table ogg.checkpoint.
5.1 配置target db manager進程
編輯manager參數文件:
GGSCI (dbserver as ogg@orcl) 4> edit params mgr
#添加以下內容
port 7809
userid ogg, password ogg
accessrule, prog *, ipaddr 192.168.5.192, allow
accessrule, prog server, allow
dynamicportlist 7840-7914
autorestart extract *,retries 5,waitminutes 3
purgeoldextracts /u01/ogg/12.2.0/oggcore_1/dirdat/*,usecheckpoints, minkeepdays 5
--purgeddlhistory minkeepdays 7, maxkeepdays 10
lagreporthours 1
laginfominutes 30
lagcriticalminutes 45
manager參數文件說明:
port 7839
通信端口7839。 生產端和災備端需要保持一致。
dynamicportlist 7840-7914
動態端口列表的范圍從7840到7914。當制定端口被占用或者出現通信故障,管理進程將會從列表中選擇下一個端口嘗試連接,避免通信端口的單點故障。
autorestart extract *,retries 5,waitminutes 3
當提取進程中斷后嘗試自動重啟,每隔7分鐘嘗試啟動一次,嘗試5次。ogg運維人員通常會注釋掉這條配置,更喜歡用手工重啟的方式來控制。
purgeoldextracts /u01/ogg/12.2.0/oggcore_1/dirdat/*, usecheckpoints, minkeepdays 5
定期清理dirdat路徑下的遠程隊列(remote trail)。保留期限5天,過期后自動刪除。從而控制隊列文件的目錄不會增長過大。
purgeddlhistory minkeepdays 7, maxkeepdays 10
刪除ddl歷史表,最小保存7天,最大保存10天。由于此項目沒有開啟ddl,所以該參數被注釋。
purgemarkerhistory minkeepdays 7, maxkeepdays 10
刪除marker歷史表,最小保存7天,最大保存10天。此項目沒有使用該參數,所以該參數被注釋。
lagreporthours 1
每隔一小時檢查一次傳輸延遲情況
laginfominutes 30
傳輸延時超過30分鐘將寫入錯誤日志
lagcriticalminutes 45
傳輸延時超過45分鐘將寫入警告日志
5.2 配置target db replicat進程
添加一個replicat進程 :
GGSCI (dbserver as ogg@orcl) 4> add replicat repa,exttrail /u01/ogg/12.2.0/oggcore_1/dirdat/pa
編輯replicat參數文件:
GGSCI (dbserver as ogg@orcl) 6> edit params repa
#添加以下內容
replicat repa
setenv (nls_lang = "american_america.utf8")
setenv (oracle_sid = "xxxx" )
userid ogg, password ogg
--sqlexec "alter session set constraints=deferred"
dboptions deferrefconst
gettruncates
report at 06:00
reportcount every 30 minutes, rate
reportrollover at 02:00
reperror default, abend
--handlecollisions
--dynamicresolution
allownoopupdates
--assumetargetdefs
discardfile /u01/ogg/12.2.0/oggcore_1/dirrpt/repa.dsc, append, megabytes 1024
discardrollover at 02:00
ddl
map scott.emp, target scott.emp;
map scott.dept, target scott.dept;
replicat參數文件說明:
setenv (NLS_LANG="american_america.utf8")
設置字符集環境變量為utf8
如果系統中存在多個數據庫有時候會用參數setenv設置oracle_home、oracle_sid等,例如:
setenv (ORACLE_HOME = "/u01/app/oracle/product/11.2.0/dbhome_1")
setenv (ORACLE_SID = "orcl")
dboptions deferrefconst
約束延遲設置,在復制進程的事物被提交之前,延遲級聯刪除、級聯更新時的校驗和實施。
gettruncates
不捕獲source db truncate table的操作
report at 06:00
每天早上6點報告
reportcount every 30 minutes, rate
每隔30分鐘報告一次從程序開始到現在的抽取進程或者復制進程的事物記錄數,并匯報進程的統計信息
reportrollover at 02:00
為了防止report file被寫滿,每天2:00做一次文件過期設定
reperror default, abend
除了特殊指定的reperror語句,報告所有復制期間出現的錯誤,回滾非正常中斷的事物和進程。
handlecollisions
當target db已經存在數據的情況下,解決復制過程中出現的沖突。如果要重新做初始化,可以刪除drop target db后再rman恢復,這樣做的話就不需要該參數
allownoopupdates
當source db有某些列但是目標表卻沒有,或者復制進程中配置了colsexcept 參數 在這些情況下,當生產端對那些列進行更新,目標表將不發生任何變化
assumetargetdefs
使用assumetargetdefs參數時,用map語句中指定的source db源表和target db目標表具有相同的列結構。它指示的oracle goldengate不在source db查找源表的結構定義
discardfile /u01/ogg/12.2.0/oggcore_1/dirrpt/rep1.dsc, append, megabytes 1024m
將執行失敗的記錄保存在discard file中,該文件位于/u01/ogg/12.2.0/oggcore_1/dirrpt/ext1.dsc,大小為1024mb。 文件中已經包含記錄的話,再后面繼續追加,不刪除之前的記錄
discardrollover at 02:00
為了防止discard file被寫滿,每天2:00做一次文件過期設定