天天看點

基于OGG Datahub插件将Oracle資料同步上雲

随着資料規模的不斷擴大,傳統的rdbms難以滿足olap的需求,本文将介紹如何将oracle的資料實時同步到阿裡雲的大資料處理平台當中,并利用大資料工具對資料進行分析。

ogg(oracle goldengate)是一個基于日志的結構化資料備份工具,一般用于oracle資料庫之間的主從備份以及oracle資料庫到其他資料庫(db2, mysql等)的同步。下面是oracle官方提供的一個ogg的整體架構圖,從圖中可以看出ogg的部署分為源端和目标端兩部分組成,主要有manager,extract,pump,collector,replicat這麼一些元件。

基于OGG Datahub插件将Oracle資料同步上雲

manager:在源端和目标端都會有且隻有一個manager程序存在,負責管理其他程序的啟停和監控等;

extract:負責從源端資料庫表或者事務日志中捕獲資料,有初始加載和增量同步兩種模式可以配置,初始加載模式是直接将源表資料同步到目标端,而增量同步就是分析源端資料庫的日志,将變動的記錄傳到目标端,本文介紹的是增量同步的模式;

pump:extract從源端抽取的資料會先寫到本地磁盤的trail檔案,pump程序會負責将trail檔案的資料投遞到目标端;

collector:目标端負責接收來自源端的資料,生成trail檔案

replicat:負責讀取目标端的trail檔案,轉化為相應的ddl和dml語句作用到目标資料庫,實作資料同步。

源端已安裝好oracle

源端已安裝好ogg(建議版本oracle goldengate v12.1.2.1)

目标端已安裝好ogg adapters(建議版本oracle goldengate application adapters 12.1.2.1)

java 7

(下面将介紹oracle/ogg相關安裝和配置過程,oracle的安裝将不做介紹,另外需要注意的是:oracle/ogg相關參數配置以熟悉oracle/ogg的運維人員配置為準,本示例隻是提供一個可運作的樣本,oracle所使用的版本為ora11g)

下載下傳ogg安裝包解壓後有如下目錄:

目前oracle一般采取response安裝的方式,在response/oggcore.rsp中配置安裝依賴,具體如下:

執行指令:

本示例中,安裝後ogg的目錄在/home/oracle/u01/ggate,安裝日志在/home/oracle/u01/ggate/cfgtoollogs/oui目錄下,當silentinstall{時間}.log檔案裡出現如下提示,表明安裝成功:

執行/home/oracle/u01/ggate/ggsci指令,并在提示符下鍵入指令:create subdirs,進而生成ogg需要的各種目錄(dir打頭的那些)。

至此,源端ogg安裝完成。

以dba分身進入sqlplus:sqlplus / as sysdba

以下是通過ggsci對ogg進行配置

配置mgr

edit params mgr

啟動mgr(運作日志在ggate/dirrpt中)

start mgr

檢視mgr狀态

info mgr

檢視mgr配置

view params mgr

配置extract(名字可任取,extract是組名)

edit params extract

增加extract程序(ext後的名字要跟上面<code>extract</code>對應,本例中extract是組名)

add ext extract,tranlog, begin now

删除某廢棄程序dp_test

delete ext dp_test

添加抽取程序,每個隊列檔案大小為200m

add exttrail ./dirdat/st,ext extract, megabytes 200

啟動抽取程序(運作日志在ggate/dirrpt中)

start extract extract

至此,extract配置完成,資料庫的一條變更可以在ggate/dirdat目錄下的檔案中看到

源端ggsci起來後執行如下指令,生成defgen檔案,并且拷貝到目标端dirdef下

edit params defgen

在shell中執行如下指令,生成ogg_test.def

./defgen paramfile ./dirprm/defgen.prm

解壓adapter包

将源端中dirdef/ogg_test.def檔案拷貝到adapter的dirdef下

執行ggsci起來後執行如下指令,建立必須目錄

create subdirs

編輯mgr配置

啟動mgr

啟動ggsci後執行如下操作:

編輯pump配置

edit params pump

添加投遞程序,從某一個隊列開始投

add ext pump,exttrailsource ./dirdat/st

備注:投遞程序,每個隊檔案大小為200m

add rmttrail ./dirdat/st,ext pump,megabytes 200

啟動pump

start pump

啟動後,結合上面adapter的配置,可以在目标端的dirdat目錄下看到過來的trailfile

依賴環境:jdk1.7。

配置好java_home, ld_library_path,可以将環境變量配置到~/.bash_profile中,例如

修改環境變量後,請重新開機adapter的mgr程序

修改conf路徑下的javaue.properties檔案,将{your_home}替換為解壓後的路徑

修改conf路徑下的log4j.properties檔案,将{your_home}替換為解壓後的路徑

修改conf路徑下的configure.xml檔案,修改方式見檔案中的注釋

在ggsci下啟動datahub writer

edit params dhwriter

添加dhwriter

add extract dhwriter, exttrailsource ./dirdat/st

啟動dhwriter

start dhwriter

這裡會用一個簡單的示例來說明資料的使用方法,例如我們在oracle資料庫有一張商品訂單表orders(oid int, pid int, num int),該表有三列,分别為訂單id, 商品id和商品數量。

将這個表通過ogg datahub進行增量資料同步之前,我們需要先将源表已有的資料通過datax同步到maxcompute中。增量同步的關鍵步驟如下:

(1)在datahub上建立相應的topic,topic的schema為(string record_id, string optype, string readtime, bigint oid_before, bigint oid_after, bigint pid_before, bigint pid_after, bigint num_before, bigint num_after);

(2)ogg datahub的插件按照上述的安裝流程部署配置,其中列的mapping配置如下:

其中optype和readtime字段是記錄資料庫的資料變更類型和時間,optype有"i", "d", "u"三種取值,分别對應為“增”,“删”,“改”三種資料變更操作。

(3)ogg datahub插件部署好成功運作後,插件會源源不斷的将源表的資料變更記錄輸送至datahub中,例如我們在源訂單表中新增一條記錄(1,2,1),datahub裡收到的記錄如下:

修改這條資料,比如把num改為20,datahub則會收到的一條變更資料記錄,如下:

在前一天的離線計算的基礎資料上,我們可以寫一個streamcompute流計算的分析程式,很容易地對資料進行實時彙總,例如實時統計目前總的訂單數,每種商品的銷售量等。處理思路就是對于每一條到來的變更資料,可以拿到變化的數值,實時更新統計變量即可。

為了便于後續的離線分析,我們也可以将datahub裡的資料歸檔到maxcompute中,在maxcompute中建立相應schema的表:

基于OGG Datahub插件将Oracle資料同步上雲

q:目标端報錯 ogg-06551 oracle goldengate collector: could not translate host name localhost into an internet address.

a:目标端機器hostname在/etc/hosts裡面重新設定localhost對應的ip

q:找不到jvm相關的so包

a:将jvm的so路徑添加到ld_library_path後,重新開機mgr

q:有了ddl語句,比如增加一列,源端ogg沒有問題,但是adapter端的ffwriter和jmswriter程序退出,且報錯: 2015-06-11 14:01:10 error ogg-01161 bad column index (5) specified for table ogg_test.t_person, max columns = 5.

a:由于表結構改變,需要重做def檔案,将重做的def檔案放入dirdef後重新開機即可