1. 程式人生 > >oracle goldengate的兩種用法

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、理解資料的粒度