1 簡介 Oracle Golden Gate軟件是一種基於日志的結構化數據復制備份軟件,它通過解析源數據庫在線日志或歸檔日志獲得數據的增量變化,再將這些變化應用到目標數據庫,從而實現源數據庫與目標數據庫同步。Oracle Golden Gate可以在異構的IT基礎結構(包括幾乎所有常用操作系統平台和數據庫平台)之間實現大量數據亞秒一級的實時復制,從而在可以在應急系統、在線報表、實時數據倉庫供應、交易跟蹤、數據同步、集中/分發、容災、數據庫升級和移植、雙業務中心等多個場景下應用。同時,Oracle Golden Gate可以實現一對一、廣播(一對多)、聚合(多對一)、雙向、點對點、級聯等多種靈活的拓撲結構 2 GoldenGate安裝 2.1 GoldenGate的獲取 Oracle GoldenGate(下文簡稱ogg)軟件可以通過ORACLE官方網站進行下載,根據ORACLE的版本及操作系統來下載對應版本的ogg,官方下載地址:http://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html 2.2 GoldenGate的安裝 ogg安裝非常簡單,但需在源數據庫和目標數據庫服務器上均安裝ogg軟件即可,具體請參考以下步驟: 1) 將壓縮包解壓到系統目錄/oracle/ogg (該路徑可以根據需要自行選擇) 2)、 進入/oracle/ogg目錄,運行./ggsci,進入ogg管理控制台 3)、 在ogg控制台輸入命令: create subdirs ,讓ogg創建其需要用到的目錄 4)、 手工在ogg目錄下創建discard文件夾,mkdir discard 5)、 配置操作系統環境變量(請確保環境變量配置了ORACLE_HOME和ORACLE_SID)(如果不配置環境變量的話,以下涉及的路徑都需要用絕對路徑)export LD_LIBRARY_PATH=/oradata/ogg:$ORACLE_HOME/lib:$LD_LIBRARY_PATH 6)、 在ORACLE中創建ogg專屬用戶 [oracle@local ~]$ sqlplus /nolog SQL> conn / as sysdba SQL> create user ogg identified by ogg; (注:賬號密碼根據實際情況設置) SQL> grant connect,resource to ogg; SQL> grant unlimited tablespace to ogg; SQL> grant execute on utl_file to ogg; 7)、 為新創建的ogg用戶執行配置腳本 在ogg的安裝目錄下登陸sqlplus,使用sys登陸sqlplus,然后執行如下配置 [oracle@local ~]$ sqlplus /nolog SQL> conn / as sysdba SQL> @marker_setup.sql SQL> @ddl_setup.sql; SQL> @role_setup.sql; SQL> grant GGS_GGSUSER_ROLE to ogg; SQL> @ddl_enable.sql; 進入ogg控制台,測試用戶是否創建成功 GGSCI (local) 1> dblogin userid ogg Password: ogg Successfully logged into database. 通過上述步驟,ogg就安裝成功了。 3 單項復制的配置 為了能讓ogg成功的將源數據庫及目標數據庫進行同步,下面還需要對ogg及oracle進行一系列配置(ogg支持多種復制方式,比如單項復制、雙向復制等等,因實際需要,本文僅介紹單項復制相關配置)。 首先說說ogg的一些概念: 1)、 Manager:ogg所有服務必須依賴Manager,Manger如同ogg的總調度。 2)、 Extract :ogg用來獲取源數據庫數據更新的,將變更的數據發送到目標數據庫 3)、 Replicat :ogg用來接收源數據庫的更新,一旦源數據庫Extract將數據發送過來后,Replicat會自動將更新腳本同步到目標數據庫。 3.1 源服務器配置 1)、開啟ORACLE歸檔模式,設置日志模式 [oracle@local ~]$ sqlplus /nolog SQL> conn / as sysdba SQL> shutdown immediate; SQL> startup mount; SQL> alter database archivelog; SQL> alter database force logging; SQL> alter database add supplemental log data; SQL> alter database open; 2)、 回收站功能會影響同步,需要關閉回收站 SQL>alter session set recyclebin=off; SQL>alter system set recyclebin=off;(如果不成功可以使用alter system set recyclebin=off deferred;) 3)、配置環境變量NLS_LANG(不配置中文同步會亂碼) 首先在oracle中查詢select userenv( 'language') from dual; 然后將查詢的結果配置到linux環境變量中 如export NLS_LANG=” SIMPLIFIED CHINESE_CHINA.ZHS16GBK” 4)、登陸ogg控制台,設置需要進行同步的oracle表 GGSCI (local) 1> dblogin userid ogg GGSCI (local) 1> add trandata dbuser.* 5)、配置ogg manager&啟動manager(配置界面操作類似vi) GGSCI (local) 1> edit param mgr PORT 7809 GGSCI (local) 1> info all(查看當前mgr狀態) GGSCI (local) 1> start manager(啟動manager,啟動完后可以用info all再次查看狀態) 6)、 添加一個ogg extract進程,用於抽取源服務器數據 GGSCI (local) 1> add extract ext4,tranlog,begin now (增加一個抽取進程ext4,ext4名 字可以根據需要修改) GGSCI (local) 1> add exttrail D: \app\Administrator\product\11.2.0\ogg11\dirdat\wf,extract ext4 (將ext4抽取的源數據變更數據寫到該文件夾,沒有設置系統環境變量的用絕對地址) GGSCI (local) 1> add rmttrail c:\app\Administrator\product\11.2.0\gg11\dirdat\wf,extract ext4(傳遞的路徑) GGSCI (local) 1> edit params ext4 (修改ext4的配置參數,txt文檔) extract ext4 setenv (ORACLE_SID=REGULATORY) setenv (NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK) userid ogg,password oggPssword01 rmthost 162.16.162.24,mgrport 7809 rmttrail C:\app\Administrator\product\11.2.0\gg11\dirdat\wf ddl include mapped all objname ihms2012syn_login.*; table ihms2012syn_login.*;配置完成后可以通過info all查看到新添加的extract的狀態 7)、啟動ogg extract命令 GGSCI (local) 1> start extract ext4 (等目標服務器ogg配置成功后再啟動ext) 3.2 目標服務器配置 1)、登陸ogg控制台 GGSCI (local) 1> dblogin userid ogg 2)、配置ogg manager&啟動manager(配置界面操作類似vi) GGSCI (local) 1> edit param mgr PORT 7809 DYNAMICPORTLIST 7840-7850 --遠程隊列端口范圍 GGSCI (local) 1> info all(查看當前mgr狀態) 3)、 添加一個ogg replicat進程,用於更新目標服務器數據 GGSCI (local) 1> edit params ./GLOBAL GSSCHEMA ogg CHECKPOINTTABLE ogg.checkpoint GGSCI (local) 2> dblogin userid ogg Password: ogg Successfully logged into database. GGSCI (local) 3> add checkpointtable ogg.checkpoint Successfully created checkpoint table ogg.CHECKPOINT. GGSCI (local) 4> ADD replicat rep2 EXTTRAIL /hom/wangfan/ggs/dirdat/wf, checkpointtable ogg.checkpoint(沒有設置系統變量的就用絕對地址) GGSCI (local) 5> edit param rep2 --Replicat group --(replicat實例) replicat rep2 setenv (ORACLE_SID=jjzlfbackup) setenv (NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK) --source and target definitions ASSUMETARGETDEFS --target database login -- userid ogg, password ogg --file for dicarded transaction -- discardfile /oracle/ogg/discard/rep2_discard.txt, append, megabytes 10 --ddl support DDL DDL INCLUDE MAPPED ALL objname dbuser.*; DDLERROR DEFAULT IGNORE RETRYOP --Specify table mapping --- map dbuser.*, target dbuser.*; 配置完成后可以通過info all查看到新添加的extract的狀態 4)、啟動ogg manager & replicat命令 GGSCI (local) 1> start manager GGSCI (local) 1> start replicat rep2 最后參考源服務器配置,啟動ext4 4 維護相關 4.1 OGG常用命令 啟動manager:start manager 啟動extract:start extract extn 啟動replicat:start replicat repn 停止manager:stop manager 停止 extract:stop extract extn 停止replicat:stop replicat repn 刪除extract:delete extract extn 刪除replicat:delete extract repn 查看ogg狀態:info all 修改manager參數:edit params mgr 修改extract參數:edit params extn 修改replicat參數:edit params repn 修改全局參數:edit params ./GLOBAL 更新抽取 4.2 OGG日志路徑 $OGG_HOME/ggserr.log 4.3 OGG開機自啟 操作系統設置(linux): 1)、用oracle用戶建立/oracle/ogg/autostart/info.txt,文件內容如下: sh dat start mgr 2)、chmod x info.txt 3)、用oracle用戶建立/oracle/ogg/autostart/startmgr.sh,文件內如下: /oracle/ogg/ggsci paramfile /oracle/ogg/autostart/info.txt >> /oracle/ogg/autostart/log.txt 4)、chmod x startmgr.sh 5)、用root用戶編輯 /etc/rc.local ,添加如下信息: su - oracle -c "/oracle/ogg/autostart/startmgr.sh" OGG各組參數說明: 源mgr: MANAGER進程參數配置說明: PORT:指定服務監聽端口;這里以7839為例,默認端口為7809 DYNAMICPORTLIST:動態端口:可以制定最大256個可用端口的動態列表,當指定的端口不可用時,管理進程將會從列表中選擇一個可用的端口,源端和目標段的Collector、Replicat、GGSCI進程通信也會使用這些端口; COMMENT:注釋行,也可以用--來代替; AUTOSTART:指定在管理進程啟動時自動啟動哪些進程; AUTORESTART:自動重啟參數設置:本處設置表示每3分鍾嘗試重新啟動所有EXTRACT進程,共嘗試5次; PURGEOLDEXTRACTS:定期清理trail文件設置:本處設置表示對於超過3天的trail文件進行刪除。 LAGREPORT、LAGINFO、LAGCRITICAL: 定義數據延遲的預警機制:本處設置表示MGR進程每隔1小時檢查EXTRACT的延遲情況,如果超過了30分鍾就把延遲作為信息記錄到錯誤日志中,如果延遲超過了45分鍾,則把它作為警告寫到錯誤日志中。 EXTRACT組: EXTRACT進程參數配置說明: SETENV:配置系統環境變量 USERID/ PASSWORD:指定OGG連接數據庫的用戶名和密碼,這里使用3.4部分中創建的數據庫用戶OGG; COMMENT:注釋行,也可以用--來代替; TABLE:定義需復制的表,后面需以;結尾 TABLEEXCLUDE:定義需要排除的表,如果在TABLE參數中使用了通配符,可以使用該參數指定排除掉得表。 GETUPDATEAFTERS|IGNOREUPDATEAFTERS: 是否在隊列中寫入后影像,缺省復制 GETUPDATEBEFORES| IGNOREUPDATEBEFORES: 是否在隊列中寫入前影像,缺省不復制 GETUPDATES|IGNOREUPDATES: 是否復制UPDATE操作,缺省復制 GETDELETES|IGNOREDELETES: 是否復制DELETE操作,缺省復制 GETINSERTS|IGNOREINSERTS: 是否復制INSERT操作,缺省復制 GETTRUNCATES|IGNORETRUNDATES: 是否復制TRUNCATE操作,缺省不復制; RMTHOST:指定目標系統及其GoldengateManager進程的端口號,還用於定義是否使用壓縮進行傳輸,本例中的compress為壓縮傳輸; RMTTRAIL:指定寫入到目標斷的哪個隊列; EXTTRAIL:指定寫入到本地的哪個隊列; SQLEXEC:在extract進程運行時首先運行一個SQL語句; PASSTHRU:禁止extract進程與數據庫交互,適用於Data Pump傳輸進程; REPORT:定義自動定時報告; STATOPTIONS:定義每次使用stat時統計數字是否需要重置; REPORTCOUNT:報告已經處理的記錄條數統計數字; TLTRACE:打開對於數據庫日志的跟蹤日志; DISCARDFILE:定義discardfile文件位置,如果處理中油記錄出錯會寫入到此文件中; DBOPTIONS:指定對於某種特定數據庫所需要的特殊參數; TRANLOGOPTIONS:指定在解析數據庫日志時所需要的特殊參數,例如:對於裸設備,可能需要加入以下參數 rawdeviceoggset 0 WARNLONGTRANS:指定對於超過一定時間的長交易可以在gsserr.log里面寫入警告信息,本處配置為每隔3分鍾檢查一次場交易,對於超過2小時的進行警告; 配置復制進程 REPLICAT進程參數配置說明: ASSUMETARGETDEFS:假定兩端數據結構一致使用此參數; SOURCEDEFS:假定兩端數據結構不一致,使用此參數指定源端的數據結構定義文件,該文件需要由GlodenGate工具產生。 MAP:用於指定源端與目標端表的映射關系; MAPEXCLUDE:用於使用在MAP中使用*匹配時排除掉指定的表; REPERROR:定義出錯以后進程的響應,一般可以定義為兩種: ABEND,即一旦出現錯誤即停止復制,此為缺省配置; DISCARD,出現錯誤后繼續復制,只是把錯誤的數據放到discard文件中。 DISCARDFILE:定義discardfile文件位置,如果處理中油記錄出錯會寫入到此文件中; SQLEXEC:在進程運行時首先運行一個SQL語句; GROUPTRANSOPS:將小交易合並成一個大的交易進行提交,減少提交次數,降低系統IO消耗。 MAXTRANSOPS:將大交易拆分,每XX條記錄提交一次。 TABLEEXCLUDE <schema>.<materialized view> OGG設置: 在ogg中主進程是manager進程,使用startmgr啟動。可以在mgr進程中添加一些參數用來在啟動mgr進程的同時啟動extract和replicat進程。 1、以下是extract端的mgr參數配置 GGSCI (gg01) 130> edit params mgr PORT 7809 DYNAMICPORTLIST 7800-7909 --啟動mgr進程啟動啟動extract進程 AUTOSTART EXTRACT * --extract異常終止時會自動啟動,每5分鍾嘗試重新啟動所有的extract進程,一共嘗試3次,5分鍾清零 AUTORESTART EXTRACT *,RETRIES 3, WAITMINUTES 5, RESETMINUTES 10 2、配置目標端replicat進程自啟動,在mgr參數中添加如下 GGSCI (gg02) 140> edit params mgr PORT 7809 --動態端口,當指定端口不可用時,會從以下列表中選擇一個可用端口 DYNAMICPORTLIST 7800-7909 --自動啟動replicat進程 AUTOSTART REPLICAT * --當replicat進程異常終止時會自動啟動,每5分鍾嘗試重新啟動所有的replicat進程,一共嘗試5次 AUTORESTART REPLICAT *, WAITMINUTES 2, RETRIES 5 --mgr每隔1小時檢查extract延時情況,超5分鍾作為信息記錄log中,超過7分鍾作為警告記錄log中 LAGREPORTHOURS 1 LAGINFOMINUTES 5 LAGCRITICALMINUTES 7 --刪除10天前的trail文件 PURGEOLDEXTRACTS /oracle/ogg/dirdat/*, USECHECKPOINTS, MINKEEPDAYS 10 OGG同步序列 1.目標及源服務器均以sys登錄sqlplus安裝sequence.sql 2.源:grant execute on ogg.updateSequence to ogg; grant execute on ogg.updateSequence to ihms2012syn_login; 3目標:GRANT EXECUTE on ogg.replicateSequence TO ogg; GRANT EXECUTE on ogg.replicateSequence TO ihms2012syn_login; 4.停止extract相關進程:edit param extractname; txt文檔中加入sequence ihms2012syn_login.*; OGG抽取或復制出現錯誤 1.停止mgr 2.停止extract、replicat進程,刪除目的端dirdat所有文件。 3.刪除對應extract、replicat進程、刪除檢查點。 4.重建檢查點、重建進程。 5啟動replicat、然后啟動extract 情況一:如果重新設置抓取文件和復制文件的話會丟失a_15歸檔數據。 停止進程 replicat 、extract 源 alter extract exihms, extseqno 3, extrba 0 extseqno 3就是生成的文件名,extrba 數字 表示日志文件中的第幾行開始讀取 alter extract exihms ,extseqno 3, extrba 0的意思就是新生成一個wf000003文件。 alter extract exihms,tranlog,begin 2013-12-26 15:00 從某一時刻抽取歸檔日志。(這個設置很重要) 目標 alter rep2, extseqno 3,extrba 0 從wf000003文件的第一行開始讀取 情況二:通過ogg文件夾中的logdump進行日志分析,然后使用alter rep2, extseqno 3,extrba 0 精確的跳過錯誤行。 情況三:缺什么補什么,本例中只要在目標數據庫建立一個同名的可更新的物化視圖。重啟replicat即可。 OGG配置實驗 2013-12-27:1.說明源與目標服務器均要求配置完成並啟動mgr進程 2.配置源extract、目標replicat進程后先不啟動(replicat也可imp之后配置) 3.源數據庫停機exp,exp導出之后開啟extract進程,源服務器可開始正常工作。extract會自動向目標服務器的指定dirdat文件夾中推送 同步文件(此文件夾最好為空,有利用設定開始節點) 4.目標機imp 5.imp結束后alter repname,extseqno 0,extrba 0設置replicat從第一個文件的第一行開始讀取 6.開啟replicat 7.此方案減少源服務器的停機時間。 OGG出錯 ogg-01168 數據同步出問題的表沒有主鍵,客戶執行insert的時候沒有問題,在執行update的時候報了上面的錯誤。以上的報錯涉及三個參數,KEYCOLS,ALLOWNOOPUPDATES,APPLYNOOPUPDATES。下面我們分別討論這3個參數: 1)KEYCOLS KEYCOLS關鍵字用於對沒有主鍵的表,指定能夠唯一標識數據的字段,這樣Oracle GoldenGate同樣可以完成數據的同步(同步UPDATE操作)。 將目標數據庫的replicat配置修改為: MAP CCENSE.ST_CARDOPERATORSTATTMP, TARGET CCENSE.ST_CARDOPERATORSTATTMP, KEYCOLS(cardsfid) 重啟目標數據庫的replicat進程即可完成數據的同步,但需要注意的是,使用這種方式必須把所有的表列出來,不能指定為<username>.*。 2)ALLOWNOOPUPDATES 官方文檔解釋如下: ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES Valid for Replicat Use ALLOWNOOPUPDATES and NOALLOWNOOPUPDATES to control how Replicat responds to a “noop” operation. A no-op operation is one in which there is no effect on the target table. The following are some examples of how this can occur. ● The source table has a column that does not exist in the target table, or has a column that was excluded from replication (with a COLSEXCEPT clause). In either case, if that source column is updated, there will be no target column name to use in the SET clause within the Replicat SQL statement. ● An update is made that sets a column to the same value as the current one. The database does not log the new value, because it did not really change. However, Oracle GoldenGate extracts the operation as a change record because the primary key was logged — but there is no column value for the SET clause in the Replicat SQL statement. By default (NOALLOWNOOPUPDATES), Replicat abends with an error because these types of operations do not update the database. With ALLOWNOOPUPDATES, Replicat ignores the operation instead of abending. The statistics reported by Replicat will show that an update was made, but the database will not be updated. You can use the internal parameter APPLYNOOPUPDATES to force the update to be applied. APPLYNOOPUPDATES overrides ALLOWNOOPUPDATES. If both are specified then updates with only key columns will be applied. By default, Oracle GoldenGate will abend with the following message if it only has source key columns but there is no key defined for the target table. 2011-01-25 02:28:42 GGS ERROR 160 Encountered an update for target table TELLER, which has no unique key defined. KEYCOLS can be used to define a key. Use ALLOWNOOPUPDATES to process the update without applying it to the target database. Use APPLYNOOPUPDATES to force the update to be applied using all columns in both the SET and WHERE clause. Exceptions when error-handling is in place If ALLOWNOOPUPDATES is specified when the HANDLECOLLISIONS or INSERTMISSINGUPDATES parameters are being used, and if Oracle GoldenGate has all of the target key values, then Oracle GoldenGate will not ignore the update, but instead will apply it using all key columns in the SET clause and the WHERE clause (invoking APPLYNOOPUPDATES behavior). This is necessary so Oracle GoldenGate can detect if the row being updated is missing. If it is, then Oracle GoldenGate turns the update into an insert. Default NOALLOWNOOPUPDATES (only applies if the table does not have a key) Syntax ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES 該參數的含義就是在同步到目標數據庫的時候忽略出現的NO-OP操作,NO-OP操作包括目標數據庫沒有主數據庫的字段(兩邊數據庫字段不同),還有一種情況是執行UPDATE語句修改的數據和原有數據一樣,沒有發生變化。以上兩種情況叫做NO-OP操作,遭遇NO-OP操作gg會被終止。 3)APPLYNOOPUPDATES 該參數的含義就是不忽略出現的NO-OP操作,而是在目標數據庫強制執行UPDATE修改操作,且只更新鍵值數據(主鍵或KEYCOLS指定的鍵值),如果表沒有主鍵,也沒有使用KEYCOLS關鍵字指定字段,那么將更新表數據的所有字段,如果沒有相應記錄,將INSERT新插入一條。 官方文檔解釋如下: APPLYNOOPUPDATES | NOAPPLYNOOPUPDATES Valid for Replicat Use APPLYNOOPUPDATES to force a “no-op” update to be applied using all columns in both the SET and WHERE clauses. See ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES for a description of “no-op.” APPLYNOOPUPDATES uses whatever data is in the trail. If there is a primary key update record, it uses the before columns from the source. If there is a regular (non-key) update, it assumes that the after value is the same as the before value (otherwise it would be a primary key update). The preceding assumes source and target keys are identical. If they are not, you must use a KEYCOLS clause in the TABLE statement on the source. Default NOAPPLYNOOPUPDATES Syntax APPLYNOPUPDATES | NOAPPLYNOPUPDATES 請注意,我們在討論NO-OP操作的時候,NO-OP操作並不包含UPDATE沒有主鍵的表,所以我們遇到的這個問題和ALLOWNOOPUPDATES和APPLYNOOPUPDATES這兩個參數沒有關系。通過實踐證明,在replicat配置文件中加入這兩個參數(或只加入ALLOWNOOPUPDATE參數),在更新沒有主鍵,也沒有指定KEYCOLS字段的表的時候同樣會報錯。對沒有主鍵,但加上了KEYCOLS字段后的表執行UPDATE操作成功同步了數據。 如果沒有在源數據庫啟用記錄表的supplement log,同樣會收到以上的報錯,原因是在於沒有記錄沒有主鍵表的supplement log數據,並將其傳遞到目標數據庫,執行以下操作可以啟用記錄表的supplement log: cd $GGHOME ./ggsci dblogin userid <username>,password <password> add trandata <username>.<tablename> 完成以上操作之后,可以解決由此問題導致的update不能同步。 ora-01403 no data found的處理 此錯誤可能為源端與目標端表結構不同或數據不同而造成。 處理過程:停止源端與目標端進程, 源端: 從日志表中刪除問題對象名稱 Delete trandata 用戶名.對象名 刪除此表,重新新建此表,恢復數據。 添加至日志中。 Add trandata 用戶名.對象名 目標端: 從日志表中刪除問題對象名稱 Delete trandata 用戶名.對象名 刪除此表,重新新建此表,恢復數據。 添加至日志中。 Add trandata 用戶名.對象名 開啟源端進程。 開啟目標端進程。 一次恢復流程 源庫和目標庫的expdp、impdp 1、源庫select current_scn from v$database 確定scn。 2、修改scn號為上面當前值,從源庫導出。 expdp directory=EXPDIR FLASHBACK_SCN= 9015228145167 schemas=tjrealms2014_login dumpfile=bdc.dmp 3、目標庫導入數據impdp dumpfile=hp.dmp directory=dump_dir schemas=Xxx_login 4、生成expdp、impdp的sql:create directory dump_dir as 'e:\app\expdp';select * from dba_directories; 5、impdp dumpfile=hp.dmp directory=dump_dir schemas=Xxx_login 6、start repHp,aftercsn 9015228145167
————————————————————————————————————————————————————————————————————————————————————————————
==================================================================================================================================================================
1 簡介
Oracle Golden Gate軟件是一種基於日志的結構化數據復制備份軟件,它通過解析源數據庫在線日志或歸檔日志獲得數據的增量變化,再將這些變化應用到目標數據庫,從而實現源數據庫與目標數據庫同步。Oracle Golden Gate可以在異構的IT基礎結構(包括幾乎所有常用操作系統平台和數據庫平台)之間實現大量數據亞秒一級的實時復制,從而在可以在應急系統、在線報表、實時數據倉庫供應、交易跟蹤、數據同步、集中/分發、容災、數據庫升級和移植、雙業務中心等多個場景下應用。同時,Oracle Golden Gate可以實現一對一、廣播(一對多)、聚合(多對一)、雙向、點對點、級聯等多種靈活的拓撲結構
2 GoldenGate安裝
2.1 GoldenGate的獲取
Oracle GoldenGate(下文簡稱ogg)軟件可以通過ORACLE官方網站進行下載,根據ORACLE的版本及操作系統來下載對應版本的ogg,官方下載地址:http://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html
2.2 GoldenGate的安裝
ogg安裝非常簡單,但需在源數據庫和目標數據庫服務器上均安裝ogg軟件即可,具體請參考以下步驟:
1) 將壓縮包解壓到系統目錄/oracle/ogg (該路徑可以根據需要自行選擇)
2)、 進入/oracle/ogg目錄,運行./ggsci,進入ogg管理控制台
3)、 在ogg控制台輸入命令: create subdirs ,讓ogg創建其需要用到的目錄
4)、 手工在ogg目錄下創建discard文件夾,mkdir discard
5)、 配置操作系統環境變量(請確保環境變量配置了ORACLE_HOME和ORACLE_SID)(如果不配置環境變量的話,以下涉及的路徑都需要用絕對路徑)export LD_LIBRARY_PATH=/oradata/ogg:$ORACLE_HOME/lib:$LD_LIBRARY_PATH
6)、 在ORACLE中創建ogg專屬用戶
[oracle@local ~]$ sqlplus /nolog
SQL> conn / as sysdba
SQL> create user ogg identified by ogg; (注:賬號密碼根據實際情況設置)
SQL> grant connect,resource to ogg;
SQL> grant unlimited tablespace to ogg;
SQL> grant execute on utl_file to ogg;
7)、 為新創建的ogg用戶執行配置腳本
在ogg的安裝目錄下登陸sqlplus,使用sys登陸sqlplus,然后執行如下配置
[oracle@local ~]$ sqlplus /nolog
SQL> conn / as sysdba
SQL> @marker_setup.sql
SQL> @ddl_setup.sql;
SQL> @role_setup.sql;
SQL> grant GGS_GGSUSER_ROLE to ogg;
SQL> @ddl_enable.sql;
進入ogg控制台,測試用戶是否創建成功
GGSCI (local) 1> dblogin userid ogg
Password: ogg
Successfully logged into database.
通過上述步驟,ogg就安裝成功了。
3 單項復制的配置
為了能讓ogg成功的將源數據庫及目標數據庫進行同步,下面還需要對ogg及oracle進行一系列配置(ogg支持多種復制方式,比如單項復制、雙向復制等等,因實際需要,本文僅介紹單項復制相關配置)。
首先說說ogg的一些概念:
1)、 Manager:ogg所有服務必須依賴Manager,Manger如同ogg的總調度。
2)、 Extract :ogg用來獲取源數據庫數據更新的,將變更的數據發送到目標數據庫
3)、 Replicat :ogg用來接收源數據庫的更新,一旦源數據庫Extract將數據發送過來后,Replicat會自動將更新腳本同步到目標數據庫。
3.1 源服務器配置
1)、開啟ORACLE歸檔模式,設置日志模式
[oracle@local ~]$ sqlplus /nolog
SQL> conn / as sysdba
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database force logging;
SQL> alter database add supplemental log data;
SQL> alter database open;
2)、 回收站功能會影響同步,需要關閉回收站
SQL>alter session set recyclebin=off;
SQL>alter system set recyclebin=off;(如果不成功可以使用alter system set recyclebin=off deferred;)
3)、配置環境變量NLS_LANG(不配置中文同步會亂碼)
首先在oracle中查詢select userenv( 'language') from dual;
然后將查詢的結果配置到linux環境變量中
如export NLS_LANG=” SIMPLIFIED CHINESE_CHINA.ZHS16GBK”
4)、登陸ogg控制台,設置需要進行同步的oracle表
GGSCI (local) 1> dblogin userid ogg
GGSCI (local) 1> add trandata dbuser.*
5)、配置ogg manager&啟動manager(配置界面操作類似vi)
GGSCI (local) 1> edit param mgr
PORT 7809
GGSCI (local) 1> info all(查看當前mgr狀態)
GGSCI (local) 1> start manager(啟動manager,啟動完后可以用info all再次查看狀態)
6)、 添加一個ogg extract進程,用於抽取源服務器數據
GGSCI (local) 1> add extract ext4,tranlog,begin now (增加一個抽取進程ext4,ext4名
字可以根據需要修改)
GGSCI (local) 1> add exttrail D: \app\Administrator\product\11.2.0\ogg11\dirdat\wf,extract ext4 (將ext4抽取的源數據變更數據寫到該文件夾,沒有設置系統環境變量的用絕對地址)
GGSCI (local) 1> add rmttrail c:\app\Administrator\product\11.2.0\gg11\dirdat\wf,extract ext4(傳遞的路徑)
GGSCI (local) 1> edit params ext4 (修改ext4的配置參數,txt文檔)
extract ext4
setenv (ORACLE_SID=REGULATORY)
setenv (NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK)
userid ogg,password oggPssword01
rmthost 162.16.162.24,mgrport 7809
rmttrail C:\app\Administrator\product\11.2.0\gg11\dirdat\wf
ddl include mapped all objname ihms2012syn_login.*;
table ihms2012syn_login.*;配置完成后可以通過info all查看到新添加的extract的狀態
7)、啟動ogg extract命令
GGSCI (local) 1> start extract ext4 (等目標服務器ogg配置成功后再啟動ext)
3.2 目標服務器配置
1)、登陸ogg控制台
GGSCI (local) 1> dblogin userid ogg
2)、配置ogg manager&啟動manager(配置界面操作類似vi)
GGSCI (local) 1> edit param mgr
PORT 7809
DYNAMICPORTLIST 7840-7850 --遠程隊列端口范圍
GGSCI (local) 1> info all(查看當前mgr狀態)
3)、 添加一個ogg replicat進程,用於更新目標服務器數據
GGSCI (local) 1> edit params ./GLOBAL
GSSCHEMA ogg
CHECKPOINTTABLE ogg.checkpoint
GGSCI (local) 2> dblogin userid ogg
Password: ogg
Successfully logged into database.
GGSCI (local) 3> add checkpointtable ogg.checkpoint
Successfully created checkpoint table ogg.CHECKPOINT.
GGSCI (local) 4> ADD replicat rep2 EXTTRAIL /hom/wangfan/ggs/dirdat/wf, checkpointtable ogg.checkpoint(沒有設置系統變量的就用絕對地址)
GGSCI (local) 5> edit param rep2
--Replicat group --(replicat實例)
replicat rep2
setenv (ORACLE_SID=jjzlfbackup)
setenv (NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK)
--source and target definitions
ASSUMETARGETDEFS
--target database login --
userid ogg, password ogg
--file for dicarded transaction --
discardfile /oracle/ogg/discard/rep2_discard.txt, append, megabytes 10
--ddl support DDL
DDL INCLUDE MAPPED ALL objname dbuser.*;
DDLERROR DEFAULT IGNORE RETRYOP
--Specify table mapping ---
map dbuser.*, target dbuser.*;
配置完成后可以通過info all查看到新添加的extract的狀態
4)、啟動ogg manager & replicat命令
GGSCI (local) 1> start manager
GGSCI (local) 1> start replicat rep2
最后參考源服務器配置,啟動ext4
4 維護相關
4.1 OGG常用命令
啟動manager:start manager
啟動extract:start extract extn
啟動replicat:start replicat repn
停止manager:stop manager
停止 extract:stop extract extn
停止replicat:stop replicat repn
刪除extract:delete extract extn
刪除replicat:delete extract repn
查看ogg狀態:info all
修改manager參數:edit params mgr
修改extract參數:edit params extn
修改replicat參數:edit params repn
修改全局參數:edit params ./GLOBAL
更新抽取
4.2 OGG日志路徑
$OGG_HOME/ggserr.log
4.3 OGG開機自啟
操作系統設置(linux):
1)、用oracle用戶建立/oracle/ogg/autostart/info.txt,文件內容如下:
sh dat
start mgr
2)、chmod x info.txt
3)、用oracle用戶建立/oracle/ogg/autostart/startmgr.sh,文件內如下:
/oracle/ogg/ggsci paramfile /oracle/ogg/autostart/info.txt >> /oracle/ogg/autostart/log.txt
4)、chmod x startmgr.sh
5)、用root用戶編輯 /etc/rc.local ,添加如下信息:
su - oracle -c "/oracle/ogg/autostart/startmgr.sh"
OGG各組參數說明:
源mgr:
MANAGER進程參數配置說明:
PORT:指定服務監聽端口;這里以7839為例,默認端口為7809
DYNAMICPORTLIST:動態端口:可以制定最大256個可用端口的動態列表,當指定的端口不可用時,管理進程將會從列表中選擇一個可用的端口,源端和目標段的Collector、Replicat、GGSCI進程通信也會使用這些端口;
COMMENT:注釋行,也可以用--來代替;
AUTOSTART:指定在管理進程啟動時自動啟動哪些進程;
AUTORESTART:自動重啟參數設置:本處設置表示每3分鍾嘗試重新啟動所有EXTRACT進程,共嘗試5次;
PURGEOLDEXTRACTS:定期清理trail文件設置:本處設置表示對於超過3天的trail文件進行刪除。
LAGREPORT、LAGINFO、LAGCRITICAL:
定義數據延遲的預警機制:本處設置表示MGR進程每隔1小時檢查EXTRACT的延遲情況,如果超過了30分鍾就把延遲作為信息記錄到錯誤日志中,如果延遲超過了45分鍾,則把它作為警告寫到錯誤日志中。
EXTRACT組:
EXTRACT進程參數配置說明:
SETENV:配置系統環境變量
USERID/ PASSWORD:指定OGG連接數據庫的用戶名和密碼,這里使用3.4部分中創建的數據庫用戶OGG;
COMMENT:注釋行,也可以用--來代替;
TABLE:定義需復制的表,后面需以;結尾
TABLEEXCLUDE:定義需要排除的表,如果在TABLE參數中使用了通配符,可以使用該參數指定排除掉得表。
GETUPDATEAFTERS|IGNOREUPDATEAFTERS:
是否在隊列中寫入后影像,缺省復制
GETUPDATEBEFORES| IGNOREUPDATEBEFORES:
是否在隊列中寫入前影像,缺省不復制
GETUPDATES|IGNOREUPDATES:
是否復制UPDATE操作,缺省復制
GETDELETES|IGNOREDELETES:
是否復制DELETE操作,缺省復制
GETINSERTS|IGNOREINSERTS:
是否復制INSERT操作,缺省復制
GETTRUNCATES|IGNORETRUNDATES:
是否復制TRUNCATE操作,缺省不復制;
RMTHOST:指定目標系統及其GoldengateManager進程的端口號,還用於定義是否使用壓縮進行傳輸,本例中的compress為壓縮傳輸;
RMTTRAIL:指定寫入到目標斷的哪個隊列;
EXTTRAIL:指定寫入到本地的哪個隊列;
SQLEXEC:在extract進程運行時首先運行一個SQL語句;
PASSTHRU:禁止extract進程與數據庫交互,適用於Data Pump傳輸進程;
REPORT:定義自動定時報告;
STATOPTIONS:定義每次使用stat時統計數字是否需要重置;
REPORTCOUNT:報告已經處理的記錄條數統計數字;
TLTRACE:打開對於數據庫日志的跟蹤日志;
DISCARDFILE:定義discardfile文件位置,如果處理中油記錄出錯會寫入到此文件中;
DBOPTIONS:指定對於某種特定數據庫所需要的特殊參數;
TRANLOGOPTIONS:指定在解析數據庫日志時所需要的特殊參數,例如:對於裸設備,可能需要加入以下參數 rawdeviceoggset 0
WARNLONGTRANS:指定對於超過一定時間的長交易可以在gsserr.log里面寫入警告信息,本處配置為每隔3分鍾檢查一次場交易,對於超過2小時的進行警告;
配置復制進程
REPLICAT進程參數配置說明:
ASSUMETARGETDEFS:假定兩端數據結構一致使用此參數;
SOURCEDEFS:假定兩端數據結構不一致,使用此參數指定源端的數據結構定義文件,該文件需要由GlodenGate工具產生。
MAP:用於指定源端與目標端表的映射關系;
MAPEXCLUDE:用於使用在MAP中使用*匹配時排除掉指定的表;
REPERROR:定義出錯以后進程的響應,一般可以定義為兩種:
ABEND,即一旦出現錯誤即停止復制,此為缺省配置;
DISCARD,出現錯誤后繼續復制,只是把錯誤的數據放到discard文件中。
DISCARDFILE:定義discardfile文件位置,如果處理中油記錄出錯會寫入到此文件中;
SQLEXEC:在進程運行時首先運行一個SQL語句;
GROUPTRANSOPS:將小交易合並成一個大的交易進行提交,減少提交次數,降低系統IO消耗。
MAXTRANSOPS:將大交易拆分,每XX條記錄提交一次。
TABLEEXCLUDE <schema>.<materialized view>
OGG設置:
在ogg中主進程是manager進程,使用startmgr啟動。可以在mgr進程中添加一些參數用來在啟動mgr進程的同時啟動extract和replicat進程。
1、以下是extract端的mgr參數配置
GGSCI (gg01) 130> edit params mgr
PORT 7809
DYNAMICPORTLIST 7800-7909
--啟動mgr進程啟動啟動extract進程
AUTOSTART EXTRACT *
--extract異常終止時會自動啟動,每5分鍾嘗試重新啟動所有的extract進程,一共嘗試3次,5分鍾清零
AUTORESTART EXTRACT *,RETRIES 3, WAITMINUTES 5, RESETMINUTES 10
2、配置目標端replicat進程自啟動,在mgr參數中添加如下
GGSCI (gg02) 140> edit params mgr
PORT 7809
--動態端口,當指定端口不可用時,會從以下列表中選擇一個可用端口
DYNAMICPORTLIST 7800-7909
--自動啟動replicat進程
AUTOSTART REPLICAT *
--當replicat進程異常終止時會自動啟動,每5分鍾嘗試重新啟動所有的replicat進程,一共嘗試5次
AUTORESTART REPLICAT *, WAITMINUTES 2, RETRIES 5
--mgr每隔1小時檢查extract延時情況,超5分鍾作為信息記錄log中,超過7分鍾作為警告記錄log中
LAGREPORTHOURS 1
LAGINFOMINUTES 5
LAGCRITICALMINUTES 7
--刪除10天前的trail文件
PURGEOLDEXTRACTS /oracle/ogg/dirdat/*, USECHECKPOINTS, MINKEEPDAYS 10
OGG同步序列
1.目標及源服務器均以sys登錄sqlplus安裝sequence.sql
2.源:grant execute on ogg.updateSequence to ogg; grant execute on ogg.updateSequence to ihms2012syn_login;
3目標:GRANT EXECUTE on ogg.replicateSequence TO ogg; GRANT EXECUTE on ogg.replicateSequence TO ihms2012syn_login;
4.停止extract相關進程:edit param extractname;
txt文檔中加入sequence ihms2012syn_login.*;
OGG抽取或復制出現錯誤
1.停止mgr
2.停止extract、replicat進程,刪除目的端dirdat所有文件。
3.刪除對應extract、replicat進程、刪除檢查點。
4.重建檢查點、重建進程。
5啟動replicat、然后啟動extract
情況一:如果重新設置抓取文件和復制文件的話會丟失a_15歸檔數據。
停止進程 replicat 、extract
源 alter extract exihms, extseqno 3, extrba 0
extseqno 3就是生成的文件名,extrba 數字 表示日志文件中的第幾行開始讀取
alter extract exihms ,extseqno 3, extrba 0的意思就是新生成一個wf000003文件。
alter extract exihms,tranlog,begin 2013-12-26 15:00
從某一時刻抽取歸檔日志。(這個設置很重要)
目標 alter rep2, extseqno 3,extrba 0
從wf000003文件的第一行開始讀取
情況二:通過ogg文件夾中的logdump進行日志分析,然后使用alter rep2, extseqno 3,extrba 0 精確的跳過錯誤行。
情況三:缺什么補什么,本例中只要在目標數據庫建立一個同名的可更新的物化視圖。重啟replicat即可。
OGG配置實驗
2013-12-27:1.說明源與目標服務器均要求配置完成並啟動mgr進程
2.配置源extract、目標replicat進程后先不啟動(replicat也可imp之后配置)
3.源數據庫停機exp,exp導出之后開啟extract進程,源服務器可開始正常工作。extract會自動向目標服務器的指定dirdat文件夾中推送 同步文件(此文件夾最好為空,有利用設定開始節點)
4.目標機imp
5.imp結束后alter repname,extseqno 0,extrba 0設置replicat從第一個文件的第一行開始讀取
6.開啟replicat
7.此方案減少源服務器的停機時間。
OGG出錯 ogg-01168
數據同步出問題的表沒有主鍵,客戶執行insert的時候沒有問題,在執行update的時候報了上面的錯誤。以上的報錯涉及三個參數,KEYCOLS,ALLOWNOOPUPDATES,APPLYNOOPUPDATES。下面我們分別討論這3個參數:
1)KEYCOLS
KEYCOLS關鍵字用於對沒有主鍵的表,指定能夠唯一標識數據的字段,這樣Oracle GoldenGate同樣可以完成數據的同步(同步UPDATE操作)。
將目標數據庫的replicat配置修改為:
MAP CCENSE.ST_CARDOPERATORSTATTMP, TARGET CCENSE.ST_CARDOPERATORSTATTMP, KEYCOLS(cardsfid)
重啟目標數據庫的replicat進程即可完成數據的同步,但需要注意的是,使用這種方式必須把所有的表列出來,不能指定為<username>.*。
2)ALLOWNOOPUPDATES
官方文檔解釋如下:
ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES
Valid for Replicat
Use ALLOWNOOPUPDATES and NOALLOWNOOPUPDATES to control how Replicat responds to a “noop”
operation. A no-op operation is one in which there is no effect on the target table. The
following are some examples of how this can occur.
● The source table has a column that does not exist in the target table, or has a column
that was excluded from replication (with a COLSEXCEPT clause). In either case, if that
source column is updated, there will be no target column name to use in the SET clause
within the Replicat SQL statement.
● An update is made that sets a column to the same value as the current one. The
database does not log the new value, because it did not really change. However, Oracle
GoldenGate extracts the operation as a change record because the primary key was
logged — but there is no column value for the SET clause in the Replicat SQL statement.
By default (NOALLOWNOOPUPDATES), Replicat abends with an error because these types of
operations do not update the database. With ALLOWNOOPUPDATES, Replicat ignores the
operation instead of abending. The statistics reported by Replicat will show that an update
was made, but the database will not be updated.
You can use the internal parameter APPLYNOOPUPDATES to force the update to be applied.
APPLYNOOPUPDATES overrides ALLOWNOOPUPDATES. If both are specified then updates with
only key columns will be applied. By default, Oracle GoldenGate will abend with the
following message if it only has source key columns but there is no key defined for the target table.
2011-01-25 02:28:42 GGS ERROR 160 Encountered an update for target
table TELLER, which has no unique key defined. KEYCOLS can be used to
define a key. Use ALLOWNOOPUPDATES to process the update without applying
it to the target database. Use APPLYNOOPUPDATES to force the update to
be applied using all columns in both the SET and WHERE clause.
Exceptions when error-handling is in place
If ALLOWNOOPUPDATES is specified when the HANDLECOLLISIONS or INSERTMISSINGUPDATES
parameters are being used, and if Oracle GoldenGate has all of the target key values, then
Oracle GoldenGate will not ignore the update, but instead will apply it using all key
columns in the SET clause and the WHERE clause (invoking APPLYNOOPUPDATES behavior). This
is necessary so Oracle GoldenGate can detect if the row being updated is missing. If it is,
then Oracle GoldenGate turns the update into an insert.
Default NOALLOWNOOPUPDATES (only applies if the table does not have a key)
Syntax ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES
該參數的含義就是在同步到目標數據庫的時候忽略出現的NO-OP操作,NO-OP操作包括目標數據庫沒有主數據庫的字段(兩邊數據庫字段不同),還有一種情況是執行UPDATE語句修改的數據和原有數據一樣,沒有發生變化。以上兩種情況叫做NO-OP操作,遭遇NO-OP操作gg會被終止。
3)APPLYNOOPUPDATES
該參數的含義就是不忽略出現的NO-OP操作,而是在目標數據庫強制執行UPDATE修改操作,且只更新鍵值數據(主鍵或KEYCOLS指定的鍵值),如果表沒有主鍵,也沒有使用KEYCOLS關鍵字指定字段,那么將更新表數據的所有字段,如果沒有相應記錄,將INSERT新插入一條。
官方文檔解釋如下:
APPLYNOOPUPDATES | NOAPPLYNOOPUPDATES
Valid for Replicat
Use APPLYNOOPUPDATES to force a “no-op” update to be applied using all columns in both the
SET and WHERE clauses. See ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES for a description of
“no-op.”
APPLYNOOPUPDATES uses whatever data is in the trail. If there is a primary key update
record, it uses the before columns from the source. If there is a regular (non-key) update,
it assumes that the after value is the same as the before value (otherwise it would be a
primary key update). The preceding assumes source and target keys are identical. If they
are not, you must use a KEYCOLS clause in the TABLE statement on the source.
Default NOAPPLYNOOPUPDATES
Syntax APPLYNOPUPDATES | NOAPPLYNOPUPDATES
請注意,我們在討論NO-OP操作的時候,NO-OP操作並不包含UPDATE沒有主鍵的表,所以我們遇到的這個問題和ALLOWNOOPUPDATES和APPLYNOOPUPDATES這兩個參數沒有關系。通過實踐證明,在replicat配置文件中加入這兩個參數(或只加入ALLOWNOOPUPDATE參數),在更新沒有主鍵,也沒有指定KEYCOLS字段的表的時候同樣會報錯。對沒有主鍵,但加上了KEYCOLS字段后的表執行UPDATE操作成功同步了數據。
如果沒有在源數據庫啟用記錄表的supplement log,同樣會收到以上的報錯,原因是在於沒有記錄沒有主鍵表的supplement log數據,並將其傳遞到目標數據庫,執行以下操作可以啟用記錄表的supplement log:
cd $GGHOME
./ggsci
dblogin userid <username>,password <password>
add trandata <username>.<tablename>
完成以上操作之后,可以解決由此問題導致的update不能同步。
ora-01403 no data found的處理
此錯誤可能為源端與目標端表結構不同或數據不同而造成。
處理過程:停止源端與目標端進程,
源端:
從日志表中刪除問題對象名稱
Delete trandata 用戶名.對象名
刪除此表,重新新建此表,恢復數據。
添加至日志中。
Add trandata 用戶名.對象名
目標端:
從日志表中刪除問題對象名稱
Delete trandata 用戶名.對象名
刪除此表,重新新建此表,恢復數據。
添加至日志中。
Add trandata 用戶名.對象名
開啟源端進程。
開啟目標端進程。
一次恢復流程
源庫和目標庫的expdp、impdp
1、源庫select current_scn from v$database 確定scn。
2、修改scn號為上面當前值,從源庫導出。
expdp directory=EXPDIR FLASHBACK_SCN= 9015228145167 schemas=tjrealms2014_login dumpfile=bdc.dmp
3、目標庫導入數據impdp dumpfile=hp.dmp directory=dump_dir schemas=Xxx_login
4、生成expdp、impdp的sql:create directory dump_dir as 'e:\app\expdp';select * from dba_directories;
5、impdp dumpfile=hp.dmp directory=dump_dir schemas=Xxx_login
6、start repHp,aftercsn 9015228145167
1 簡介 Oracle Golden Gate軟件是一種基於日志的結構化數據復制備份軟件,它通過解析源數據庫在線日志或歸檔日志獲得數據的增量變化,再將這些變化應用到目標數據庫,從而實現源數據庫與目標數據庫同步。Oracle Golden Gate可以在異構的IT基礎結構(包括幾乎所有常用操作系統平台和數據庫平台)之間實現大量數據亞秒一級的實時復制,從而在可以在應急系統、在線報表、實時數據倉庫供應、交易跟蹤、數據同步、集中/分發、容災、數據庫升級和移植、雙業務中心等多個場景下應用。同時,Oracle Golden Gate可以實現一對一、廣播(一對多)、聚合(多對一)、雙向、點對點、級聯等多種靈活的拓撲結構
2 GoldenGate安裝 2.1 GoldenGate的獲取 Oracle GoldenGate(下文簡稱ogg)軟件可以通過ORACLE官方網站進行下載,根據ORACLE的版本及操作系統來下載對應版本的ogg,官方下載地址:http://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html 2.2 GoldenGate的安裝 ogg安裝非常簡單,但需在源數據庫和目標數據庫服務器上均安裝ogg軟件即可,具體請參考以下步驟: 1) 將壓縮包解壓到系統目錄/oracle/ogg (該路徑可以根據需要自行選擇) 2)、 進入/oracle/ogg目錄,運行./ggsci,進入ogg管理控制台 3)、 在ogg控制台輸入命令: create subdirs ,讓ogg創建其需要用到的目錄 4)、 手工在ogg目錄下創建discard文件夾,mkdir discard 5)、 配置操作系統環境變量(請確保環境變量配置了ORACLE_HOME和ORACLE_SID)(如果不配置環境變量的話,以下涉及的路徑都需要用絕對路徑)export LD_LIBRARY_PATH=/oradata/ogg:$ORACLE_HOME/lib:$LD_LIBRARY_PATH 6)、 在ORACLE中創建ogg專屬用戶 [oracle@local ~]$ sqlplus /nolog SQL> conn / as sysdba SQL> create user ogg identified by ogg; (注:賬號密碼根據實際情況設置) SQL> grant connect,resource to ogg; SQL> grant unlimited tablespace to ogg; SQL> grant execute on utl_file to ogg; 7)、 為新創建的ogg用戶執行配置腳本 在ogg的安裝目錄下登陸sqlplus,使用sys登陸sqlplus,然后執行如下配置 [oracle@local ~]$ sqlplus /nolog SQL> conn / as sysdba SQL> @marker_setup.sql SQL> @ddl_setup.sql; SQL> @role_setup.sql; SQL> grant GGS_GGSUSER_ROLE to ogg; SQL> @ddl_enable.sql; 進入ogg控制台,測試用戶是否創建成功 GGSCI (local) 1> dblogin userid ogg Password: ogg Successfully logged into database. 通過上述步驟,ogg就安裝成功了。3 單項復制的配置 為了能讓ogg成功的將源數據庫及目標數據庫進行同步,下面還需要對ogg及oracle進行一系列配置(ogg支持多種復制方式,比如單項復制、雙向復制等等,因實際需要,本文僅介紹單項復制相關配置)。首先說說ogg的一些概念: 1)、 Manager:ogg所有服務必須依賴Manager,Manger如同ogg的總調度。 2)、 Extract :ogg用來獲取源數據庫數據更新的,將變更的數據發送到目標數據庫 3)、 Replicat :ogg用來接收源數據庫的更新,一旦源數據庫Extract將數據發送過來后,Replicat會自動將更新腳本同步到目標數據庫。 3.1 源服務器配置 1)、開啟ORACLE歸檔模式,設置日志模式 [oracle@local ~]$ sqlplus /nolog SQL> conn / as sysdba SQL> shutdown immediate; SQL> startup mount; SQL> alter database archivelog; SQL> alter database force logging; SQL> alter database add supplemental log data; SQL> alter database open; 2)、 回收站功能會影響同步,需要關閉回收站 SQL>alter session set recyclebin=off; SQL>alter system set recyclebin=off;(如果不成功可以使用alter system set recyclebin=off deferred;) 3)、配置環境變量NLS_LANG(不配置中文同步會亂碼) 首先在oracle中查詢select userenv( 'language') from dual; 然后將查詢的結果配置到linux環境變量中 如export NLS_LANG=” SIMPLIFIED CHINESE_CHINA.ZHS16GBK” 4)、登陸ogg控制台,設置需要進行同步的oracle表 GGSCI (local) 1> dblogin userid ogg GGSCI (local) 1> add trandata dbuser.* 5)、配置ogg manager&啟動manager(配置界面操作類似vi) GGSCI (local) 1> edit param mgr PORT 7809 GGSCI (local) 1> info all(查看當前mgr狀態) GGSCI (local) 1> start manager(啟動manager,啟動完后可以用info all再次查看狀態) 6)、 添加一個ogg extract進程,用於抽取源服務器數據 GGSCI (local) 1> add extract ext4,tranlog,begin now (增加一個抽取進程ext4,ext4名 字可以根據需要修改) GGSCI (local) 1> add exttrail D: \app\Administrator\product\11.2.0\ogg11\dirdat\wf,extract ext4 (將ext4抽取的源數據變更數據寫到該文件夾,沒有設置系統環境變量的用絕對地址) GGSCI (local) 1> add rmttrail c:\app\Administrator\product\11.2.0\gg11\dirdat\wf,extract ext4(傳遞的路徑) GGSCI (local) 1> edit params ext4 (修改ext4的配置參數,txt文檔) extract ext4 setenv (ORACLE_SID=REGULATORY) setenv (NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK) userid ogg,password oggPssword01 rmthost 162.16.162.24,mgrport 7809 rmttrail C:\app\Administrator\product\11.2.0\gg11\dirdat\wf ddl include mapped all objname ihms2012syn_login.*; table ihms2012syn_login.*;配置完成后可以通過info all查看到新添加的extract的狀態 7)、啟動ogg extract命令 GGSCI (local) 1> start extract ext4 (等目標服務器ogg配置成功后再啟動ext)
3.2 目標服務器配置 1)、登陸ogg控制台 GGSCI (local) 1> dblogin userid ogg 2)、配置ogg manager&啟動manager(配置界面操作類似vi) GGSCI (local) 1> edit param mgr PORT 7809 DYNAMICPORTLIST 7840-7850 --遠程隊列端口范圍 GGSCI (local) 1> info all(查看當前mgr狀態) 3)、 添加一個ogg replicat進程,用於更新目標服務器數據 GGSCI (local) 1> edit params ./GLOBAL GSSCHEMA ogg CHECKPOINTTABLE ogg.checkpoint GGSCI (local) 2> dblogin userid ogg Password: ogg Successfully logged into database. GGSCI (local) 3> add checkpointtable ogg.checkpoint Successfully created checkpoint table ogg.CHECKPOINT. GGSCI (local) 4> ADD replicat rep2 EXTTRAIL /hom/wangfan/ggs/dirdat/wf, checkpointtable ogg.checkpoint(沒有設置系統變量的就用絕對地址) GGSCI (local) 5> edit param rep2 --Replicat group --(replicat實例) replicat rep2 setenv (ORACLE_SID=jjzlfbackup) setenv (NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK) --source and target definitions ASSUMETARGETDEFS --target database login -- userid ogg, password ogg --file for dicarded transaction -- discardfile /oracle/ogg/discard/rep2_discard.txt, append, megabytes 10 --ddl support DDL DDL INCLUDE MAPPED ALL objname dbuser.*; DDLERROR DEFAULT IGNORE RETRYOP --Specify table mapping --- map dbuser.*, target dbuser.*; 配置完成后可以通過info all查看到新添加的extract的狀態 4)、啟動ogg manager & replicat命令 GGSCI (local) 1> start manager GGSCI (local) 1> start replicat rep2 最后參考源服務器配置,啟動ext4
4 維護相關 4.1 OGG常用命令 啟動manager:start manager 啟動extract:start extract extn 啟動replicat:start replicat repn 停止manager:stop manager 停止 extract:stop extract extn 停止replicat:stop replicat repn 刪除extract:delete extract extn 刪除replicat:delete extract repn 查看ogg狀態:info all 修改manager參數:edit params mgr 修改extract參數:edit params extn 修改replicat參數:edit params repn 修改全局參數:edit params ./GLOBAL 更新抽取 4.2 OGG日志路徑 $OGG_HOME/ggserr.log 4.3 OGG開機自啟 操作系統設置(linux): 1)、用oracle用戶建立/oracle/ogg/autostart/info.txt,文件內容如下: sh dat start mgr 2)、chmod x info.txt 3)、用oracle用戶建立/oracle/ogg/autostart/startmgr.sh,文件內如下: /oracle/ogg/ggsci paramfile /oracle/ogg/autostart/info.txt >> /oracle/ogg/autostart/log.txt 4)、chmod x startmgr.sh 5)、用root用戶編輯 /etc/rc.local ,添加如下信息: su - oracle -c "/oracle/ogg/autostart/startmgr.sh"
OGG各組參數說明:源mgr:MANAGER進程參數配置說明:PORT:指定服務監聽端口;這里以7839為例,默認端口為7809DYNAMICPORTLIST:動態端口:可以制定最大256個可用端口的動態列表,當指定的端口不可用時,管理進程將會從列表中選擇一個可用的端口,源端和目標段的Collector、Replicat、GGSCI進程通信也會使用這些端口;COMMENT:注釋行,也可以用--來代替;AUTOSTART:指定在管理進程啟動時自動啟動哪些進程;AUTORESTART:自動重啟參數設置:本處設置表示每3分鍾嘗試重新啟動所有EXTRACT進程,共嘗試5次;PURGEOLDEXTRACTS:定期清理trail文件設置:本處設置表示對於超過3天的trail文件進行刪除。LAGREPORT、LAGINFO、LAGCRITICAL:定義數據延遲的預警機制:本處設置表示MGR進程每隔1小時檢查EXTRACT的延遲情況,如果超過了30分鍾就把延遲作為信息記錄到錯誤日志中,如果延遲超過了45分鍾,則把它作為警告寫到錯誤日志中。
EXTRACT組:EXTRACT進程參數配置說明:SETENV:配置系統環境變量USERID/ PASSWORD:指定OGG連接數據庫的用戶名和密碼,這里使用3.4部分中創建的數據庫用戶OGG;COMMENT:注釋行,也可以用--來代替;TABLE:定義需復制的表,后面需以;結尾TABLEEXCLUDE:定義需要排除的表,如果在TABLE參數中使用了通配符,可以使用該參數指定排除掉得表。GETUPDATEAFTERS|IGNOREUPDATEAFTERS:是否在隊列中寫入后影像,缺省復制GETUPDATEBEFORES| IGNOREUPDATEBEFORES:是否在隊列中寫入前影像,缺省不復制GETUPDATES|IGNOREUPDATES:是否復制UPDATE操作,缺省復制GETDELETES|IGNOREDELETES:是否復制DELETE操作,缺省復制GETINSERTS|IGNOREINSERTS:是否復制INSERT操作,缺省復制GETTRUNCATES|IGNORETRUNDATES:是否復制TRUNCATE操作,缺省不復制;RMTHOST:指定目標系統及其GoldengateManager進程的端口號,還用於定義是否使用壓縮進行傳輸,本例中的compress為壓縮傳輸;RMTTRAIL:指定寫入到目標斷的哪個隊列;EXTTRAIL:指定寫入到本地的哪個隊列;SQLEXEC:在extract進程運行時首先運行一個SQL語句;PASSTHRU:禁止extract進程與數據庫交互,適用於Data Pump傳輸進程;REPORT:定義自動定時報告;STATOPTIONS:定義每次使用stat時統計數字是否需要重置;REPORTCOUNT:報告已經處理的記錄條數統計數字;TLTRACE:打開對於數據庫日志的跟蹤日志;DISCARDFILE:定義discardfile文件位置,如果處理中油記錄出錯會寫入到此文件中;DBOPTIONS:指定對於某種特定數據庫所需要的特殊參數;TRANLOGOPTIONS:指定在解析數據庫日志時所需要的特殊參數,例如:對於裸設備,可能需要加入以下參數 rawdeviceoggset 0WARNLONGTRANS:指定對於超過一定時間的長交易可以在gsserr.log里面寫入警告信息,本處配置為每隔3分鍾檢查一次場交易,對於超過2小時的進行警告;
配置復制進程REPLICAT進程參數配置說明:ASSUMETARGETDEFS:假定兩端數據結構一致使用此參數;SOURCEDEFS:假定兩端數據結構不一致,使用此參數指定源端的數據結構定義文件,該文件需要由GlodenGate工具產生。MAP:用於指定源端與目標端表的映射關系;MAPEXCLUDE:用於使用在MAP中使用*匹配時排除掉指定的表;REPERROR:定義出錯以后進程的響應,一般可以定義為兩種:ABEND,即一旦出現錯誤即停止復制,此為缺省配置;DISCARD,出現錯誤后繼續復制,只是把錯誤的數據放到discard文件中。DISCARDFILE:定義discardfile文件位置,如果處理中油記錄出錯會寫入到此文件中;SQLEXEC:在進程運行時首先運行一個SQL語句;GROUPTRANSOPS:將小交易合並成一個大的交易進行提交,減少提交次數,降低系統IO消耗。MAXTRANSOPS:將大交易拆分,每XX條記錄提交一次。TABLEEXCLUDE <schema>.<materialized view>
OGG設置:在ogg中主進程是manager進程,使用startmgr啟動。可以在mgr進程中添加一些參數用來在啟動mgr進程的同時啟動extract和replicat進程。 1、以下是extract端的mgr參數配置 GGSCI (gg01) 130> edit params mgr PORT 7809 DYNAMICPORTLIST 7800-7909 --啟動mgr進程啟動啟動extract進程 AUTOSTART EXTRACT * --extract異常終止時會自動啟動,每5分鍾嘗試重新啟動所有的extract進程,一共嘗試3次,5分鍾清零 AUTORESTART EXTRACT *,RETRIES 3, WAITMINUTES 5, RESETMINUTES 10 2、配置目標端replicat進程自啟動,在mgr參數中添加如下 GGSCI (gg02) 140> edit params mgr PORT 7809 --動態端口,當指定端口不可用時,會從以下列表中選擇一個可用端口 DYNAMICPORTLIST 7800-7909 --自動啟動replicat進程 AUTOSTART REPLICAT * --當replicat進程異常終止時會自動啟動,每5分鍾嘗試重新啟動所有的replicat進程,一共嘗試5次 AUTORESTART REPLICAT *, WAITMINUTES 2, RETRIES 5 --mgr每隔1小時檢查extract延時情況,超5分鍾作為信息記錄log中,超過7分鍾作為警告記錄log中 LAGREPORTHOURS 1 LAGINFOMINUTES 5 LAGCRITICALMINUTES 7 --刪除10天前的trail文件 PURGEOLDEXTRACTS /oracle/ogg/dirdat/*, USECHECKPOINTS, MINKEEPDAYS 10
OGG同步序列1.目標及源服務器均以sys登錄sqlplus安裝sequence.sql2.源:grant execute on ogg.updateSequence to ogg; grant execute on ogg.updateSequence to ihms2012syn_login;3目標:GRANT EXECUTE on ogg.replicateSequence TO ogg; GRANT EXECUTE on ogg.replicateSequence TO ihms2012syn_login;4.停止extract相關進程:edit param extractname; txt文檔中加入sequence ihms2012syn_login.*;
OGG抽取或復制出現錯誤1.停止mgr2.停止extract、replicat進程,刪除目的端dirdat所有文件。3.刪除對應extract、replicat進程、刪除檢查點。4.重建檢查點、重建進程。5啟動replicat、然后啟動extract
情況一:如果重新設置抓取文件和復制文件的話會丟失a_15歸檔數據。 停止進程 replicat 、extract 源 alter extract exihms, extseqno 3, extrba 0 extseqno 3就是生成的文件名,extrba 數字 表示日志文件中的第幾行開始讀取 alter extract exihms ,extseqno 3, extrba 0的意思就是新生成一個wf000003文件。 alter extract exihms,tranlog,begin 2013-12-26 15:00 從某一時刻抽取歸檔日志。(這個設置很重要) 目標 alter rep2, extseqno 3,extrba 0 從wf000003文件的第一行開始讀取 情況二:通過ogg文件夾中的logdump進行日志分析,然后使用alter rep2, extseqno 3,extrba 0 精確的跳過錯誤行。 情況三:缺什么補什么,本例中只要在目標數據庫建立一個同名的可更新的物化視圖。重啟replicat即可。
OGG配置實驗2013-12-27:1.說明源與目標服務器均要求配置完成並啟動mgr進程 2.配置源extract、目標replicat進程后先不啟動(replicat也可imp之后配置) 3.源數據庫停機exp,exp導出之后開啟extract進程,源服務器可開始正常工作。extract會自動向目標服務器的指定dirdat文件夾中推送 同步文件(此文件夾最好為空,有利用設定開始節點) 4.目標機imp 5.imp結束后alter repname,extseqno 0,extrba 0設置replicat從第一個文件的第一行開始讀取 6.開啟replicat 7.此方案減少源服務器的停機時間。
OGG出錯 ogg-01168數據同步出問題的表沒有主鍵,客戶執行insert的時候沒有問題,在執行update的時候報了上面的錯誤。以上的報錯涉及三個參數,KEYCOLS,ALLOWNOOPUPDATES,APPLYNOOPUPDATES。下面我們分別討論這3個參數:
1)KEYCOLS KEYCOLS關鍵字用於對沒有主鍵的表,指定能夠唯一標識數據的字段,這樣Oracle GoldenGate同樣可以完成數據的同步(同步UPDATE操作)。 將目標數據庫的replicat配置修改為:MAP CCENSE.ST_CARDOPERATORSTATTMP, TARGET CCENSE.ST_CARDOPERATORSTATTMP, KEYCOLS(cardsfid) 重啟目標數據庫的replicat進程即可完成數據的同步,但需要注意的是,使用這種方式必須把所有的表列出來,不能指定為<username>.*。
2)ALLOWNOOPUPDATES 官方文檔解釋如下:ALLOWNOOPUPDATES | NOALLOWNOOPUPDATESValid for ReplicatUse ALLOWNOOPUPDATES and NOALLOWNOOPUPDATES to control how Replicat responds to a “noop”operation. A no-op operation is one in which there is no effect on the target table. Thefollowing are some examples of how this can occur.● The source table has a column that does not exist in the target table, or has a columnthat was excluded from replication (with a COLSEXCEPT clause). In either case, if thatsource column is updated, there will be no target column name to use in the SET clausewithin the Replicat SQL statement.● An update is made that sets a column to the same value as the current one. Thedatabase does not log the new value, because it did not really change. However, OracleGoldenGate extracts the operation as a change record because the primary key waslogged — but there is no column value for the SET clause in the Replicat SQL statement.By default (NOALLOWNOOPUPDATES), Replicat abends with an error because these types ofoperations do not update the database. With ALLOWNOOPUPDATES, Replicat ignores theoperation instead of abending. The statistics reported by Replicat will show that an updatewas made, but the database will not be updated.You can use the internal parameter APPLYNOOPUPDATES to force the update to be applied.APPLYNOOPUPDATES overrides ALLOWNOOPUPDATES. If both are specified then updates withonly key columns will be applied. By default, Oracle GoldenGate will abend with thefollowing message if it only has source key columns but there is no key defined for the target table.
2011-01-25 02:28:42 GGS ERROR 160 Encountered an update for targettable TELLER, which has no unique key defined. KEYCOLS can be used todefine a key. Use ALLOWNOOPUPDATES to process the update without applyingit to the target database. Use APPLYNOOPUPDATES to force the update tobe applied using all columns in both the SET and WHERE clause.
Exceptions when error-handling is in placeIf ALLOWNOOPUPDATES is specified when the HANDLECOLLISIONS or INSERTMISSINGUPDATESparameters are being used, and if Oracle GoldenGate has all of the target key values, thenOracle GoldenGate will not ignore the update, but instead will apply it using all keycolumns in the SET clause and the WHERE clause (invoking APPLYNOOPUPDATES behavior). Thisis necessary so Oracle GoldenGate can detect if the row being updated is missing. If it is,then Oracle GoldenGate turns the update into an insert.Default NOALLOWNOOPUPDATES (only applies if the table does not have a key)Syntax ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES
該參數的含義就是在同步到目標數據庫的時候忽略出現的NO-OP操作,NO-OP操作包括目標數據庫沒有主數據庫的字段(兩邊數據庫字段不同),還有一種情況是執行UPDATE語句修改的數據和原有數據一樣,沒有發生變化。以上兩種情況叫做NO-OP操作,遭遇NO-OP操作gg會被終止。
3)APPLYNOOPUPDATES 該參數的含義就是不忽略出現的NO-OP操作,而是在目標數據庫強制執行UPDATE修改操作,且只更新鍵值數據(主鍵或KEYCOLS指定的鍵值),如果表沒有主鍵,也沒有使用KEYCOLS關鍵字指定字段,那么將更新表數據的所有字段,如果沒有相應記錄,將INSERT新插入一條。 官方文檔解釋如下:
APPLYNOOPUPDATES | NOAPPLYNOOPUPDATESValid for ReplicatUse APPLYNOOPUPDATES to force a “no-op” update to be applied using all columns in both theSET and WHERE clauses. See ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES for a description of“no-op.”APPLYNOOPUPDATES uses whatever data is in the trail. If there is a primary key updaterecord, it uses the before columns from the source. If there is a regular (non-key) update,it assumes that the after value is the same as the before value (otherwise it would be aprimary key update). The preceding assumes source and target keys are identical. If theyare not, you must use a KEYCOLS clause in the TABLE statement on the source.Default NOAPPLYNOOPUPDATESSyntax APPLYNOPUPDATES | NOAPPLYNOPUPDATES
請注意,我們在討論NO-OP操作的時候,NO-OP操作並不包含UPDATE沒有主鍵的表,所以我們遇到的這個問題和ALLOWNOOPUPDATES和APPLYNOOPUPDATES這兩個參數沒有關系。通過實踐證明,在replicat配置文件中加入這兩個參數(或只加入ALLOWNOOPUPDATE參數),在更新沒有主鍵,也沒有指定KEYCOLS字段的表的時候同樣會報錯。對沒有主鍵,但加上了KEYCOLS字段后的表執行UPDATE操作成功同步了數據。
如果沒有在源數據庫啟用記錄表的supplement log,同樣會收到以上的報錯,原因是在於沒有記錄沒有主鍵表的supplement log數據,並將其傳遞到目標數據庫,執行以下操作可以啟用記錄表的supplement log:cd $GGHOME./ggscidblogin userid <username>,password <password>add trandata <username>.<tablename> 完成以上操作之后,可以解決由此問題導致的update不能同步。
ora-01403 no data found的處理此錯誤可能為源端與目標端表結構不同或數據不同而造成。處理過程:停止源端與目標端進程,源端:從日志表中刪除問題對象名稱Delete trandata 用戶名.對象名刪除此表,重新新建此表,恢復數據。添加至日志中。Add trandata 用戶名.對象名
目標端:從日志表中刪除問題對象名稱Delete trandata 用戶名.對象名刪除此表,重新新建此表,恢復數據。添加至日志中。Add trandata 用戶名.對象名
開啟源端進程。開啟目標端進程。
一次恢復流程源庫和目標庫的expdp、impdp1、源庫select current_scn from v$database 確定scn。2、修改scn號為上面當前值,從源庫導出。expdp directory=EXPDIR FLASHBACK_SCN= 9015228145167 schemas=tjrealms2014_login dumpfile=bdc.dmp3、目標庫導入數據impdp dumpfile=hp.dmp directory=dump_dir schemas=Xxx_login4、生成expdp、impdp的sql:create directory dump_dir as 'e:\app\expdp';select * from dba_directories;5、impdp dumpfile=hp.dmp directory=dump_dir schemas=Xxx_login6、start repHp,aftercsn 9015228145167
————————————————版權聲明:本文為CSDN博主「大巧不工」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/saijie1983/article/details/101926093