此文已由作者趙欣授權網易雲社區發布。
歡迎訪問網易雲社區,了解更多網易技術產品運營經驗。
自從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;
目標庫上可以看到
[oracle@oel5 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 [oracle@oel5 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。
免費領取驗證碼、內容安全、短信發送、直播點播體驗包及雲服務器等套餐
更多網易技術、產品、運營經驗分享請點擊。
相關文章:
【推薦】 6月第5周業務風控關注 | 《網絡安全等級保護條例(征求意見稿)》本周正式發布