Oracle数据源接入DBus

1 安装必读

以下内容为DBus接入Oracle数据库的日志实时获取实现方案以及相关组件的配置说明。

Oracle数据库日志解析通过Oracle的商业软件:Oracle GoldenGate实现。

特别说明:

1、DBus不包含任何Oracle以及Oraclegoldengate组件和代码,DBus也没有修改任何Oracle以及Oracle goldengate组件和代码。

2、使用DBus对接和处理的任何数据包括但不限于Oracle 以及Oraclegoldengate的数据,使用人应确保数据来源的合法性及使用遵循Oracle公司相关协议。

3、DBus只是对接了Oracle goldengate for bigdata输出到Kafka中avro格式的数据,仅作为个人学习和研究使用。

有关Oracle goldengate协议情况,请参考http://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html***

相关依赖说明:

请按照Oracle数据库的版本选择合适的Oracle GoldenGate和Oracle GoldenGate for Bigdata版本

限制说明:

模块整体实现方案:

在以下文档中以OGG作为Oracle GoldenGate的简写;以OGG for bigdata作为Oracle GoldenGate for Bigdata的简写

DBus处理OGG for bigdata实时输出的AVRO格式的二进制数据,并处理表结构变更、DBus heartbeat、数据转换以及全量数据初始化等相关逻辑,下图展示了整体数据流程,DBus通过订阅OGG for bigdata写入到Kafka中的日志数据处理oracle数据库表记录的变化情况,通过JDBC分片获取Oracle数据库表中的初始化数据。

整体数据流程

部署说明

本章安装配置按照以下环境进行配置说明:

2 OGG安装配置

2.1 dbus数据库初始化

使用oracle用户在 ora-master 服务器 执行

说明:

2.1.1 创建dbus用户和数据库

Shell> sqlplus / as sysdba;
SQL> create tablespace tbs_dbus datafile '/u01/dbus.dbf' size 4G autoextend off;
SQL> create user dbus identified by dbus default tablespace tbs_dbus quota unlimited on tbs_dbus;
SQL> grant connect,resource to dbus;
SQL> grant execute on SYS.DBMS_FLASHBACK to dbus;
-- 用于以只读模式下读取表的列表
SQL> grant select on SYS.dba_tables to dbus;
-- 用于以只读模式下读取任意表的列信息的列表
SQL> grant select on SYS.dba_tab_columns to dbus;
SQL> grant select on SYS.dba_tab_cols to dbus;
SQL> grant select on SYS.dba_cons_columns to dbus;
SQL> grant select on SYS.dba_constraints to dbus;
SQL> grant select on SYS.dba_log_groups to dbus;
-- 用于查分区表
SQL> grant select on SYS.DBA_TAB_PARTITIONS to dbus;
--用于查找schema是否存在
SQL> grant select on SYS.dba_users to dbus;

2.1.2 建表结构和sequence

sql语句详见:dbus-oracle.sql

2.1.3 创建系统ddl trigger

以DBA身份登录数据库,创建系统trigger,sql语句详见:tr_dbus_ddl.trg

-- 确认trigger状态
SQL> select object_name,status from all_objects where object_name = 'TR_DBUS_DDL';

OBJECT_NAME                    STATUS
------------------------------ -------
TR_DBUS_DDL                    VALID

2.2 主库配置

使用oracle用户在 ora-master 服务器执行

如果ora-master上为Oracle设置了用户和用户组,需要提前切换用户,此处用户名为:oracle

  Shell> su - oracle

2.2.1 检查环境变量

 echo $ORACLE_SID
 echo $ORACLE_BASE
 echo $ORACLE_HOME

没有则需要设置变量为以下值

--变量值需要修改为自己的
ORACLE_SID=oratest
ORACLE_BASE=/app/u01/oracle
ORACLE_HOME=$ORACLE_BASE/11.2.0/db_1

2.2.2 主库归档模式启动

#sysdba登入,检查下面命令的输出结果
SQL> archive log list;

#如果没有启动。需要先创建目录
--切换到root用户,查看目录是否存在
Shell> sudo -i
Shell> ll /u01/arch
--不存在则创建arch目录
Shell> mkdir /u01/arch
Shell> chown oracle:oinstall /u01/arch/
   
--然后登录sqlplus,开启归档日志
Shell> su - oracle
Shell> sqlplus / as sysdba;
SQL> alter system set log_archive_dest_1='location=/u01/arch/';
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> archive log list;

2.2.3 启用supplement log mode

--查看是否启用:
SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SUPPLEMENTAL_LOG_DATA_MI
---------------------------------------------------
NO
--如果未启用,使用如下命令启用:
SQL> alter database add supplemental log data;
SQL> alter database open;
--切换日志
SQL> alter system archive log current;

2.2.4 强制产生日志

实际生产应用中,最好同时打开ORACLE的强制日志模式,以防止源数据库因直接路径加载忽略redo生成而导致这部分数据无法同步

-- 确认是否开启
SQL> select force_logging from v$database;
FOR
---
NO
--如果没有,启用强制产生日志:
SQL> alter database force logging;

2.2.5 创建ogg用户

--创建表空间
--请注意根据环境修改datafile路径
SQL> create tablespace tbs_gguser datafile '/u01/data/ogg.dbf' size 50m autoextend on; 
--创建OGG用户
SQL> create user ogg identified by ogg default tablespace tbs_gguser temporary tablespace temp quota unlimited on tbs_gguser;

--给ogg用户授权
SQL> grant connect,resource, DBA to ogg;

2.3 安装OGG

2.3.1 注意事项

OGG源端需要和Oracle数据库安装在同一台机器(一般选择备库)

使用oracle用户在 ora-slave 服务器执行以下操作

#切换到oracle用户
Shell> su - oracle

2.3.2 设置环境变量

export ORACLE_SID=oratest
export ORACLE_BASE=/app/u01/oracle
export ORACLE_HOME=$ORACLE_BASE/11.2.0/db_1

2.3.3 安装环境准备

#上传123012_fbo_ggs_Linux_x64_shiphome.zip包至/home/oracle/
#解压
Shell> unzip 123012_fbo_ggs_Linux_x64_shiphome.zip

#解压后的文件和目录信息
-rw-r--r-- 1 oracle oinstall 338735172 1月  19 15:50 123012_fbo_ggs_Linux_x64_shiphome.zip
drwxr-xr-x 3 oracle oinstall      4096 12月  9 22:02 fbo_ggs_Linux_x64_shiphome
-rw-r--r-- 1 oracle oinstall      1440 12月 20 01:21 OGG-12.3.0.1-README.txt
-rw-r--r-- 1 oracle oinstall    236538 12月 20 03:32 OGG_WinUnix_Rel_Notes_12.3.0.1.pdf

2.3.4 执行安装

#进入到安装目录
Shell> cd fbo_ggs_Linux_x64_shiphome/Disk1/

#修改oggcore.rsp文件中的配置项:INSTALL_OPTION 和 SOFTWARE_LOCATION
Shell> vim response/oggcore.rsp

#找到待修改的配置项:INSTALL_OPTION 和 SOFTWARE_LOCATION
#-------------------------------------------------------------------------------
# Specify the installation option.
# Specify ORA12c for installing Oracle GoldenGate for Oracle Database 12c and
#         ORA11g for installing Oracle GoldenGate for Oracle Database 11g 
#-------------------------------------------------------------------------------
INSTALL_OPTION=ORA11g #这里是你的数据库版本

#-------------------------------------------------------------------------------
# Specify a location to install Oracle GoldenGate
#-------------------------------------------------------------------------------
SOFTWARE_LOCATION=/u01/golden123012/

# 执行安装命令(以下两行为同一条命令)
Shell> ./runInstaller -silent -nowait -responseFile /home/oracle/fbo_ggs_Linux_x64_shiphome/Disk1/response/oggcore.rsp
#安装结果确认
[oracle@10 Disk1]$ Oracle GoldenGate Core 的 安装 已成功。

2.4 初始化和配置OGG

使用oracle用户在 ora-slave 服务器执行

2.4.1 建立相应的子目录

#进入ggsci命令行工具
Shell> /u01/golden123012/ggsci

Oracle GoldenGate Command Interpreter for Oracle
Version 12.3.0.1.2 OGGCORE_12.3.0.1.0_PLATFORMS_171208.0005_FBO
Linux, x64, 64bit (optimized), Oracle 11g on Dec  8 2017 21:13:00
Operating system character set identified as UTF-8.

Copyright (C) 1995, 2017, Oracle and/or its affiliates. All rights reserved.

#执行创建subdirs命令
GGSCI> create subdirs

Creating subdirectories under current directory /u01/golden123012

Parameter file                 /u01/golden123012/dirprm: created.
Report file                    /u01/golden123012/dirrpt: created.
Checkpoint file                /u01/golden123012/dirchk: created.
Process status files           /u01/golden123012/dirpcs: created.
SQL script files               /u01/golden123012/dirsql: created.
Database definitions files     /u01/golden123012/dirdef: created.
Extract data files             /u01/golden123012/dirdat: created.
Temporary files                /u01/golden123012/dirtmp: created.
Credential store files         /u01/golden123012/dircrd: created.
Masterkey wallet files         /u01/golden123012/dirwlt: created.
Dump files                     /u01/golden123012/dirdmp: created.

2.4.2 配置支持DDL

首先需要将 ora-slave 服务器上 /u01/golden123012 目录下相关sql文件拷贝到主库的/u01/golden123012/ 目录下,相关sql文件如下:

配置说明:

#修改params.sql
Shell> vim params.sql
#修改以下变量值为 'TRUE'
define allow_invisible_index_keys = 'TRUE'

#使用oracle用户在ora-slave服务器执行
GGSCI> edit param ./globals
#输入以下内容并保存,标明支持DDL的GG对象存放在哪个schema下
GGSCHEMA ogg

#使用oracle用户在ora-master服务器执行
#进入到/u01/golden123012/目录,以DBA身份登录sqlplus
Shell> sqlplus / as sysdba;
#给ogg用户授权
SQL> GRANT EXECUTE ON utl_file TO ogg;
#执行脚本
SQL> @marker_setup.sql --执行过程中需要按照提示输入schema name:ogg
#执行该脚本之前需要关闭所有连接到oracle的session
SQL> @ddl_setup.sql    --执行过程中需要按照提示输入schema name:ogg
SQL> @role_setup.sql   --执行过程中需要按照提示输入schema name:ogg
#根据提示给用户ogg赋GGS_GGSUSER_ROLE角色权限
SQL> GRANT GGS_GGSUSER_ROLE TO ogg;
SQL> @ddl_enable.sql

细节请参考官方文档:https://docs.oracle.com/goldengate/c1230/gg-winux/GGODB/installing-trigger-based-ddl-capture-1.htm

2.4.3 配置OGG的mgr进程

#进入ggsci命令行
Shell> /u01/golden-ora/ggsci
#编辑mgr配置文件(执行后会进入vi环境)
GGSCI> edit param mgr
#输入以下内容并保存
PORT 7890
PURGEOLDEXTRACTS /u01/golden-ora/dirdat, USECHECKPOINTS
#自动重启的配置
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 1
#启动mgr进程
GGSCI> start mgr
#确认mgr进程启动是否成功
GGSCI> info mgr
Manager is running (IP port yourip.7890, Process ID 18221).

3 OGG for bigdata安装配置

3.1 设置环境变量

export JAVA_HOME=/usr/java/latest
export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64/server:$LD_LIBRARY_PATH
export PATH=$PATH:$HOME/bin

$JAVA_HOME/jre/lib/i386/server 目录包含 libjvm.solibjsig.so 文件

不同的版本的jdk这个目录名称可能不同。

3.2 解压安装

Shell> mkdir /u01/golden/
#上传 123111_ggs_Adapters_Linux_x64.zip包至/u01/golden/
Shell> unzip 123111_ggs_Adapters_Linux_x64.zip
Shell> tar -xvf ggs_Adapters_Linux_x64.tar

3.3 配置并启动mgr进程

#执行ggsci命令
Shell> /u01/golden/ggsci
GGSCI> create subdirs
GGSCI> edit param mgr
# 输入以下内容并保存
PORT 7890
# 只保留 7 天的 trail file 文件
PURGEOLDEXTRACTS /u01/golden/dirdat/*, usecheckpoints, minkeepdays 7
AUTORESTART REPLICAT *,RETRIES 5,WAITMINUTES 1

GGSCI> start mgr
GGSCI> info mgr
Manager is running (IP port yourip.7890, Process ID 24092).

更详细的配置参数请参考:https://docs.oracle.com/goldengate/bd123110/gg-bd/GADBD/using-kafka-handler.htm#GADBD449

3.4 添加kafka依赖

依赖的kafka相关jar包,以kafka_2.11-0.10.0.0为例说明,可以到kafka安装目录下找到以下jar包:

kafka-clients-0.10.0.0.jar lz4-1.3.0.jar slf4j-api-1.7.21.jar snappy-java-1.1.2.4.jar

然后到安装目录下,创建kafka-jars目录

Shell> cd /u01/golden/
Shell> mkdir kafka-jars
#上传jar到/u01/golden/kafka-jars目录
Shell> ll
-rw-r--r-- 1 oracle oracle  743727 5月  18 2016 kafka-clients-0.10.0.0.jar
-rw-r--r-- 1 oracle oracle  236880 1月  13 2016 lz4-1.3.0.jar
-rw-r--r-- 1 oracle oracle   41071 4月  29 2016 slf4j-api-1.7.21.jar
-rw-r--r-- 1 oracle oracle 1056032 4月  29 2016 snappy-java-1.1.2.4.jar

4 web加线加表

以获取utest用户下的t_customer表为例进行配置说明

4.1 测试用户初始化

4.2 源端OGG添加extract进程

在OGG所在的 ora-slave 服务器 上执行

4.2.1 确保mgr进程启动

#首先确保mgr进程启动
GGSCI> info mgr
Manager is running (IP port yourip.7890, Process ID 24092).

如果没有启动参考mgr启动

4.2.2 获取trail文件前缀

依次点击:数据源管理 -> 数据源管理 -> 生成OGG Trail前缀

这里会生成多个,去第一个就可以,我们这里举例 aa,接下来会用到

install-oracle-trail.png

4.2.2配置extract进程

#编辑extract进程配置文件
GGSCI> edit param extr01
#输入以下内容并保存
EXTRACT EXTR01
--数据库配置的字符集可以通过select userenv('language') from dual查询
SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
USERID ogg,PASSWORD ogg
RMTHOST ip, MGRPORT 7890 --这里的ip指的是安装Oracle GoldenGate for Big Data机器的ip
#这里的aa就是3.2.1上边生成的
rmttrail /u01/golden/dirdat/aa
DDL INCLUDE MAPPED
TRANLOGOPTIONS DBLOGREADER

TABLE UTEST.T_CUSTOMER;
TABLE DBUS.DB_FULL_PULL_REQUESTS;
TABLE DBUS.DB_HEARTBEAT_MONITOR;
TABLE DBUS.META_SYNC_EVENT;
TABLE DBUS.TEST_TABLE;

#制定抽取tranlog,这里的:now是参数值,也可以写一个固定的时间值
GGSCI> add extract extr01, tranlog, begin now

#添加远程,这里的aa就是3.2.1上边生成的
GGSCI> add rmttrail /u01/golden/dirdat/aa, extract extr01
#启动抽取进程
GGSCI> start extr01
#确认启动成功
GGSCI> info extr01
# Status RUNNING 表示启动成功
EXTRACT    EXTR01    Last Started 2018-01-24 12:03   Status RUNNING
Checkpoint Lag       00:00:00 (updated 00:00:05 ago)
Process ID           15216
Log Read Checkpoint  Oracle Redo Logs
                     2018-01-24 12:04:06  Seqno 4270, RBA 15248896
                     SCN 0.52999102 (52999102)
                     
# 如果出现
#ERROR   OGG-02091  Oracle GoldenGate Capture for Oracle, orcl.prm:  Operation not supported because enable_goldengate_replication is not set to true.
# 请在主库执行以下语句
SQL> alter system set enable_goldengate_replication=true;

#制定抽取tranlog,这里的:now是参数值,也可以写一个固定的时间值
GGSCI> add extract extr01, tranlog, begin now

#添加远程, 与上一步添加的配置一样
GGSCI> add rmttrail /u01/golden/dirdat/aa, extract extr01
#启动抽取进程
GGSCI> start extr01
#确认启动成功
GGSCI> info extr01
# Status RUNNING 表示启动成功
EXTRACT    EXTR01    Last Started 2018-09-05 13:52   Status RUNNING
Checkpoint Lag       00:00:00 (updated 00:00:32 ago)
Process ID           11396
Log Read Checkpoint  Oracle Redo Logs
			   2018-09-05 13:51:55  Seqno 47, RBA 11880464
			   SCN 0.0 (0)
				   
# 如果出现
#ERROR   OGG-02091  Oracle GoldenGate Capture for Oracle, orcl.prm:  Operation not supported because enable_goldengate_replication is not set to true.
# 请在主库执行以下语句
SQL> alter system set enable_goldengate_replication=true;
  

4.3 DBus 一键加线配置

​ 完成以上工作就到了真正加线加表的操作了

4.3.1数据源添加

登录dbus-keeper,进入数据源管理-添加数据源 页面如下图

图1 新建数据源

操作步骤说明

4.3.2 Schema和Table添加

操作步骤说明

  1. 启动Topology页面

    此处较之前,省去了clone zk的步骤,列表中显示需要启动的Topology信息,点击右侧的 启动 按钮可以启动相应的模块

3 验证结果

增量初始化验证

插入测试数据:

Shell> sqlplus utest/utest;
SQL> insert into utest.t_customer values (1, 'ALi', 28, 'BeiJing');
SQL> commit;

登录grafana观察监控数据:

全量数据验证:

登录dbus keeper,进入到 Table管理(表管理) 菜单,找到T_CUSTOMER表,点击独立拉全量 按钮后在弹出的确认对话框中选择 确定 ,拉全量发起成功后,该表的 status 会变成 waiting, 待全量模块处理完成后再次变成 ending 状态。 验证全量拉取是否成功,右侧操作栏,点击”查看拉全量状态”。install-mysql-10-fullpuller_status 全量拉取的信息存储在ZK上,Dbus keeper会读取的zk下相应节点的信息,来查看全量拉取状态。看结点信息中Status字段ß,其中splitting表示正在分片,pulling表示正在拉取,ending表示拉取成功。 install-mysql-11-fullpuller_status

5 附录

5.1 手动添加replicate进程

以下操作在服务器ogg-for-bigdata-server上执行

5.1.1 确保mgr进程启动

#首先确保mgr进程启动
GGSCI> info mgr
Manager is running (IP port yourip.7890, Process ID 24092).

如果没有启动参考mgr启动

5.1.2 配置replicat进程

#创建kafka_producer.properties文件
Shell> cd /u01/golden/dirprm/
Shell> vim kafka_producer.properties

#输入以下内容并保存
bootstrap.servers=dbus-n1:9092,dbus-n2:9092,dbus-n1:9092
acks=all
#compression.type=snappy
#compression.type=gzip
compression.type=lz4
reconnect.backoff.ms=1000
key.serializer=org.apache.kafka.common.serialization.StringSerializer
value.serializer=org.apache.kafka.common.serialization.ByteArraySerializer
batch.size=5242880
#batch.size=1048576
linger.ms=1000
max.request.size = 10485760
#创建oratest.props文件
Shell> cd /u01/golden/dirprm/
Shell> vim oratest.props

#输入以下内容并保存
gg.handlerlist = kafkahandler
gg.handler.kafkahandler.type = kafka
gg.handler.kafkahandler.KafkaProducerConfigFile = kafka_producer.properties
#需要和2.4.3 DBus相关配置中数据源设置的Topic相同
gg.handler.kafkahandler.topicMappingTemplate = oratest
gg.handler.kafkahandler.keyMappingTemplate = ${NULL}
#需要和2.4.3 DBus相关配置中数据源设置的SchemaTopic相同
gg.handler.kafkahandler.schemaTopicName = oratest_schema
gg.handler.kafkahandler.format = avro_op
gg.handler.kafkahandler.blockingSend = false
gg.handler.kafkahandler.includeTokens = true
gg.handler.kafkahandler.format.wrapMessageInGenericAvroMessage = true
gg.handler.kafkahandler.format.genericWrapperUseFingerprint = false
gg.handler.kafkahandler.format.treatAllColumnsAsStrings = true
gg.handler.name.format.versionSchemas = true
gg.handler.kafkahandler.mode = tx
gg.handler.kafkahandler.format.iso8601Format = true
goldengate.userexit.writers = javawriter
javawriter.stats.display = TRUE
javawriter.stats.full = TRUE
gg.log = log4j
gg.log.level = INFO
gg.report.time = 30sec
gg.classpath = dirprm/:kafka-jars/*:
javawriter.bootoptions = -Xmx512m -Xms32m -Djava.class.path=ggjava/ggjava.jar

5.1.3 添加和启动replicate进程

GGSCI> edit param oratest
#输入以下内容并保存
REPLICAT oratest
SETENV (NLS_LANG= SIMPLIFIED CHINESE_CHINA.AL32UTF8)
#props文件需要与上一节生成的props文件名称一致
TARGETDB LIBFILE libggjava.so SET property=dirprm/oratest.props
DDL INCLUDE ALL

GROUPTRANSOPS 500
MAXTRANSOPS 1000

MAP UTEST.T_CUSTOMER, TARGET UTEST.T_CUSTOMER;
MAP DBUS.DB_FULL_PULL_REQUESTS, TARGET DBUS.DB_FULL_PULL_REQUESTS;
MAP DBUS.DB_HEARTBEAT_MONITOR, TARGET DBUS.DB_HEARTBEAT_MONITOR;
MAP DBUS.META_SYNC_EVENT, TARGET DBUS.META_SYNC_EVENT;
#这里的aa就是3.2.1上边生成的
GGSCI> add replicat oratest, exttrail /u01/golden/dirdat/aa
GGSCI> start oratest
#验证启动是否成功
GGSCI> info oratest
REPLICAT   ORATEST   Last Started 2018-01-24 14:58   Status RUNNING
Checkpoint Lag       00:00:00 (updated 00:00:08 ago)
Process ID           21887
Log Read Checkpoint  File /u01/golden/dirdat/ab000000002
                     2018-01-24 12:02:37.818342  RBA 1472

详细信息请参考:

https://docs.oracle.com/goldengate/bd123110/gg-bd/GADBD/using-kafka-handler.htm#GADBD453