前言
Oracle Goldengate在很早前就推出了一個for java的版本,主要目的是方便把關係型資料實時寫入到不支援的目標端,如JMS或Redis等key value資料庫。在Hadoop剛出來的時候,也可以使用ogg for java adapter將資料實時投遞到HDFS等平臺,只是後來專門推出了一個ogg for bigdata版本,可以不用二次開發,即可將資料實時投遞到hbase ,hive, kafka, mongodb等。所以,針對不支援的目標端,還是需要使用ogg for java adapter進行二次開發和投遞。
官網上的OGG for java adapter介質:
官網上ogg for bigdata介質:
架構
針對ogg for java adapter,常用的架構如下:
OGG for java adapter可用於將增量資料實時寫入到flatfile,通過ETL的Load,載入到DW中,實現實時資料倉儲的載入和分析。如下架構:
配置
針對ogg for java adapter,還是需要配置傳統的source extract,目標端也需要配置replicat,但此時,是呼叫自己開發的java投遞程式。而OGG提供有一套框架介面,開發人員只需要實現對應的介面和過載部分函式,即可完成獲取增量資料,獲取表結構定義,資料變更型別(Insert/update/delete等),事務控制等操作,從而實現自定義的資料投遞。
源端抽取配置
1、oracle goldengate要求資料庫日誌為存檔模式
CMD> set ORACLE_SID=jxk
CMD> sqlplus / as sysdba
SQL> archive log list;(檢視資料庫日誌模式)
(1)如資料庫模式為禁用存檔模式,且資料庫正在執行,需要先將資料庫先關閉,再啟動,並修改配置
SQL> shutdown immediate;
注:shutdown immediate可以強行結束或回滾正在執行的事務、程式就可以close DB
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;
SQL> alter database force logging;
SQL> alter database add supplemental log data(primary key,unique) columns;
SQL> alter system archive log current;
2、oracle推薦新建專用同步使用者,執行ogg操作,與業務使用者做區分。
SQL> create user ogg identified by ogg;
SQL>grant dba to ogg;
3、對需要同步的表生成對應的表結構資訊(針對OGG12.2以下的版本)
編輯 $OGG_HOME/def.prm
defsfile busiuser.def --檔名 USERID ogg, PASSWORD ogg --ogg資料庫同步使用者 table busiuser.iy01; --需要同步的表 table newuser.*; |
cd E:/ogg
Cmd > defgen paramfile def.prm
將生成的busiuser.def檔案拷貝至目標端的$OGG_HOME/dirdef目錄下
注意:如果busiuser.def檔案已存在,則需要手動刪除,再執行生成命令,否則報錯。原因是oracle此處不會自動刪除已存在的檔案。另外 table busiuser.iy01後面必須跟分號”;”,否則執行defgen的時候會報 command ‘TABLE’ not terminate ……錯誤。
--抽取
add extract ex2, tranlog, begin now
add exttrail ./dirdat/e2, extract ex2, megabytes 100
--傳輸
add extract pu2, exttrailSource ./dirdat/e2
add rmttrail ./dirdat/e3, extract pu2, megabytes 200
--投遞
add replicat re2, exttrail ./dirdat/e3, nodbcheckpoint
4、配置ogg程式
cd E:/ogg
E:
ggsci
> create subdirs
> edit param mgr (建立管理程式)輸入埠
port 7809
> edit param ex1
extract ex1 oracle_home setenv(oracle_sid="jxk") --設定oracle_sid nls_lang userid ogg, password ogg --設定操作ogg的使用者 rmthost 192.168.0.44, mgrport 7809 --目標端ogg的ip和埠 rmttrail ./dirdat/ea --目標端的佇列檔案儲存目錄,相對與安裝ogg目錄的路徑 table busiuser.*; --需要執行同步的表,可單表配置,也支援通配 使用者名稱.表名 |
注:ex1檔案發生改變,需要重啟mgr和ex1程式;ex1名稱自定義
預設只支援DML,如果要支援DDL需要執行一些單獨的配置。
> add extract ex1(此名稱需要與配置prm檔名一致), tranlog, begin now
--TRANLOG 表示使用事務日誌的方式
--BEGIN NOW 表示從現在開始,你也可以指定一個具體的開始時間
> add rmttrail ./dirdat/ea, extract ex1
> start mgr
> start ex1
> info 程式名(檢視程式狀態)
> info all(檢視所有程式狀態)
> view report ex1(檢視程式ex1執行日誌)
完成上述操作後,還需要對需要同步的表做trandata操作,否則沒有主鍵的表同步會報錯,異常資訊如下:
OGG-00730 No minimum supplemental logging is enabled. This may cause extract process to handle key update incorrectly if key column is not in first row piece.
Cmd > set oracle_sid=orcl
Cmd > ggsci
> dblogin userid ogg, password ogg
> add trandata business.iy01
> start ex1(重啟程式)
如遇到錯誤:ERROR OGG-00717 Found unsupported in-memory undo record in sequence 38978, at RBA 4562448, with SCN 0.2055451476 (2055451476) ... Minimum supplemental logging must be enabled to prevent data loss. 執行如下操作
> alter ex1, tranlog, begin now
> start ex1
> stats ex1(檢視當前正在佇列中的資料)
目標端JDBC連線方式配置
1、下載ogg application adapters for linux
2、解壓配置環境變數
export JAVA_HOME=/home/gbase/jdk1.8.0_45
export PATH=$JAVA_HOME/bin:$PATH
export LD_LIBRARY_PATH=${JAVA_HOME}/jre/lib/amd64/server:/home/oracle/ogg:${LD_LIBRARY_PATH}
注意:LD_LIBRARY_PATH這個配置是因為ogg中的庫檔案需要依賴
3、進入安裝目錄執行命令
$>./ggsci
> create subdirs
> edit param mgr
Port 7809
> start mgr
>info all
4、目標端啟動mgr後,源端啟動抽取程式才會成功,下面執行目標端程式配置
(以下使用傳統的extract模式進行投遞,在ogg12.2及以後版本,可使用replicat模式)
1)拷貝redis-jdbc驅動包和二次開發的jar包到 $OGG_HOME/ggjava目錄下
2)>edit param rejava
Extract rejava -- Sample extract prm file for the Oracle GoldenGate for Java user-exit. A properties -- file configures the user-exit; by default named "dirprm/{extract_name}.properties" -- e.g., javaue.prm loads javaue.properties. The user-exit runs in a data pump extract: -- ggsci> add extract javaue, extTrailSource dirdat/tc -- ggsci> info javaue -- the source-def's must match the trail data SourceDefs ./dirdef/busiuser.def getEnv (JAVA_HOME) getEnv (PATH) getEnv (LD_LIBRARY_PATH) -- windows: --CUserExit ggjava_ue.dll CUSEREXIT PassThru IncludeUpdateBefores -- unix/linux: CUserExit libggjava_ue.so CUSEREXIT PassThru IncludeUpdateBefores GetUpdateBefores -- tables to be processed; as of 11.2 data may be filtered, tables/operations skipped Table busiuser.*; |
> edit rejava.properties
gg.handlerlist=use_redis --隨意,但下面配置必須和此名稱一致 gg.classpath=./ggjava/ogg_gbase_1.0.jar,./ggjava/gbase-connector-java-8.3.81.53-build52.8-bin.jar --引入jar包到classpath gg.handler.use_redis.type=sample.handler.jdbc.SimpleJDBCHandler --二次開發程式入口 gg.handler.use_redis.driver= redis jdbc driver資訊 gg.handler.use_redis.url=redis jdbc url gg.handler.use_redis.user= gg.handler.use_redis.password= gg.handler.use_redis.mode=op gg.handler.use_redis.maxBatchSize=100 gg.handler.use_redis.reportCount=10000 gg.handler.use_redis.dateFormat=yyyy-MM-dd:HH:mm:ss |
配置完成後,需要關閉mgr,重啟mgr
5、增加extract程式
> ADD EXTRACT rejava, EXTTRAILSOURCE ./dirdat/ea, BEGIN now
> ADD RMTTRAIL ./dirdat/ea, EXTRACT rejava
> start rejava
> info all
6、測試:
在源端insert 資料,使用stats可以在源端和目標端看到資料增變數,和執行的標識語句,在目標資料庫中查詢資料
總結
1、源端和目標端部署完成後,需要兩端都將mgr程式啟動,然後再啟動extract程式。
2、遠端和目標端的配置檔案發生改變時,需要重啟mgr和extract程式。
3、如碰上目標端投遞資料有問題,可先使用單獨的java程式嘗試手工寫入資料,確保目標端是可用的,再進行ogg for java extract/replicat程式的除錯。
4、使用ogg for java adapter,可以很容易實現將關係型資料庫的增量資料(其實也可以抽取存量資料),實時寫入到任意目標儲存平臺,包括非官方直接配置支援的redis, 各種key-value db, memory db(如gemfire),mariadb, sqlite,JSON等,適合於各種場景應用。
下一期會基於程式碼介紹OGG for java adapter的部分介面和函式。