ogg即Oracle GoldenGate是Oracle的同步工具,本文讲如何配置ogg以实现Oracle数据库增量数据实时同步到kafka中,其中同步消息格式为json。
下面是源端和目标端的一些配置信息:
-- | 版本 | OGG版本 | IP | 别名 |
源端 | OracleRelease 11.2.0.4.0 | Oracle GoldenGate 12.3.0.1.4 for Oracle on Linux x86-64 | 192.168.245.138 | oraclepc |
目标端 | kafka_2.11-2.4.0 | Oracle GoldenGate for Big Data 12.3.2.1.1 on Linux x86-64 | 192.168.245.137 | streamsets |
效果
- 源端事务型操作
- 目标端kafka流数据
1、下载
源端-目标端都可以在以下地址下载,关键词搜索即可
https://edelivery.oracle.com/osdc/faces/SoftwareDelivery
目标端最新版下载
https://www.oracle.com/middleware/technologies/goldengate-downloads.html
下载后效果 我将文件重命名为以下名字,后续操作都以以下名字操作
2、源端配置
注意:源端是安装了oracle的机器,oracle环境变量之前都配置好了
2.1 解压\安装
2.1.1先建立ogg目录(此操作需要root用户)
mkdir -p /opt/ogg
chown -R oracle:oinstall /opt/ogg (使oracle用户有ogg的权限,后面有些需要在oracle用户下执行才能成功)
unzip oggoracle12.zip
2.1.2解压后得到OGG安装文件夹
cd /opt/ogg/fbo_ggs_Linux_x64_shiphome
2.1.3启动安装(需要在oracle用户下执行以下操作)安装方式为界面安装 安装过程oracle服务需要启动
cd /opt/ogg/fbo_ggs_Linux_x64_shiphome/Disk1
./runInstaller -jreLoc /etc/alternatives/jre_1.8.0
2.1.3.1此时会出现一个安装界面,选择第二项
2.1.3.2点击next出现安装软件位置的界面
2.1.3.3点击next,默认值
2.1.3.4点击install开始安装,等待安装完毕
2.1.3.5提示安装成功
2.2 配置ogg环境变量
为了简单方便起见,在/etc/profile里配置的,建议在生产中配置oracle的环境变量文件/home/oracle/.bash_profile里配置,为了怕出问题,我把OGG_HOME等环境变量在/etc/profile配置了一份。
vim /etc/profile
export ORACLE_BASE=/data/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
export OGG_HOME=/opt/ogg
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
export PATH=$OGG_HOME:$PATH
使之生效
source /etc/profile
测试一下ogg命令(不生效可重新开一个窗口输入命令)
ggsci
2.3 oracle打开归档模式
su oracle
source ~/.bash_profile
sqlplus / as sysdba
执行下面的命令查看当前是否为归档模式
archive log list
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 12
Current log sequence 14
若为Disabled,手动打开即可
conn / as sysdba (以DBA身份连接数据库)
shutdown immediate (立即关闭数据库)
startup mount (启动实例并加载数据库,但不打开)
alter database archivelog; (更改数据库为归档模式)
alter database open; (打开数据库)
alter system archive log start; (启用自动归档)
再执行一下
archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 12
Next log sequence to archive 14
Current log sequence 14
可以看到为Enabled,则成功打开归档模式。
2.4 Oracle打开日志相关
OGG基于辅助日志等进行实时传输,故需要打开相关日志确保可获取事务内容,通过下面的命令查看该状态
select force_logging, supplemental_log_data_min from v$database;
FORCE_ SUPPLEMENTAL_LOG
------ ----------------
NO NO
若为NO,则需要通过命令修改
alter database force logging;
alter database add supplemental log data;
再查看一下为YES即可
SQL> select force_logging, supplemental_log_data_min from v$database;
FORCE_ SUPPLEMENTAL_LOG
------ ----------------
YES YES
2.5 oracle创建复制用户
首先root用户建立相关文件夹,并赋予权限
mkdir -p /data/oracle/tablespace
chown -R oracle:oinstall /data/oracle/tablespace
然后执行下面sql
SQL> create tablespace oggtbs datafile '/data/oracle/tablespace/oggtbs01.dbf' size 1000M autoextend on;
Tablespace created.
SQL> create user ogg identified by ogg default tablespace oggtbs;
User created.
SQL> grant dba to ogg;
Grant succeeded.
2.6 OGG初始化
这里特别注意源端和目标端的ogg目录要保持一致
ggsci
create subdirs
ggsci
GGSCI (oraclepc) 1> create subdirs
Creating subdirectories under current directory /root
Parameter files /opt/ogg/dirprm: created
Report files /opt/ogg/dirrpt: created
Checkpoint files /opt/ogg/dirchk: created
Process status files /opt/ogg/dirpcs: created
SQL script files /opt/ogg/dirsql: created
Database definitions files /opt/ogg/dirdef: created
Extract data files /opt/ogg/dirdat: created
Temporary files /opt/ogg/dirtmp: created
Stdout files /opt/ogg/dirout: created
GGSCI (oraclepc) 2>
2.7 Oracle创建测试表
创建一个用户,在该用户下新建测试表,用户名、密码、表名均为 test_ogg。
create user test_ogg identified by test_ogg default tablespace users;
grant dba to test_ogg;
conn test_ogg/test_ogg;
create table test_ogg(id int ,name varchar(20),primary key(id));
3、目标端(kafka)配置
mkdir -p /opt/ogg
unzip oggbigdata12.3.zip
tar xvf OGG_BigData_Linux_x64_12.3.2.1.1.tar -C /opt/ogg/
3.2 环境变量
vim /etc/profile
export OGG_HOME=/opt/ogg
export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64:$JAVA_HOME/jre/lib/amd64/server:$JAVA_HOME/jre/lib/amd64/libjsig.so:$JAVA_HOME/jre/lib/amd64/server/libjvm.so:$OGG_HOME/lib
export PATH=$OGG_HOME:$PATH
source /etc/profile
同样测试一下ogg命令(不生效重新打开窗口执行)
ggsci
3.3 初始化目录
create subdirs
4、OGG源端配置
4.1 配置OGG的全局变量
先切换到oracle用户下
su oracle
cd /opt/ogg
ggsci
GGSCI (oraclepc) 1> dblogin userid ogg password ogg
Successfully logged into database.
GGSCI (oraclepc) 2> edit param ./globals
然后和用vim编辑一样添加
oggschema ogg
4.2 配置管理器mgr
GGSCI (oraclepc) 3> edit param mgr
PORT 7809
DYNAMICPORTLIST 7810-7909
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
说明:PORT即mgr的默认监听端口;DYNAMICPORTLIST动态端口列表,当指定的mgr端口不可用时,会在这个端口列表中选择一个,最大指定范围为256个;AUTORESTART重启参数设置表示重启所有EXTRACT进程,最多5次,每次间隔3分钟;PURGEOLDEXTRACTS即TRAIL文件的定期清理
4.3 添加复制表
GGSCI (oraclepc) 4> add trandata test_ogg.test_ogg
Logging of supplemental redo data enabled for table TEST_OGG.TEST_OGG.
GGSCI (oraclepc) 5> info trandata test_ogg.test_ogg
Logging of supplemental redo log data is enabled for table TEST_OGG.TEST_OGG.
Columns supplementally logged for table TEST_OGG.TEST_OGG: ID
4.4 配置extract进程
配置1(有的orcl使用SID方式会连不上数据库,报错的话可采用配置2)
GGSCI (oraclepc) 6> edit param extkafka
extract extkafka
dynamicresolution
SETENV (ORACLE_SID = "orcl")
SETENV (NLS_LANG = "american_america.AL32UTF8")
userid ogg,password ogg
exttrail /opt/ogg/dirdat/to
table test_ogg.test_ogg;
配置2
extract extkafka
dynamicresolution
SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")
userid ogg@orcl,password ogg
exttrail /opt/ogg/dirdat/to
table test_ogg.test_ogg;
说明:第一行指定extract进程名称;dynamicresolution动态解析;SETENV设置环境变量,这里分别设置了Oracle数据库以及字符集;userid ggs,password ggs即OGG连接Oracle数据库的帐号密码,这里使用2.5中特意创建的复制帐号;exttrail定义trail文件的保存位置以及文件名,注意这里文件名只能是2个字母,其余部分OGG会补齐;table即复制表的表名,支持*通配,必须以;结尾
添加extract进程:
GGSCI (oraclepc) 16> add extract extkafka,tranlog,begin now
EXTRACT added.
添加trail文件的定义与extract进程绑定:
GGSCI (oraclepc) 17> add exttrail /opt/ogg/dirdat/to,extract extkafka
EXTTRAIL added.
4.5 配置pump进程
pump进程本质上来说也是一个extract,只不过他的作用仅仅是把trail文件传递到目标端,配置过程和extract进程类似,只是逻辑上称之为pump进程
GGSCI (oraclepc) 18> edit param pukafka
extract pukafka
passthru
dynamicresolution
userid ogg,password ogg
rmthost 192.168.226.137 mgrport 7809
rmttrail /opt/ogg/dirdat/to
table test_ogg.test_ogg;
说明:第一行指定extract进程名称;passthru即禁止OGG与Oracle交互,我们这里使用pump逻辑传输,故禁止即可;dynamicresolution动态解析;userid ogg,password ogg即OGG连接Oracle数据库的帐号密码rmthost和mgrhost即目标端(kafka)OGG的mgr服务的地址以及监听端口;rmttrail即目标端trail文件存储位置以及名称。
分别将本地trail文件和目标端的trail文件绑定到extract进程:
GGSCI (oraclepc) 1> add extract pukafka,exttrailsource /opt/ogg/dirdat/to
EXTRACT added.
GGSCI (oraclepc) 2> add rmttrail /opt/ogg/dirdat/to,extract pukafka
RMTTRAIL added.
4.6 配置define文件
Oracle与MySQL,Hadoop集群(HDFS,Hive,kafka等)等之间数据传输可以定义为异构数据类型的传输,故需要定义表之间的关系映射,在OGG命令行执行:
GGSCI (oraclepc) 3> edit param test_ogg
defsfile /opt/ogg/dirdef/test_ogg.test_ogg
userid ogg,password ogg
table test_ogg.test_ogg;
在OGG主目录下执行(oracle用户):
./defgen paramfile dirprm/test_ogg.prm
***********************************************************************
Oracle GoldenGate Table Definition Generator for Oracle
Version 12.3.0.1.4 OGGCORE_12.3.0.1.0_PLATFORMS_180415.0359
Linux, x64, 64bit (optimized), Oracle 11g on Apr 15 2018 10:11:00
Copyright (C) 1995, 2018, Oracle and/or its affiliates. All rights reserved.
Starting at 2021-04-23 03:05:24
***********************************************************************
Operating System Version:
Linux
Version #1 SMP Fri Apr 20 16:44:24 UTC 2018, Release 3.10.0-862.el7.x86_64
Node: oraclepc
Machine: x86_64
soft limit hard limit
Address Space Size : unlimited unlimited
Heap Size : unlimited unlimited
File Size : unlimited unlimited
CPU Time : unlimited unlimited
Process id: 6931
***********************************************************************
** Running with the following parameters **
***********************************************************************
defsfile /opt/ogg/dirdef/test_ogg.test_ogg
userid ogg,password ***
table test_ogg.test_ogg;
Retrieving definition for TEST_OGG.TEST_OGG.
Definitions generated for 1 table in /opt/ogg/dirdef/test_ogg.test_ogg.
将生成的/opt/ogg/dirdef/test_ogg.test_ogg发送的目标端ogg目录下的dirdef里:
scp -r /opt/ogg/dirdef/test_ogg.test_ogg root@192.168.226.137:/opt/ogg/dirdef/
5、OGG目标端配置
5.1 开启kafka服务
略
5.2 配置管理器mgr
GGSCI (streamsets) 1> edit param mgr
PORT 7809
DYNAMICPORTLIST 7810-7909
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
5.3 配置checkpoint
checkpoint即复制可追溯的一个偏移量记录,在全局配置里添加checkpoint表即可。
edit param ./GLOBALS
CHECKPOINTTABLE test_ogg.checkpoint
5.4 配置replicate进程
GGSCI (streamsets) 4> edit param rekafka
REPLICAT rekafka
sourcedefs /opt/ogg/dirdef/test_ogg.test_ogg
TARGETDB LIBFILE libggjava.so SET property=dirprm/kafka.props
REPORTCOUNT EVERY 1 MINUTES, RATE
GROUPTRANSOPS 10000
MAP test_ogg.test_ogg, TARGET test_ogg.test_ogg;
说明:REPLICATE rekafka定义rep进程名称;sourcedefs即在4.6中在源服务器上做的表映射文件;TARGETDB LIBFILE即定义kafka一些适配性的库文件以及配置文件,配置文件位于OGG主目录下的dirprm/kafka.props;REPORTCOUNT即复制任务的报告生成频率;GROUPTRANSOPS为以事务传输时,事务合并的单位,减少IO操作;MAP即源端与目标端的映射关系
5.5 配置kafka.props
cd /opt/ogg/dirprm/
vim kafka.props
gg.handlerlist=kafkahandler //handler类型
gg.handler.kafkahandler.type=kafka
gg.handler.kafkahandler.KafkaProducerConfigFile=custom_kafka_producer.properties //kafka相关配置
gg.handler.kafkahandler.topicMappingTemplate=test_ogg //kafka的topic名称,无需手动创建
gg.handler.kafkahandler.format=json //传输文件的格式,支持json,xml等
gg.handler.kafkahandler.mode=op //OGG for Big Data中传输模式,即op为一次SQL传输一次,tx为一次事务传输一次
gg.classpath=dirprm/:/opt/kafka/libs/*:/opt/ogg/:/opt/ogg/lib/*
dirprm/:/opt/kafka/libs/此地址为kafka所在地址下libs
vim custom_kafka_producer.properties
bootstrap.servers=192.168.226.139:9092 //kafkabroker的地址
acks=1
# compression.type=gzip //压缩类型
reconnect.backoff.ms=1000 //重连延时
value.serializer=org.apache.kafka.common.serialization.ByteArraySerializer
key.serializer=org.apache.kafka.common.serialization.ByteArraySerializer
batch.size=102400
linger.ms=10000
其中需要将后面的注释去掉,ogg不识别注释,如果不去掉会报错
5.6 添加trail文件到replicate进程
GGSCI (streamsets) 2> add replicat rekafka exttrail /opt/ogg/dirdat/to,checkpointtable test_ogg.checkpoint
REPLICAT added.
6、测试
6.1 启动所有进程
在源端和目标端的OGG命令行下使用start 进程名的形式启动所有进程。 启动顺序按照源mgr——目标mgr——源extract——源pump——目标replicate来完成。 全部需要在ogg目录下执行ggsci目录进入ogg命令行。 源端依次是
start mgr
start extkafka
start pukafka
目标端
start mgr
start rekafka
可以通过info all 或者info 进程名 查看状态,所有的进程都为RUNNING才算成功 源端
GGSCI (oraclepc) 5> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXTKAFKA 04:50:21 00:00:03
EXTRACT RUNNING PUKAFKA 00:00:00 00:00:03
目标端
GGSCI (streamsets) 3> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING REKAFKA 00:00:00 00:00:01
6.2 异常解决
如果有不是RUNNING可通过查看日志的方法检查解决问题,ogg命令行,以rekafka进程为例
GGSCI (streamsets) 2> view report rekafka
Operation not supported because enable_goldengate_replication is not set to true
sqlplus / as sysdba
SQL> ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION = TRUE;
6.3 日志查看 (可开启两个窗口查看执行日志)
cd /opt/ogg
tail -f ggserr.log
6.4测试同步更新效果
现在源端执行sql语句
conn test_ogg/test_ogg
insert into test_ogg values(1,'test');
commit;
update test_ogg set name='zhangsan' where id=1;
commit;
delete test_ogg where id=1;
commit;
查看源端trail文件状态
[oracle@oraclepc opt]$ ls -l /opt/ogg/dirdat/to*
-rw-r----- 1 oracle oinstall 2353 8月 29 06:41 /opt/ogg/dirdat/to000000000
查看目标端trail文件状态
[root@streamsets ogg]# ls -l /opt/ogg/dirdat/to*
-rw-r-----. 1 root root 2392 Aug 28 15:41 /opt/ogg/dirdat/to000000000
查看kafka是否自动建立对应的主题
[root@streamsets kafka]# bin/kafka-topics.sh --list --zookeeper localhost:2181
__consumer_offsets
test1
test_ogg
在列表中显示有test_ogg则表示没问题
通过消费者看是否有同步消息
[root@streamsets ~]# bin/kafka-console-consumer.sh --bootstrap-server 192.168.245.137:9092 --topic test_ogg --from-beginning