OGG for Big Data

一、环境要求

  • Oracle数据库,19c及以下数据库,版本不可高于源端OGG

  • 源端,Oracle GoldenGate 19.1.0.0

  • 目标端, Oracle GoldenGate for Big Data 19.1.0.0

  • OGG官方下载地址

备注:本文示例均已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 dhext

extract启动后,数据库发生的一条变更可以在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

三、数据示例

日志示例

源端不涉及插件逻辑,这里只介绍目标端的日志主要分为两个:

  1. DataHub插件日志,在dirrpt目录下,默认每个Replicat进程一个日志,日志名为进程名-datahub.log(上例日志为DHWT-datahub.log),插件相关的问题都可以参考该日志解决。

  2. 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