一、環境要求
Oracle資料庫,19c及以下資料庫,版本不可高於源端OGG
源端,Oracle GoldenGate 19.1.0.0
目標端, Oracle GoldenGate for Big Data 19.1.0.0
備忘:本文樣本均已OGG19.1為例,其他支援版本可參看文末版本說明
二、 安裝步驟
下面將介紹Oracle/OGG相關安裝和配置過程,Oracle的安裝將不做介紹,另外需要注意的是:Oracle/OGG相關參數配置以熟悉Oracle/OGG的營運人員配置為準,本樣本只是提供一個可啟動並執行樣本。
OGG 源端配置
本文以Oracle11g為例,給出一個可用樣本,Oracle 12c多租戶及以上版本請參考官方文檔。
1. 源端Oracle配置
注意:以下操作如遺漏配置,可能會造成UPDATE操作的更新前值為空白以dba分身進入sqlplus:sqlplus / as sysdba
# 建立獨立的資料表空間
create tablespace ATMV datafile '/home/oracle/u01/app/oracle/oradata/uprr/ATMV.dbf' size 100m autoextend on next 50m maxsize unlimited;
# 建立ogg_test使用者,密碼也為ogg_test
create user ogg_test identified by ogg_test default tablespace ATMV;
# 給ogg_test賦予充分的許可權
grant connect,resource,dba to ogg_test;
# 檢查附加日誌情況
Select SUPPLEMENTAL_LOG_DATA_MIN, SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI, SUPPLEMENTAL_LOG_DATA_FK, SUPPLEMENTAL_LOG_DATA_ALL from v$database;
# 增加資料庫附加日誌
alter database add supplemental log data;
alter database add supplemental log data (primary key, unique,foreign key) columns;
# rollback
alter database drop supplemental log data (primary key, unique,foreign key) columns;
alter database drop supplemental log data;
# 全欄位模式,注意:在該模式下的delete操作也只有主索引值,如果需要其他值,須在source端extract配置NOCOMPRESSDELETES
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
# 開啟資料庫強制記錄模式
alter database force logging;
# 安裝sequence support
@sequence.sql
#
alter table sys.seq$ add supplemental log data (primary key) columns;2. 源端OGG安裝
下載OGG安裝包解壓後有如下目錄:
drwxr-xr-x install
drwxrwxr-x response
-rwxr-xr-x runInstaller
drwxr-xr-x stage目前Oracle一般採取response安裝的方式,在response/oggcore.rsp中配置安裝依賴,具體如下:
oracle.install.responseFileVersion=/oracle/install/rspfmt_ogginstall_response_schema_v12_1_2
# 需要目前與oracle版本對應
INSTALL_OPTION=ORA11g
# goldegate主目錄
SOFTWARE_LOCATION=/home/oracle/u01/ggate
# 初始不啟動manager
START_MANAGER=false
# manger連接埠
MANAGER_PORT=7839
# 對應oracle的主目錄
DATABASE_LOCATION=/home/oracle/u01/app/oracle/product/11.2.0/dbhome_1
# 暫可不配置
INVENTORY_LOCATION=
# 分組(目前暫時將oracle和ogg用同一個帳號ogg_test,實際可以給ogg單獨帳號)
UNIX_GROUP_NAME=oinstall執行命令:
runInstaller -silent -responseFile {YOUR_OGG_INSTALL_FILE_PATH}/response/oggcore.rsp本樣本中,安裝後OGG的目錄在/home/oracle/u01/ggate,安裝日誌在/home/oracle/u01/ggate/cfgtoollogs/oui目錄下,當silentInstall{時間}.log檔案裡出現如下提示,表明安裝成功:
The installation of Oracle GoldenGate Core was successful.
執行/home/oracle/u01/ggate/ggsci命令,並在提示符下鍵入命令:CREATE SUBDIRS,從而產生ogg需要的各種目錄(dirxxx)。至此,源端OGG安裝完成。
3. 配置源端mgr
以下是通過ggsci對ogg源端mgr進行配置,配置命令為edit params mgr,配置內容如下
PORT 7839
DYNAMICPORTLIST 7840-7849
USERID ogg_test, PASSWORD ogg_test
PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 7
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45
PURGEDDLHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 7
PURGEMARKERHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 7配置完成後可以查看一下配置以確認,view params mgr
啟動mgr start mgr
查看mgr狀態info mgr
4. 配置源端extract
以下是通過ggsci對ogg進行配置,配置extract(名字可任取,這裡名字為dhext)edit params dhext
EXTRACT dhext
SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
DBOPTIONS ALLOWUNUSEDCOLUMN
USERID ogg_test, PASSWORD ogg_test
REPORTCOUNT EVERY 1 MINUTES, RATE
NUMFILES 5000
DISCARDFILE ./dirrpt/ext_test.dsc, APPEND, MEGABYTES 100
DISCARDROLLOVER AT 2:00
WARNLONGTRANS 2h, CHECKINTERVAL 3m
EXTTRAIL ./dirdat/st, MEGABYTES 200
DDL &
INCLUDE MAPPED OBJTYPE 'table' &
INCLUDE MAPPED OBJTYPE 'index' &
INCLUDE MAPPED OBJTYPE 'SEQUENCE' &
EXCLUDE OPTYPE COMMENT
DDLOPTIONS NOCROSSRENAME REPORT
TABLE OGG_TEST.*,tokens (TKN-ROWID=@GETENV('RECORD','rowid'));
SEQUENCE OGG_TEST.*;
GETUPDATEBEFORES備忘:TABLE OGG_TEST.*,tokens (TKN-ROWID=@GETENV('RECORD','rowid'));可以用來採集源表的rowdid,如果不需要採集rowid可以修改為TABLE OGG_TEST.*;。
添加extract進程並啟動
# 添加extract進程
add extract dhext,tranlog, begin now
# 每個隊列檔案大小為200MB
add exttrail ./dirdat/st,extract dhext, megabytes 200
# 啟動
start dhextextract啟動後,資料庫發生的一條變更可以在ggate/dirdat目錄下的檔案中看到。
5. 配置源端pump
啟動ggsci後執行如下操作:編輯pump配置edit params pump
EXTRACT pump
RMTHOST xx.xx.xx.xx, MGRPORT 7839, COMPRESS
PASSTHRU
NUMFILES 5000
RMTTRAIL ./dirdat/st
DYNAMICRESOLUTION
TABLE OGG_TEST.*;
SEQUENCE OGG_TEST.*;添加並啟動pump
# 添加pump進程
add extract pump,exttrailsource ./dirdat/st
# 添加目標端的trail檔案,每個隊列檔案大小為200MB
add rmttrail ./dirdat/st,extract pump,megabytes 200
# 啟動pump之前需要保證目標端mgr已經啟動
start pump啟動成功後,就可以在目標端的dirdat目錄下看到投遞過來的trailfile。
OGG for Bigdata目標端配置
1. 目標端OGG for Bigdata安裝
目標端的OGG是OGG for Bigdata,不需要安裝,只需要解壓即可。解壓之後,需要建立必須目錄,啟動ggsci之後輸入命令create subdirs,成功之後便可以看到OGG目錄下增加了dirxxx的幾個目錄。
2. DataHub外掛程式安裝和配置
依賴環境:JDK >= 1.8。配置好JAVA_HOME, LD_LIBRARY_PATH,可以將環境變數配置到~/.bash_profile中,例如:
export JAVA_HOME=/xxx/xxx
export JRE_HOME=/xxx/xxx/jrexx
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$JRE_HOME/lib/amd64:$JRE_HOME/lib/amd64/server修改環境變數後,下載datahub-ogg-plugin.tar.gz並解壓,修改conf路徑下的javaue.properties檔案,將${GG_HOME}替換為解壓後的路徑
gg.handlerlist=ggdatahub
gg.handler.ggdatahub.type=com.aliyun.odps.ogg.handler.datahub.DatahubHandler
gg.handler.ggdatahub.configureFileName=${GG_HOME}/aliyun-datahub-ogg-plugin/conf/configure.xml
goldengate.userexit.timestamp=utc+8
goldengate.userexit.writers=javawriter
javawriter.stats.display=TRUE
javawriter.stats.full=TRUE
gg.includeggtokens=true
gg.classpath=${GG_HOME}/aliyun-datahub-ogg-plugin/lib/*
gg.log=log4j
gg.log.level=info
gg.log.file.count=64
gg.log.file.size=128MB
javawriter.bootoptions=-Xms512m -Xmx512m -Xmn256m -Djava.class.path=ggjava/ggjava.jar -Dlog4j.configurationFile=${GG_HOME}/aliyun-datahub-ogg-plugin/conf/log4j.properties修改conf路徑下的configure.xml檔案,修改方式見檔案中的注釋
<?xml version="1.0" encoding="UTF-8"?>
<configue>
<defaultOracleConfigure>
<!-- oracle sid, 必選-->
<sid>100</sid>
<!-- oracle schema, 可以被mapping中的oracleSchema覆蓋, 兩者必須有一個非空-->
<schema>ogg_test</schema>
</defaultOracleConfigure>
<defalutDatahubConfigure>
<!-- datahub endpoint, 必填-->
<endPoint>YOUR_DATAHUB_ENDPOINT</endPoint>
<!-- datahub project, 可以被mapping中的datahubProject, 兩者必須有一個非空-->
<project>YOUR_DATAHUB_PROJECT</project>
<!-- datahub accessId, 可以被mapping中的datahubAccessId覆蓋, 兩者必須有一個非空-->
<accessId>YOUR_DATAHUB_ACCESS_ID</accessId>
<!-- datahub accessKey, 可以被mapping中的datahubAccessKey覆蓋, 兩者必須有一個非空-->
<accessKey>YOUR_DATAHUB_ACCESS_KEY</accessKey>
<!-- 資料變更類型同步到datahub對應的欄位,可以被columnMapping中的ctypeColumn覆蓋 -->
<ctypeColumn>optype</ctypeColumn>
<!-- 資料變更時間同步到datahub對應的欄位,可以被columnMapping中的ctimeColumn覆蓋 -->
<ctimeColumn>readtime</ctimeColumn>
<!-- 資料變更序號同步到datahub對應的欄位, 按資料變更先後遞增, 不保證連續, 可以被columnMapping中的cidColumn覆蓋 -->
<cidColumn>record_id</cidColumn>
</defalutDatahubConfigure>
<!-- 預設最嚴格,不落檔案,直接退出,無限重試-->
<!-- 運行每批上次的最多紀錄數, 可選, 預設1000-->
<batchSize>1000</batchSize>
<!-- 預設時間欄位轉換格式, 可選, 預設yyyy-MM-dd HH:mm:ss-->
<defaultDateFormat>yyyy-MM-dd HH:mm:ss</defaultDateFormat>
<!-- 髒資料是否繼續, 可選, 預設false-->
<dirtyDataContinue>true</dirtyDataContinue>
<!-- 髒資料檔案, 可選, 預設datahub_ogg_plugin.dirty-->
<dirtyDataFile>datahub_ogg_plugin.dirty</dirtyDataFile>
<!-- 髒資料檔案最大size, 單位M, 可選, 預設500-->
<dirtyDataFileMaxSize>200</dirtyDataFileMaxSize>
<!-- 重試次數, -1:無限重試 0:不重試 n:重試次數, 可選, 預設-1-->
<retryTimes>0</retryTimes>
<!--指定shard id列表, 優先生效, 可選,例如0,1-->
<shardId>0,1</shardId>
<!-- 稍候再試, 單位毫秒, 可選, 預設3000-->
<retryInterval>4000</retryInterval>
<!-- 點位檔案, 可選, 預設datahub_ogg_plugin.chk-->
<checkPointFileName>datahub_ogg_plugin.chk</checkPointFileName>
<mappings>
<mapping>
<!-- oracle schema, 見上描述-->
<oracleSchema></oracleSchema>
<!-- oracle table, 必選-->
<oracleTable>t_person</oracleTable>
<!-- datahub project, 見上描述-->
<datahubProject></datahubProject>
<!-- datahub topic, 必選-->
<datahubTopic>t_person</datahubTopic>
<!-- oracle表rowid同步到DataHub的欄位,可選 -->
<rowIdColumn></rowIdColumn>
<ctypeColumn></ctypeColumn>
<ctimeColumn></ctimeColumn>
<cidColumn></cidColumn>
<columnMapping>
<!--
src:oracle欄位名稱, 必須;
dest:datahub field, 必須;
destOld:變更前資料落到datahub的field, 可選;
isShardColumn: 是否作為shard的hashkey, 可選, 預設為false, 可以被shardId覆蓋
isDateFormat: timestamp欄位是否採用DateFormat格式轉換, 預設true. 如果是false, 源端資料必須是long
dateFormat: timestamp欄位的轉換格式, 不填就用預設值
-->
<column src="id" dest="id" isShardColumn="true" isDateFormat="false" dateFormat="yyyy-MM-dd HH:mm:ss"/>
<column src="name" dest="name" isShardColumn="true"/>
<column src="age" dest="age"/>
<column src="address" dest="address"/>
<column src="comments" dest="comments"/>
<column src="sex" dest="sex"/>
<column src="temp" dest="temp" destOld="temp1"/>
</columnMapping>
</mapping>
</mappings>
</configue>3. 配置目標端mgr
port 7919
dynamicportlist 7910-7919
lagreportminutes 10
laginfoseconds 1
purgeoldextracts ./dirdat/*, usecheckpoints, minkeepdays 7啟動mgr start mgr
4. 配置目標端replicat
在ggsci下編輯配置,edit params dhwt
REPLICAT dhwt
getEnv (JAVA_HOME)
getEnv (LD_LIBRARY_PATH)
getEnv (PATH)
TARGETDB LIBFILE libggjava.so SET property=${GG_HOME}/aliyun-datahub-ogg-plugin/conf/javaue.properties --需要使用者手動修改路徑
MAP ogg_test.*, TARGET ogg_test.*;上面樣本使用者需要手動修改下javaue.properties的具體路徑,並且在MAP中配置具體的表名,本文採集ogg_test下的所有表。
添加並啟動dhwt
# 添加進程
add replicat dhwt, exttrailsource dirdat/st
# 啟動dhwt
start dhwt三、資料樣本
日誌樣本
源端不涉及外掛程式邏輯,這裡只介紹目標端的日誌主要分為兩個:
DataHub外掛程式日誌,在dirrpt目錄下,預設每個Replicat進程一個日誌,日誌名為進程名-datahub.log(上例日誌為DHWT-datahub.log),外掛程式相關的問題都可以參考該日誌解決。
OGG相關日誌,在dirrpt目錄下,預設每個Replicat進程一個日誌,日誌名為進程名.log*(上例為DHWT.log),OGG相關的問題都可以參考該日誌解決。
資料樣本
寫入DataHub成功會在外掛程式日誌產生以下記錄
2020-12-01 11:29:30.000461 [record_writer-1-thread-1] INFO ShardWriter - Write DataHub success, table: orders, topic: orders_new, shard: 0, recordNum: 1, rt: 3在DataHub頁面抽樣可以看到寫入的資料
Shard ID System Time oid (STRING) num (STRING) pid (STRING) bak (STRING) ctype (STRING) ctime (STRING) cid (STRING) rowid (STRING)
0 2020年12月1日上午11:29:30 1 3 2 zh I 2020-12-01 03:29:24.000074 16067933700000 AAAWwyAAGAAABufAAC