oracle goldengate的兩種用法
此文已由作者趙欣授權網易雲社群釋出。
歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。
自從oracle收購來了goldengate這款產品並以後對它做了一系列改進後,有非常多的使用者使用它做資料遷移、etl抽取、複製容災等等場景。
這裡還有兩個goldengate的另類用法,也是非常實用。
1.通過dataguard的備庫+goldengate直接格式化輸出操作的sql
大多數時候我們要檢查某些表資料的變化是怎麼產生的、何時產生的,在沒有開啟詳細審計監控的時候一般都會使用logminer來操作。
但如果只想提取修改部分表的操作sql而不是要做集體回滾操作、或者不想通過logminer做整體的挖掘審計時logminer操作起來稍顯麻煩
在很多oracle場景裡都會有dataguard+goldengate使用,那麼我們其實可以很簡單的利用dataguard的adg+goldengate快速抽取歸檔,格式化輸出我們感興趣表的相關sql
以下是我們的測試步驟,環境為oracle11.2.2.8+goldengate11.2.1.20:
主庫建立測試使用者
create user oggtest identified by oracle; grant connect,resource to oggtest;
開啟force logging和最小附加日誌
select supplemental_log_data_min from v$database; alter database add supplemental log data; select force_logging from v$database; Alter database force logging;
開啟表級補全日誌,這裡我們使用全庫開啟補全
alter database add supplemental log data (primary key,unique,foreign key) columns;
建立goldengate需要的使用者
create user goldengate identified by oracle; grant resource, connect, dba to goldengate;
備庫上
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
解壓縮ogg安裝包,建立目錄
mkdir trails ./ggsci CREATE SUBDIRS
建立mgr配置檔案
edit param mgr Port 7809 userid goldengate , password oracle DYNAMICPORTLIST 9101-9356
在standby備庫上只需要配置alo模式的抽取,因為只測試抽取程序,也不需要設定任何檢查點
ADD EXTRACT t1,TRANLOG, EXTSEQNO 746, EXTRBA 0 edit param t1 extract t1 USERID goldengate, PASSWORD oracle DISCARDFILE t1dsc,APPEND,MEGABYTES 50 TRANLOGOPTIONS altarchivelogdest /home/oracle/arch TRANLOGOPTIONS ARCHIVEDLOGONLY TRANLOGOPTIONS NOCOMPLETEARCHIVEDLOGONLY FORMATSQL EXTTRAIL ./trails/t1 TABLE oggtest.*; ADD EXTTRAIL ./trails/t1 EXTRACT T1
這裡的EXTSEQNO 746是我們測試環境裡的歸檔日誌號
都配置完成後start相應程序
主庫上測試做insert和update操作
create table oggtest.ogg(a int constraint key1 primary key,b varchar2(100),c varchar2(100),d date default sysdate); insert into oggtest.ogg(a,b,c,d) values(1,1,1,sysdate); insert into oggtest.ogg(a,b,c,d) values(2,2,2,sysdate); insert into oggtest.ogg(a,b,c,d) values(3,3,3,sysdate); commit; insert into oggtest.ogg(a,b,c,d) values(4,4,4,sysdate); insert into oggtest.ogg(a,b,c,d) values(5,5,5,sysdate); commit; update oggtest.ogg set b=2 where a=5; commit;
然後我們在備庫./trails/t1000000檔案裡就可以看到
B,2015-02-24:14:53:05.000000,1424760785,749, INSERT INTO OGGTEST.OGG (A,B,C,D) VALUES ('1','1','1','2015-02-24:14:53:05'); INSERT INTO OGGTEST.OGG (A,B,C,D) VALUES ('2','2','2','2015-02-24:14:53:05'); INSERT INTO OGGTEST.OGG (A,B,C,D) VALUES ('3','3','3','2015-02-24:14:53:05'); C, B,2015-02-24:14:53:06.000000,1424760786,749, INSERT INTO OGGTEST.OGG (A,B,C,D) VALUES ('4','4','4','2015-02-24:14:53:05'); INSERT INTO OGGTEST.OGG (A,B,C,D) VALUES ('5','5','5','2015-02-24:14:53:05'); C, B,2015-02-24:14:53:49.000000,1424760829,750, UPDATE OGGTEST.OGG SET B='2' WHERE A='5'; C,
什麼時間點,對各個表做了哪些操作就可以很容易的顯示出來,
平時這個在備庫上的ogg可以不使用,在特定時候可以手工配置需要檢查抽取的歸檔
手工調整新的歸檔日誌去抽取
alter EXTRACT t1,TRANLOG, EXTSEQNO 754, EXTRBA 0
ADD EXTTRAIL ./trails/t1 EXTRACT T1
然後start t1讓其執行再去日誌記錄裡檢查,如果有新增其他使用者下的表要監控修改引數檔案即可
比如增加一個表ogg2.test2015的抽取
在t1的引數檔案最後增加一行
TABLE ogg2.test2015;
然後輸出日誌裡就可以看到
B,2015-02-24:15:04:45.000000,1424761485,755, INSERT INTO OGG2.TEST2015 (A,B,C,D) VALUES ('1','1','1','2015-02-24:15:04:45'); C, B,2015-02-24:15:04:46.000000,1424761486,755, UPDATE OGG2.TEST2015 SET B='2' WHERE A='1';
這樣可以快速定位做操作的sql用來做很多事情。
2.通過goldengate生成平面檔案用於資料交換
很多時候我們在不同系統或者db之間交換資料都會用到ETL,比如銀行的總行和下面支行之間是用etl抽取出當日資料變化然後輸出文字檔案壓縮後下發,支行再利用etl工具做資料匯入。oracle的資料匯入hadoop則可以選擇sqoop這樣的產品。
但是我們知道etl做增量抽取往往都是使用時間戳,包括sqoop也是如此,這樣可能會對原始表有一定的修改要求。
而基於oracle日誌抽取的goldengate可以很方便的做平面檔案輸出到HDFS,甚至是直接使用java輸出到hive裡。
這裡我們介紹一下goldengate生產平面檔案。
整個結構圖如上所示,環境為oracle11.2.2.8+goldengate11.2.1.20+GOLDENGATE ADAPTERS V11.2.1.0.1:
和普通的goldengate部署源和目標都是goldengate不同,源端部署goldengate,目標端部署的是GOLDENGATE ADAPTERS
整個配置過程大家可以參考一下官方手冊,主要注意以下幾點:
1.defgen檔案需要在源端生成然後拷貝到目標端,每次表變化需要重新生成def檔案
2.需要通過配置引數檔案控制平面檔案的生成和分離
3.如果需求是生成表裡所有資料的平面檔案,需要單獨對錶所有列做trandata,例如add trandata oggtest.ogg, cols(b,c,d) 這裡主鍵之外的列是b、c、d ,這樣的話如果列太多可能會是問題(對早期版本的OGG來說)
4.每個平面檔案的大小需要通過內部引數和外部shell做整合,特別是放到hadoop裡的時候,因為過多的小平面檔案會浪費hadoop的namenode的記憶體,對效能上也沒用好處
具體的配置大家可以參考官方文件,我們簡要說明一下實現的效果:
源庫上增加
create table oggtest.ogg2(a int constraint key2 primary key,b varchar2(100),c varchar2(100),d date default sysdate);
源庫OGG裡執行
dblogin userid goldengate, password oracle add trandata oggtest.ogg2, cols(b,c,d)
在源庫上更新表
insert into oggtest.ogg2(a,b,c,d) values(8,8,8,sysdate); insert into oggtest.ogg2(a,b,c,d) values(9,9,9,sysdate); insert into oggtest.ogg(a,b,c,d) values(1,1,1,sysdate); commit; update oggtest.ogg2 set b=9 where a=8; commit;
目標庫上可以看到
[[email protected] dirout]$ more pump_OGGTEST_OGG2_2015-02-24_21-41-25_00000_data.dsv.temp I|8|8|8|2015-02-24:21:41:19 I|9|9|9|2015-02-24:21:41:19 U|8|9|8|2015-02-24:21:41:19 [[email protected] dirout]$ more pump_OGGTEST_OGG_2015-02-24_21-41-25_00001_data.dsv.temp I|1|1|1|2015-02-24:21:41:19
可以看到OGG自動將平面檔案打出來,I表示Insert,U表示update,甚至可以設定delete
不同的表OGG也可以自動分離到不同的檔案
通過goldengate我們可以按照各自需求來生成不同的平面檔案,比如生成帶insert和update的檔案用於異構資料庫匯入操作或者不同oracle之間交換資料
生成只包含行資料的平面檔案直接用於hadoop處理,或者oracle做merge匯入等等,甚至還可以配置包含update前後值的檔案。
最後還需要說一點這個操作同樣適用於處理其他資料庫比如db2,mysql,sybase。
免費領取驗證碼、內容安全、簡訊傳送、直播點播體驗包及雲伺服器等套餐
更多網易技術、產品、運營經驗分享請點選。
相關文章:
【推薦】 瀏覽器外掛及好用的小工具
【推薦】 深入淺出“跨檢視粒度計算”--1、理解資料的粒度