|
實(shí)驗(yàn)一. 表結(jié)構(gòu)不一致情況下的使用COLMAP進(jìn)行結(jié)構(gòu)映射 環(huán)境準(zhǔn)備: 實(shí)驗(yàn)環(huán)境簡(jiǎn)單化一些,本機(jī)模擬源-目標(biāo)端,無(wú)需DATA PUMP進(jìn)程
GGSCI (tianbaobao.ht8888.ht3 as ogg@dbsource) 30> view param ext2
extract ext2 SETENV (ORACLE_SID="dbsource") SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) USERID ogg, PASSWORD ogg EXTTRAIL ./dirdat/le WILDCARDRESOLVE DYNAMIC DYNAMICRESOLUTION TRANLOGOPTIONS DBLOGREADER TABLE scott.*;
GGSCI (tianbaobao.ht8888.ht3 as ogg@dbsource) 31> view param rep2
REPLICAT rep2 SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) USERID ogg, PASSWORD ogg REPERROR DEFAULT, ABEND ASSUMETARGETDEFS DISCARDFILE ./dirrpt/rep2.dsc, APPEND, MEGABYTES 100 WILDCARDRESOLVE DYNAMIC DYNAMICRESOLUTION MAP scott.*, TARGET tianbaobao.*;
GGSCI (tianbaobao.ht8888.ht3 as ogg@dbsource) 32> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING EXTRACT RUNNING EXT2 00:00:00 00:00:04 REPLICAT RUNNING REP2 00:00:00 00:00:02
DEMO(一): Step1. 首先源和目標(biāo)創(chuàng)建測(cè)試表: SYS@SQL> create table scott.tb02(col1 int, col2 int, col3 int);
Table created.
SYS@SQL> create table tianbaobao.tb02(col1 int, col3 int, col2 int);
Table created.
SQL> Step2. 參數(shù)不做任何調(diào)整后,源插入記錄,并測(cè)試。 SCOTT@SQL> insert into scott.tb02 values(1,2,3);
1 row created.
SCOTT@SQL> commit;
Commit complete.
SCOTT@SQL>
TIANBAOBAO@SQL> select * from tb02;
COL1 COL3 COL2 ---------- ---------- ---------- 1 2 3
TIANBAOBAO@SQL> 這里發(fā)現(xiàn)已經(jīng)MAP錯(cuò)誤了,說明是按照列的順序來(lái)的,而不是按照列名來(lái)對(duì)應(yīng)的。
Step3. 嘗試生成定義文件處理。
GGSCI (tianbaobao.ht8888.ht3 as ogg@dbsource) 33> edit param defgen
GGSCI (tianbaobao.ht8888.ht3) 34> view param defgen
DEFSFILE ./dirdef/test.def USERID ogg, PASSWORD ogg TABLE SCOTT.tb02;
GGSCI (tianbaobao.ht8888.ht3 as ogg@dbsource) 35> quit [oracle@tianbaobao ogg]$ ./defgen paramfile dirprm/defgen.prm
*********************************************************************** Oracle GoldenGate Table Definition Generator for Oracle Version 12.1.2.1.0 OGGCORE_12.1.2.1.0_PLATFORMS_140727.2135.1 Linux, x64, 64bit (optimized), Oracle 11g on Aug 7 2014 05:45:39 Copyright (C) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
Starting at 2015-02-23 14:41:07 ***********************************************************************
Operating System Version: Linux Version #1 SMP Tue Jan 29 11:47:41 EST 2013, Release 2.6.32-358.el6.x86_64 Node: tianbaobao.ht8888.ht3 Machine: x86_64 soft limit hard limit Address Space Size : unlimited unlimited Heap Size : unlimited unlimited File Size : unlimited unlimited CPU Time : unlimited unlimited
Process id: 6440
*********************************************************************** ** Running with the following parameters ** *********************************************************************** DEFSFILE ./dirdef/test.def USERID ogg, PASSWORD *** TABLE SCOTT.tb02; Retrieving definition for SCOTT.TB02.
2015-02-23 14:41:10 WARNING OGG-06439 No unique key is defined for table TB02. All viable columns will be used to represent the key, but may not guarantee
uniqueness. KEYCOLS may be used to define the key.
Definitions generated for 1 table in ./dirdef/test.def.
生成test.def文件,ftp傳輸?shù)侥繕?biāo)的dirdef文件目錄下。
編輯REP2參數(shù)文件后,重啟REP2進(jìn)程。 GGSCI (tianbaobao.ht8888.ht3) 6> edit param rep2
GGSCI (tianbaobao.ht8888.ht3) 7> view param rep2
REPLICAT rep2 SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) USERID ogg, PASSWORD ogg REPERROR DEFAULT, ABEND --ASSUMETARGETDEFS SOURCEDEFS ./dirdef/test.def DISCARDFILE ./dirrpt/rep2.dsc, APPEND, MEGABYTES 100 WILDCARDRESOLVE DYNAMIC DYNAMICRESOLUTION MAP scott.*, TARGET tianbaobao.*;
GGSCI (tianbaobao.ht8888.ht3) 8> stop rep2
Sending STOP request to REPLICAT REP2 ... Request processed.
GGSCI (tianbaobao.ht8888.ht3) 9> start rep2
Sending START request to MANAGER ... REPLICAT REP2 starting
再次插入記錄,并驗(yàn)證,結(jié)果一切OK。方法可行。 SCOTT@SQL> insert into scott.tb02 values(2,3,4);
1 row created.
SCOTT@SQL> commit;
Commit complete.
SCOTT@SQL>
TIANBAOBAO@SQL> select * from tb02;
COL1 COL3 COL2 ---------- ---------- ---------- 1 2 3 2 4 3
TIANBAOBAO@SQL>
DEMO(二): 當(dāng)然也可以使用COLMAP字句關(guān)聯(lián)。 Step1. 編輯rep2參數(shù)文件,不適用定義文件。 GGSCI (tianbaobao.ht8888.ht3) 153> view param rep2
REPLICAT rep2 SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) USERID ogg, PASSWORD ogg REPERROR DEFAULT, ABEND ASSUMETARGETDEFS DISCARDFILE ./dirrpt/rep2.dsc, APPEND, MEGABYTES 100 WILDCARDRESOLVE DYNAMIC DYNAMICRESOLUTION MAP SCOTT.TB02, TARGET TIANBAOBAO.TB02, colmap(usedefaults, col2=col3, col3=col2);
GGSCI (tianbaobao.ht8888.ht3) 154> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING EXTRACT RUNNING EXT2 00:00:00 00:00:06 REPLICAT RUNNING REP2 00:00:00 00:00:04
Step2. 測(cè)試1: SCOTT@SQL> insert into scott.tb02 values(3,4,5);
1 row created.
SCOTT@SQL> commit;
Commit complete.
SCOTT@SQL>
TIANBAOBAO@SQL> select * from tb02;
COL1 COL3 COL2 ---------- ---------- ---------- 1 2 3 2 4 3 3 5 4
TIANBAOBAO@SQL> Step3. 測(cè)試2: SCOTT@SQL> insert into tb02(col1,col2,col3) values(5,6,7);
1 row created.
SCOTT@SQL> commit;
Commit complete.
SCOTT@SQL>
TIANBAOBAO@SQL> select * from tb02;
COL1 COL3 COL2 ---------- ---------- ---------- 1 2 3 2 3 4 3 5 4 5 7 6
TIANBAOBAO@SQL>
結(jié)論:colmap正確的映射或者配置定義文件(此時(shí)不需要colmap都可以實(shí)現(xiàn),但是很多時(shí)候如果結(jié)構(gòu)不一致時(shí),還是需要的定義文件的)。 實(shí)際生產(chǎn)上,如果要配置colmap,一定要注意進(jìn)行測(cè)試,確保正確的結(jié)果再上線。
實(shí)驗(yàn)二. 模擬SQLExec測(cè)試,數(shù)據(jù)轉(zhuǎn)換 數(shù)據(jù)轉(zhuǎn)換 – 使用SQLEXEC SQLEXEC:在OGG中調(diào)用SQL查詢語(yǔ)句或者存儲(chǔ)過程
需求:需要實(shí)現(xiàn)源端數(shù)據(jù)庫(kù)中主從兩張表到目標(biāo)庫(kù)的篩選復(fù)制 具體描述:源庫(kù)中有主從關(guān)系的兩張表,其中主表中有一個(gè)篩選字段,而子表中沒有篩選字段,主表和子表都需要滿足主表的篩選條件才能向目標(biāo)數(shù)據(jù)庫(kù)中復(fù)制。 表結(jié)構(gòu)(源庫(kù)和目標(biāo)庫(kù)中主從表定義一致): 主表:create table scott.province(PROVINCE_ID number primary key,PROVINCE_NAME varchar(10)); 主表字段說明:PROVINCE_ID 省份編號(hào);PROVINCE_NAME 省份名稱 子表:create table scott.city(CITY_ID number primary key,CITY_NAME varchar2(10),PROVINCE_ID number references scott.province(PROVINCE_ID)); 子表字段說明:CITY_ID 城市編號(hào);CITY_NAME 城市名稱 -- PROVINCE_ID 城市所在省的編號(hào),引用自主表對(duì)應(yīng)列 復(fù)制篩選說明:主表中PROVINCE_NAME是篩選字段,比如:只有省份名稱是“江蘇”的才復(fù)制到目標(biāo)表中;子表沒有篩選字段,但是同樣要符合主表的篩選要求,比如:只有在“江蘇”省內(nèi)
的城市才可以復(fù)制到目標(biāo)表。這樣的復(fù)制要求可能會(huì)用在基于篩選條件的一對(duì)多的數(shù)據(jù)分發(fā) 的復(fù)制環(huán)境中。
分析: (1)主表是有篩選字段的,所以直接調(diào)用Goldengate內(nèi)置的STREQ函數(shù)配合FILTER就可以實(shí)現(xiàn)篩選了; (2)子表沒有PROVINCE_NAME這個(gè)字段,所以只有通過PROVINCE_ID來(lái)回查出該條記錄在主表中對(duì)應(yīng)的PROVINCE_NAME值,然后使用STREQ函數(shù)配合FILTER子句來(lái)進(jìn)行過濾。這里就需要在
goldengate中調(diào)用自己寫的SQL語(yǔ)句或存儲(chǔ)過程來(lái)實(shí)現(xiàn),即SQLEXEC來(lái)實(shí)現(xiàn)。 (3)SQLEXEC可以在extract進(jìn)程(包括pump進(jìn)程)和replicat進(jìn)程都可以使用,在本例中因?yàn)樵谠炊司鸵M(jìn)行篩選,需要配置extract進(jìn)程參數(shù),同時(shí)不影響源端日志抽取的效率,所以決定
配置源端的pump進(jìn)程來(lái)實(shí)現(xiàn)。
DEMO--SQLExec數(shù)據(jù)轉(zhuǎn)換 Step1. 源-目標(biāo)創(chuàng)建測(cè)試表 SCOTT@SQL> create table province(PROVINCE_ID number primary key,PROVINCE_NAME varchar(10));
Table created.
SCOTT@SQL> create table city(CITY_ID number primary key,CITY_NAME varchar2(10),PROVINCE_ID number references province(PROVINCE_ID));
Table created.
TIANBAOBAO@SQL> create table province(PROVINCE_ID number primary key,PROVINCE_NAME varchar(10));
Table created.
TIANBAOBAO@SQL> create table city(CITY_ID number primary key,CITY_NAME varchar2(10),PROVINCE_ID number references province(PROVINCE_ID));
Table created.
TIANBAOBAO@SQL>
Step2. 配置進(jìn)程參數(shù),并啟動(dòng) GGSCI (tianbaobao.ht8888.ht3) 68> view param ext2
extract ext2 SETENV (ORACLE_SID="dbsource") SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) USERID ogg, PASSWORD ogg EXTTRAIL ./dirdat/le WILDCARDRESOLVE DYNAMIC DYNAMICRESOLUTION TRANLOGOPTIONS DBLOGREADER TABLE scott.province; TABLE scott.city;
GGSCI (tianbaobao.ht8888.ht3) 69> view param pmp2
extract pmp2 SETENV (ORACLE_SID="dbsource") SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) USERID ogg, PASSWORD ogg --PASSTHRU RMTHOST 192.168.0.77, MGRPORT 7809 EXTTRAIL ./dirdat/el WILDCARDRESOLVE DYNAMIC DYNAMICRESOLUTION TRANLOGOPTIONS DBLOGREADER TABLE scott.province, FILTER (@STREQ (PROVINCE_NAME, "LIAONING")); TABLE scott.city, & SQLEXEC ( ID lookup1 , & QUERY "select a.PROVINCE_NAME from scott.province a,scott.city b where a.PROVINCE_ID=b.PROVINCE_ID and b.CITY_ID =:param1", & PARAMS ( param1 = CITY_ID ), BEFOREFILTER), & filter (@STREQ (@GETVAL (lookup1.PROVINCE_NAME), "LIAONING") );
GGSCI (tianbaobao.ht8888.ht3) 2> view param rep2
REPLICAT rep2 SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) USERID ogg, PASSWORD ogg REPERROR DEFAULT, ABEND ASSUMETARGETDEFS DISCARDFILE ./dirrpt/rep2.dsc, APPEND, MEGABYTES 100 WILDCARDRESOLVE DYNAMIC DYNAMICRESOLUTION MAP SCOTT.PROVINCE, TARGET tianbaobao.PROVINCE; MAP SCOTT.CITY, TARGET tianbaobao.CITY;
GGSCI (tianbaobao.ht8888.ht3) 10> start ext2
Sending START request to MANAGER ... EXTRACT EXT2 starting
GGSCI (tianbaobao.ht8888.ht3) 10> start pmp2
Sending START request to MANAGER ... EXTRACT PMP2 starting
GGSCI (tianbaobao.ht8888.ht3) 11> start rep2
Sending START request to MANAGER ... REPLICAT REP2 starting
GGSCI (tianbaobao.ht8888.ht3) 12> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING EXTRACT RUNNING EXT2 00:00:00 00:00:01 REPLICAT RUNNING REP2 00:00:00 00:00:08 REPLICAT RUNNING PMP2 00:00:00 00:00:01
說明: (1)因?yàn)樵趐ump進(jìn)程調(diào)用了FILTER字句,所以注釋掉PASSTHRU; (2)因?yàn)樵趐ump進(jìn)程中使用了SQLEXEC來(lái)回庫(kù)查詢了,所以在pump進(jìn)程中需要配置數(shù)據(jù)庫(kù)的用戶名和密碼; (3)SQLEXEC中調(diào)用了sql語(yǔ)句來(lái)進(jìn)行回庫(kù)查詢,在SQLEXEC有四個(gè)部分的參數(shù): ?ID : 為后續(xù)的查詢定義一個(gè)邏輯名稱,使用這個(gè)邏輯名稱來(lái)獲取sql查詢語(yǔ)句返回的列值,比如:后續(xù)sql查詢的是PROVINCE_NAME,我們就在FILTER語(yǔ)句中調(diào)用
lookup1.PROVINCE_NAME來(lái)獲取返回的值; ?QUERY 部分: 就是需要調(diào)用的sql查詢語(yǔ)句,這里根據(jù)具體要求來(lái)寫; ?PARAMS部分: 前面sql查詢部分的輸入?yún)?shù),如果沒有傳入?yún)?shù),必須寫成NOPARAMS; ?BEFOREFILTER部分:是本例中用到的值,在第四部分的參數(shù)是可選參數(shù),可以配置的值有很多,比如:BEFOREFILTER、AFTERFILTER、ALLPARAMS、DBOP、EXEC…等等,我們這里配置
BEFOREFILTER是為了在確保在FILTER之前執(zhí)行sql查詢語(yǔ)句,這樣查詢的結(jié)果才可以在FILTER中使用。
在goldengate官方手冊(cè)中,SQLEXEC調(diào)用sql查詢語(yǔ)句的語(yǔ)法: SQLEXEC ( ID , QUERY “” {, PARAMS | NOPARAMS} [, ] [, ...] ) 正好對(duì)應(yīng)于我們這個(gè)例子中的四個(gè)部分,其中option部分是可選項(xiàng)。
Step3. 測(cè)試數(shù)據(jù)轉(zhuǎn)換 源端執(zhí)行了以下sql: SCOTT@SQL> insert into scott.province values(1,'LIAONING'); SCOTT@SQL> insert into scott.province values(2,'ZHEJIANG'); SCOTT@SQL> commit; SCOTT@SQL> insert into scott.city values(1,'HANGZHOU',2); SCOTT@SQL> insert into scott.city values(2,'DALIAN',1); SCOTT@SQL> insert into scott.city values(3,'SHENYANG',1); SCOTT@SQL> insert into scott.city values(4,'BENXI',1); SCOTT@SQL> commit;
源端表檢查: SCOTT@SQL> select * from province;
PROVINCE_ID PROVINCE_N ----------- ---------- 1 LIAONING 2 ZHEJIANG
SCOTT@SQL> select * from city;
CITY_ID CITY_NAME PROVINCE_ID ---------- ---------- ----------- 2 DALIAN 1 3 SHENYANG 1 1 HANGZHOU 2 4 BENXI 1
SCOTT@SQL>
目標(biāo)表檢查: TIANBAOBAO@SQL> select * from province;
PROVINCE_ID PROVINCE_N ----------- ---------- 1 LIAONING
TIANBAOBAO@SQL> select * from city;
CITY_ID CITY_NAME PROVINCE_ID ---------- ---------- ----------- 2 DALIAN 1 3 SHENYANG 1 4 BENXI 1
這樣目標(biāo)DB上就只有和遼寧省相關(guān)的記錄了。
3、模擬審計(jì)測(cè)試 數(shù)據(jù)轉(zhuǎn)換 – 使用@GETENV和@TOKEN 需求:在目標(biāo)數(shù)據(jù)庫(kù)記錄源端的數(shù)據(jù)操作記錄,實(shí)現(xiàn)審計(jì)功能 具體描述:在數(shù)據(jù)復(fù)制過程中,目標(biāo)端上需要實(shí)現(xiàn)兩個(gè)需求 (1)目標(biāo)表和源表相比多一個(gè)列,這個(gè)列用來(lái)表示源表記錄更新的時(shí)間戳; (2)目標(biāo)上單獨(dú)有一張審計(jì)表,用于表上的操作信息的審計(jì),比如:源端提交時(shí)間、目標(biāo)端提交時(shí)間、操作類型、操作用戶等
DEMO---審計(jì)測(cè)試 Step1. 前期準(zhǔn)備: 源表: SYS@SQL> create table scott.TB11(id number primary key,name varchar(10));
Table created.
SYS@SQL>
目標(biāo)表: SYS@SQL> create table tianbaobao.TB11(id number primary key,name varchar(10), src_time date);
Table created.
SYS@SQL> create table tianbaobao.TB11_audit(id number,name varchar(10),src_time date, trg_time date,op_type varchar2(20),src_user varchar2(10));
Table created.
SYS@SQL>
GGSCI (tianbaobao.ht8888.ht3) 1> view param ext2
extract ext2 SETENV (ORACLE_SID="dbsource") SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) USERID ogg, PASSWORD ogg EXTTRAIL ./dirdat/le WILDCARDRESOLVE DYNAMIC DYNAMICRESOLUTION TRANLOGOPTIONS DBLOGREADER TABLE SCOTT.TB11, TOKENS (TKN-USERNAME = @GETENV("TRANSACTION", "USERNAME"));
說明:在源端extract進(jìn)程中使用TOKEN在trail文件頭部用戶TOKEN部分定義了一個(gè)變量:TKN-USERNAME,這個(gè)變量的值是通過@GETENV來(lái)獲得當(dāng)前Goldengate運(yùn)行環(huán)境中和數(shù)據(jù)庫(kù)事務(wù)相關(guān)源端數(shù)據(jù)庫(kù)提交事務(wù)的用戶信息
GGSCI (tianbaobao.ht8888.ht3) 2> view param rep2
REPLICAT rep2 SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) USERID ogg, PASSWORD ogg REPERROR DEFAULT, ABEND ASSUMETARGETDEFS DISCARDFILE ./dirrpt/rep2.dsc, APPEND, MEGABYTES 100 WILDCARDRESOLVE DYNAMIC DYNAMICRESOLUTION MAP SCOTT.TB11, TARGET tianbaobao.TB11, & COLMAP (USEDEFAULTS, & SRC_TIME = @GETENV("GGHEADER","COMMITTIMESTAMP"));
說明:此時(shí)目標(biāo)有2個(gè)replicat進(jìn)程,這兩個(gè)進(jìn)程讀的trail文件是同一份,這里是第一個(gè)進(jìn)程:ggs_rep1,這個(gè)進(jìn)程負(fù)責(zé)正常的數(shù)據(jù)復(fù)制,即從源端的TB11表復(fù)制到目標(biāo)的TB11表,只不過在
目標(biāo)的TB11表上多了一個(gè)字段SRC_TIME(記錄源端事務(wù)提交的時(shí)間),因?yàn)槎嗔艘粋€(gè)字段,這里就要調(diào)用COLMAP來(lái)做映射了,在COLMAP字句中使用@GETENV函數(shù),該函數(shù)配置的參數(shù)是GGHEADER
類別下的COMMITTIMESTAMP這個(gè)屬性,而這個(gè)屬性就是用來(lái)獲取時(shí)間戳,即記錄事務(wù)提交的時(shí)間,格式為YYY-MM-DD HH:MI:SS.FFFFFF。
GGSCI (tianbaobao.ht8888.ht3) 3> view param rep3
REPLICAT rep3 SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) USERID ogg, PASSWORD ogg REPERROR DEFAULT, ABEND ASSUMETARGETDEFS INSERTALLRECORDS DISCARDFILE ./dirrpt/rep3.dsc, APPEND, MEGABYTES 100 WILDCARDRESOLVE DYNAMIC DYNAMICRESOLUTION MAP SCOTT.TB11, TARGET tianbaobao.TB11_AUDIT, COLMAP (USEDEFAULTS, SRC_TIME = @GETENV("GGHEADER","COMMITTIMESTAMP"), TRG_TIME = @DATENOW (), OP_TYPE = @GETENV("GGHEADER", "OPTYPE"), SRC_USER = @TOKEN ("TKN-USERNAME"));
說明:這是目標(biāo)第二個(gè)replicat進(jìn)程,這個(gè)進(jìn)程負(fù)責(zé)審計(jì)表的復(fù)制,即從源端的TB11表復(fù)制到目標(biāo)審計(jì)表TB11_AUDIT,前面也看到需求中的內(nèi)容了,審計(jì)表多了4個(gè)字段,分別用于記錄源端每
個(gè)事務(wù)操作的時(shí)間、目標(biāo)端提交的時(shí)間、源端的操作類型、源端數(shù)據(jù)庫(kù)用戶名。該進(jìn)程參數(shù)文件中使用了一個(gè)非常重要的參數(shù):INSERTALLRECORDS ,這個(gè)參數(shù)會(huì)讓復(fù)制進(jìn)程插入對(duì)于目標(biāo)端一
條記錄所有的變化修改,即能起到審計(jì)的作用。同時(shí)在這個(gè)進(jìn)程中,使用@GETENV函數(shù)來(lái)獲取goldengate運(yùn)行環(huán)境中的GGHEADER下的COMMITTIMESTAMP(源端時(shí)間)和OPTYPE(操作類型);使
用@DATENOW ()來(lái)獲取目標(biāo)端提交時(shí)間;使用@TOKEN函數(shù)來(lái)獲取源端定義在trail文件頭部定義的用戶令牌部分的變量TKN-USERNAME的值,即源端的數(shù)據(jù)庫(kù)用戶信息。
GGSCI (tianbaobao.ht8888.ht3) 4> start ext2
Sending START request to MANAGER ... EXTRACT EXT2 starting
GGSCI (tianbaobao.ht8888.ht3) 5> start rep2
Sending START request to MANAGER ... REPLICAT REP2 starting
GGSCI (tianbaobao.ht8888.ht3) 6> start rep3
Sending START request to MANAGER ... REPLICAT REP3 starting
GGSCI (tianbaobao.ht8888.ht3) 7> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING EXTRACT RUNNING EXT2 00:01:55 00:00:07 REPLICAT RUNNING REP2 00:00:00 00:00:05 REPLICAT RUNNING REP3 00:00:00 00:00:02
說明:這是目標(biāo)第二個(gè)replicat進(jìn)程,這個(gè)進(jìn)程負(fù)責(zé)審計(jì)表的復(fù)制,即從源端的TB11表復(fù)制到目標(biāo)審計(jì)表TB11_AUDIT,前面也看到需求中的內(nèi)容了,審計(jì)表多了4個(gè)字段,分別用于記錄源端每
個(gè)事務(wù)操作的時(shí)間、目標(biāo)端提交的時(shí)間、源端的操作類型、源端數(shù)據(jù)庫(kù)用戶名。該進(jìn)程參數(shù)文件中使用了一個(gè)非常重要的參數(shù):INSERTALLRECORDS ,這個(gè)參數(shù)會(huì)讓復(fù)制進(jìn)程插入對(duì)于目標(biāo)端一
條記錄所有的變化修改,即能起到審計(jì)的作用。同時(shí)在這個(gè)進(jìn)程中,使用@GETENV函數(shù)來(lái)獲取goldengate運(yùn)行環(huán)境中的GGHEADER下的COMMITTIMESTAMP(源端時(shí)間)和OPTYPE(操作類型);使
用@DATENOW ()來(lái)獲取目標(biāo)端提交時(shí)間;使用@TOKEN函數(shù)來(lái)獲取源端定義在trail文件頭部定義的用戶令牌部分的變量TKN-USERNAME的值,即源端的數(shù)據(jù)庫(kù)用戶信息。
Step2. 測(cè)試審計(jì): 源端使用SCOTT用戶執(zhí)行了以下sql: SCOTT@SQL> insert into scott.TB11 values(1,'a'); SCOTT@SQL> commit; SCOTT@SQL> insert into scott.TB11 values(2,'a'); SCOTT@SQL> commit; SCOTT@SQL> update scott.TB11 set name='c' where id=2; SCOTT@SQL> commit; SCOTT@SQL> delete from scott.TB11 where id=2; SCOTT@SQL> commit; SCOTT@SQL> update scott.TB11 set id=2 where id=1; SCOTT@SQL> commit; 源端使用SYS用戶執(zhí)行了以下sql: SYS@SQL> insert into scott.TB11 values(3,'c'); SYS@SQL> commit;
目標(biāo)端檢查 TIANBAOBAO@SQL> select * from tb11;
ID NAME SRC_TIME ---------- ---------- ------------------- 2 a 2015-02-23 18:50:26 3 c 2015-02-23 18:57:26
TIANBAOBAO@SQL> select * from tb11_audit;
ID NAME SRC_TIME TRG_TIME OP_TYPE SRC_USER ---------- ---------- ------------------- ------------------- -------------------- ---------- 1 a 2015-02-23 18:33:50 2015-02-23 18:34:45 INSERT SCOTT 2 a 2015-02-23 18:42:06 2015-02-23 18:42:10 INSERT SCOTT 2 c 2015-02-23 18:47:11 2015-02-23 18:49:41 SQL COMPUPDATE SCOTT 2 2015-02-23 18:50:21 2015-02-23 18:50:25 DELETE SCOTT 2 2015-02-23 18:50:26 2015-02-23 18:50:29 PK UPDATE SCOTT 3 c 2015-02-23 18:57:26 2015-02-23 18:57:28 INSERT SYS
說明:目標(biāo)端TB11表中的數(shù)據(jù)和源端保持一致,只是多了一列表示最后事務(wù)提交的時(shí)間;目標(biāo)表TB11_AUDIT負(fù)責(zé)將源表所有的操作審計(jì)下來(lái),其中最后兩行name字段沒有填充值進(jìn)來(lái),是因?yàn)?/P>
TB11表上有主鍵,對(duì)于刪除操作和鍵值更新的操作時(shí),在日志中只有鍵值列相關(guān)的信息,如果需要顯示其他字段信息,就需要把這些字段都加入附加日志中去。同時(shí)OP_TYPE這列中和update操
作相關(guān)的有兩個(gè)值“SQL COMPUPDATE”和“PK UPDATE”,分別表示了非鍵值列的更新和鍵值列的更新。
總結(jié):更多的參數(shù)配置,和更多的功能體現(xiàn),詳見手冊(cè)。
|