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;

目標庫上可以看到

[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周業務風控關注 | 《網絡安全等級保護條例(征求意見稿)》本周正式發布


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM