概述
GoldenGate簡(jiǎn)介
GoldenGate是Oracle公司的一款數(shù)據(jù)庫(kù)中間件,它基于數(shù)據(jù)庫(kù)的二進(jìn)制日志以及事務(wù)提交,實(shí)現(xiàn)了數(shù)據(jù)庫(kù)集群之間的數(shù)據(jù)遷移,主要用于數(shù)據(jù)庫(kù)之間的同步和備份。
GoldenGate在組件中的作用
我們用GoldenGate來(lái)實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)修改的采集,以及將這些變化在遠(yuǎn)端輸出為可供程序讀取的文本文件。
結(jié)構(gòu)簡(jiǎn)介
GoldenGate分為兩端
源端作為數(shù)據(jù)源,負(fù)責(zé)從數(shù)據(jù)庫(kù)采集數(shù)據(jù),生成Trails文件,并發(fā)送到目標(biāo)端;
目標(biāo)端作為終點(diǎn),負(fù)責(zé)處理從源端傳來(lái)的Trails文件,并將這些文件轉(zhuǎn)換為文本文件;
結(jié)構(gòu)如圖:
源端
源端上裝有Oracle和GoldenGate,GoldenGate將Oracle的數(shù)據(jù)采集并以事務(wù)為單位,寫(xiě)入本地Trails文件,并在遠(yuǎn)程的GoldenGate上生成新的Trails文件(目前只有DML操作)。相關(guān)組件如下:
manager
GoldenGate的監(jiān)控進(jìn)程,負(fù)責(zé)控制GoldenGate的其他組件
extract
從數(shù)據(jù)庫(kù)的二進(jìn)制日志中抽取變化到Trails文件
pump
從源端的Trails文件里抽取信息并推送到目標(biāo)端的Trails文件
目標(biāo)端
目標(biāo)端上的GoldenGate將源端輸送過(guò)來(lái)的GoldenGate文件以特定的規(guī)則,轉(zhuǎn)換為特定格式的文本文件。相關(guān)組件如下:
manager
GoldenGate的監(jiān)控進(jìn)程,負(fù)責(zé)控制GoldenGate的其他組件
ffwriter
將本地的Trails文件讀取并轉(zhuǎn)換為文本文件
內(nèi)部組件
ggsci
GoldenGate的控制臺(tái),可以通過(guò)這個(gè)操作GoldenGate的附屬組件
defgen
用于生成srcdef文件,供目標(biāo)端的GoldenGate使用
logdump
用來(lái)解析Trails文件
環(huán)境配置
基本環(huán)境
源端的主機(jī)上需要裝有數(shù)據(jù)庫(kù),筆者使用的Oracle11g,安裝Oracle的過(guò)程就不再敘述
Oracle設(shè)置
00.開(kāi)啟歸檔模式
查看是否開(kāi)啟歸檔模式
SQL>archive log list
如果沒(méi)有開(kāi)啟,可以使用以下命令將其打開(kāi)
SQL>alter database archivelog
查看歸檔日志路徑
SQL> show parameter DB_RECOVERY_FILE_DEST
01.開(kāi)啟補(bǔ)充日志
查看是否開(kāi)啟補(bǔ)充日志
select supplemental_log_data_min from v$database;
如果沒(méi)有開(kāi)啟,可以用以下命令開(kāi)啟
alter database add supplement log data;
02.創(chuàng)建一個(gè)用于GoldenGate的賬戶(hù)
該賬戶(hù)需要有較高的權(quán)限
源端
00.解壓GoldenGate
推薦將安裝包解壓后的文件的用戶(hù)和用戶(hù)組修改為與oracle相同
chown -R orasusr01 ogg
chgrp -R orasusr ogg
01.初始化GGSCI
進(jìn)入GoldenGate的Home目錄
輸入命令,進(jìn)入ggsci
$ ./ggsci
進(jìn)入之后,輸入以下命令,創(chuàng)建相關(guān)目錄
GGSCI > CREATE SUBDIRS
用開(kāi)始創(chuàng)建的Oracle用戶(hù)登錄
GGSCI > DBLOGIN USERID goldengate, PASSWORD goldengate
添加需要被采集的表,筆者需要采集test001用戶(hù)下所有的表
GGSCI > add trandata test001.*
02.配置Manager
查看當(dāng)前所有進(jìn)程信息
GGSCI > info all
新建Manager的配置文件
GGSCI > edit params mgr
文件內(nèi)容如下
port 7999
啟動(dòng)mgr
GGSCI > START mgr
03.配置extract
新建extract的配置文件
EDIT PARAMS etc
配置文件ext.prm
EXTRACT ext
SETENV (ORACLE_SID = "sid")
SETENV (NLS_LANG = "AMERICAN_AMERICA.ZHS16GBK")
USERID userid, PASSWORD password
EXTTRAIL ./dirdat/la
dynamicresolution
table test001.*;
添加extract
ADD EXTRACT ext, TRANLOG, BEGIN NOW
并指定輸出文件
ADD? EXTTRAIL ./dirdat/la,EXTRACT ext
啟動(dòng)ext
START EXTRACT ext
可以使用命令查看啟動(dòng)情況,如果處于RUNNING狀態(tài),則啟動(dòng)成功
GGSCI > info all
Program? ? Status? ? ? Group? ? ? Lag at Chkpt? Time Since Chkpt
MANAGER? ? RUNNING
EXTRACT? ? RUNNING? ? EXT? ? ? ? 00:00:00? ? ? 00:00:09
如果有異常,可以查看GoldenGateHome下的ggserr.log文件進(jìn)行查看
03.配置pump
新建pump的配置文件
EDIT PARAMS pump
配置文件pump.prm
extract pump
passthru
rmthost 10.1.130.240, mgrport 7999
rmttrail ./dirdat/ra
dynamicresolution,nocompressupdates
table test001.*;
添加pump,并添加本地源文件
ADD EXTRACT pump, EXTTRAILSOURCE ./dirdat/la
添加pump的目標(biāo)文件
ADD RMTTRAIL ./dirdat/ra, EXTRACT pump
啟動(dòng)
START EXTRACT pump
03.生成表結(jié)構(gòu)的srcdef.def文件
目標(biāo)端需要靠srcdef.def文件來(lái)掌握表結(jié)構(gòu),從而進(jìn)行解析
配置flatfile.prm文件
DEFSFILE ./dirdef/srcdef.def
USERID goldengate,PASSWORD goldengate
TABLE test001.*;
生成srcdef.def文件
在GoldenGateHome目錄下運(yùn)行一下命令,運(yùn)行時(shí)確保dirdef目錄下沒(méi)有srcdef.def文件
./defgen PARAMFILE ./dirprm/flatfile.prm
將生成的srcdef.def放到目標(biāo)端的目錄下
目標(biāo)端
00.解壓壓縮包,并將調(diào)整其權(quán)限
01.將lib添加到根目錄
libnnz11.so
libclntsh.so.11.1
flatfilewriter.so
02.初始化ggsci
03.配置manager
新建配置文件
EDIT PARAMS MGR
配置文件內(nèi)容如下
port 7999
啟動(dòng)
START mgr
04.配置ffwriter
新建配置文件
EDIT PARAMS FFWRITER
配置文件ffwriter.prm
extract ffwriter
sourcedefs ./dirdef/srcdef.def
CUSEREXIT ./flatfilewriter.so CUSEREXIT PASSTHRU INCLUDEUPDATEBEFORES,PARAMS "./dirprm/ffwriter.properties"
table test001.*;
復(fù)制srcdef.def文件
復(fù)制ffwriter.properties文件
添加ffwriter并設(shè)定輸入路徑
ADD EXTRACT ffwriter, EXTTRAILSOURCE ./dirdat/ra
啟動(dòng)
START EXTRACT ffwriter
準(zhǔn)備
檢查系統(tǒng),確保源端和目標(biāo)端的GoldenGate各個(gè)進(jìn)程都在正確運(yùn)行
需要在兩端的GGSCI中輸入如下命令:
INFO ALL
如果修改了表,需要在源端重新生成srcdef.def文件,并重啟除了Manager之外的所有組件
文件格式說(shuō)明
文件標(biāo)題格式
前綴_用戶(hù)名_表名_年_月_日_時(shí)_分_秒_編號(hào)_后綴
00.每個(gè)表會(huì)有一組文件來(lái)記錄其改變;
01.如果有持續(xù)的事務(wù)提交,每10秒會(huì)生成一個(gè)新的文件[需要看配置文件]
02.文件的編號(hào)從00000開(kāi)始遞增;
03.文件名可配置,在ffwriter.properties文件中配置
文件內(nèi)容
"事務(wù)類(lèi)型"|" DML操作類(lèi)型"|"時(shí)間"|"用戶(hù)名""表名"|"K"|old V|new V[|"K"|old V|new V]...
00.事務(wù)類(lèi)型:
a."3":如果事務(wù)里只有一個(gè)DML操作,那么事務(wù)類(lèi)型的位置會(huì)
b.“B”:如果一個(gè)事務(wù)里有多個(gè)DML操作,第一個(gè)DML的事務(wù)類(lèi)型會(huì)顯示為“D”
c.“E”:如果一個(gè)事務(wù)里有多個(gè)DML操作,最后一個(gè)DML操作的事務(wù)類(lèi)型會(huì)顯示為“E”
d.“M”:如果一個(gè)事務(wù)里有多個(gè)DML操作,除了“D”和“E”之外的DML操作的事務(wù)類(lèi)型會(huì)顯示為“M”
01.DML操作類(lèi)型
a.“I”:INSERT操作
b.“D”:DELETE操作
c.“U”:UPDATE操作
02.在不同操作時(shí)KV的呈現(xiàn)
a.INSERT操作
00.舊值全部被占位符(<NULL>)占據(jù)
01.對(duì)于新值,如果出現(xiàn)在插入語(yǔ)句中,則被語(yǔ)句中的值填充,否則被占位符填充
b.DELETE操作
00.對(duì)于主鍵,僅在舊值里顯示,新值用占位符占據(jù)
01.其他字段全部沒(méi)有內(nèi)容
c.UPDATE操作
00.主鍵無(wú)論是否被更改,都會(huì)填充對(duì)應(yīng)的舊值新值
01.其他出現(xiàn)在update語(yǔ)句中的字段,則舊值和新值的位置,對(duì)應(yīng)該字段修改前后的值,如果為空,則以占位符占位
02.未出現(xiàn)在語(yǔ)句中的字段,則沒(méi)有內(nèi)容
文件輸出
輸出配置文件ffwriter.properties,請(qǐng)見(jiàn)github