Oracle Goldengate (ogg)配置和安装
一、环境信息
ogg安装分为两个版本,源端和目标端安装版本信息不同,源端版本大于或等于oracle版本,目标端大于或等于源端ogg版本即可,具体信息如下
版本 | ip | 主机名映射 | |
---|---|---|---|
源端 | Oracle GoldenGate 11.2.1.0.3 for Oracle on Linux x86-64 | 192.168.56.20 | jzy |
目标端 | Oracle GoldenGate for Big Data 12.3.1.1.1 on Linux x86-64 | 192.168.56.10 | jzy01 |
ogg资源至官网下载,或者通过如下提供资源安装
链接:https://pan.baidu.com/s/1PjfnHsrsFvGIrODz6FmYIA
提取码:kx3e
下载包含如下内容
# 源端
V34339-01.zip
# 目标端
V971332-01.zip
二、源端安装
2.1 源端ogg相关
- 建立目录并解压ogg至对应目录
mkdir /opt/soft/ogg
unzip V34339-01.zip -d /opt/soft/ogg/
# 解压后得到一个ogg的tar类型压缩包,在该目录下进行解压
tar xf fbo_ggs_Linux_x64_ora11g_64bit.tar
# 使oracle用户具有ogg的权限
chown -R oracle:oinstall /opt/soft/ogg/
-
配置环境变量
编辑文件
vi /etc/profile
export OGG_HOME=/opt/soft/ogg
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
export PATH=$OGG_HOME:$PATH
- 使环境变量生效
source /etc/profile
- 使用oracle用户测试ogg命令
su - oracle
ggsci
- 初始化ogg目录
create subdirs
2.2 源端Oracle相关
- oracle打开归档模式
su - oracle
sqlplus / as sysdba
- 检查是否为归档模式
archive log list
如下disabled为关闭,enabled则为开启
- 顺序执行打开归档模式,如归档模式已打开则跳过
shutdown immediate (立即关闭数据库)
startup mount (启动实例并加载数据库,但不打开)
alter database archivelog; (更改数据库为归档模式)
alter database open; (打开数据库)
alter system archive log start; (启用自动归档)
-
Oracle打开日志相关
OGG基于辅助日志等进行实时传输,故需要打开相关日志确保可获取事务内容,通过下面的命令查看该状态
select force_logging, supplemental_log_data_min from v$database;
若为NO,则需要通过命令修改
alter database force logging;
alter database add supplemental log data;
-
Oracle开启全列补充日志
使用如下命令查看是否开启
select supplemental_log_data_all from v$database;
若为No,则通过如下命令开启
alter database add supplemental log data(all) columns;
-
Oracle创建复制用户
首先root用户建立相关文件夹,并赋予权限
mkdir -p /home/oracle/app/oracle/oggdata/orcl
chown -R oracle:oinstall /home/oracle/app/oracle/oggdata/orcl
执行如下sql
SQL> create tablespace oggtbs datafile '/home/oracle/app/oracle/oggdata/orcl/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.
- Oracle创建一个表用于测试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));
三、目标端安装
- 建立目录并解压ogg至对应目录
mkdir /opt/soft/ogg
unzip V971332-01.zip -d /opt/soft/ogg/
# 解压后得到一个ogg的tar类型压缩包,在该目录下进行解压
cd /opt/soft/ogg
tar xf fbo_ggs_Linux_x64_ora11g_64bit.tar
-
配置环境变量
编辑文件
vim /etc/profile
,末尾添加如下内容
# OGG_HOME
export OGG_HOME=/opt/soft/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初始化目录
cd /opt/soft/ogg
ggsci
create subdirs
四、开始配置投递
投递消息配置(以test_ogg表为例)
4.1 OGG源端配置
- 切换到oracle用户,执行如下命令
su - oracle
cd /opt/soft/ogg
ggsci
# 登入ogg数据库
GGSCI (jzy) 1> dblogin userid ogg password ogg
Successfully logged into database.
- 编辑globals文件(上文1中进入目录cd请严格执行,因为配置文件中很多采用./格式,如果不希望产生错误请全部修改为绝对路径)
GGSCI (jzy) 2> edit param ./globals
# 添加如下内容
oggschema ogg
- 配置管理器mgr(开启用于管理各个进程)
GGSCI (jzy) 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文件的定期清理
- 添加复制表
GGSCI (jzy) 4> add trandata test_ogg.test_og
# 查看是否添加
GGSCI (jzy) 5> info trandata test_ogg.test_ogg
注:
这里以test_ogg为例,只有一张表,实际生产环境可能有多个表需要复制,这里支持统配符的形式,可以使用通配符添加多个复制表,如:add trandata test_ogg.*
这种形式即可添加库中所有的表为复制表
- 配置extract进程 注意:所有进程名不能超过8个字符,否则报错
GGSCI (jzy) 6> edit param extkafka
#添加如下内容
extract extkafka
dynamicresolution
SETENV (ORACLE_SID = "orcl")
SETENV (NLS_LANG = "american_america.AL32UTF8")
userid ogg,password ogg
exttrail /opt/soft/ogg/dirdat/to
table test_ogg.test_ogg;
注:
说明:
第一行指定extract进程名称;
dynamicresolution
动态解析;
SETENV
设置环境变量,这里分别设置了Oracle数据库以及字符集;
userid ggs,password ggs
即OGG连接Oracle数据库的帐号密码,即前面的复制帐号ogg;
exttrail定义trail文件的保存位置以及文件名,注意这里文件名只能是2个字母,其余部分OGG会补齐;此外如果投递目标方也有其他源投递进去,请注意不要与其他源的trail文件保存位置名重复
table即复制表的表名,支持*通配,必须以;结尾,==多表投递可以使用table test_ogg.*
的形式
- 添加extract进程
GGSCI (jzy) 7> add extract extkafka,tranlog,begin now
# 如果报错ERROR: Could not create checkpoint file,可能是初始化目录没有创建完成,再次执行create subdirs即可
添加trail文件的定义与extract进程绑定
GGSCI (jzy) 10> add exttrail /opt/soft/ogg/dirdat/to,extract extkafka
- 配置pump进程
pump进程本质上来说也是一个extract,只不过他的作用仅仅是把trail文件传递到目标端,配置过程和extract进程类似,只是逻辑上称之为pump进程
GGSCI (jzy) 11> edit param pukafka
# 添加如下内容
extract pukafka
passthru
dynamicresolution
userid ogg,password ogg
rmthost 192.168.56.10 mgrport 7809
rmttrail /opt/soft/ogg/dirdat/to
table test_ogg.test_ogg;
注:
第一行指定extract进程名称;
passthru
即禁止OGG与Oracle交互,我们这里使用pump逻辑传输,故禁止即可;
dynamicresolution
动态解析;
userid ogg,password ogg
即OGG连接Oracle数据库的帐号密码;
rmthost
和mgrport
即目标端(kafka)OGG的mgr服务的地址以及监听端口;
rmttrail
即目标端trail文件存储位置以及名称。
- 分别将本地trail文件和目标端的trail文件绑定到extract进程:
#本地
GGSCI (jzy) 12> add extract pukafka,exttrailsource /opt/soft/ogg/dirdat/to
#目标端
GGSCI (jzy) 13> add rmttrail /opt/soft/ogg/dirdat/to,extract pukafka
- 配置define文件
Oracle与MySQL,Hadoop集群(HDFS,Hive,kafka等)等之间数据传输可以定义为异构数据类型的传输,故需要定义表之间的关系映射,在OGG命令行执行:
GGSCI (jzy) 14> edit param test_ogg
defsfile /opt/soft/ogg/dirdef/test_ogg.def
userid ogg,password ogg
table test_ogg.test_ogg;
支持通配符形式table test_ogg.*;
- 进入OGG主目录下执行如下命令
[root@jzy ~]# su - oracle
[oracle@jzy ~]$ cd /opt/soft/ogg/
[oracle@jzy ogg]$ ./defgen paramfile dirprm/test_ogg.prm
- 执行后将会在dirdef目录下生成test_ogg.test_ogg文件,将该文件发送到目标端同等目录下
[oracle@jzy ogg]$ exit
[root@jzy ~]# scp -r /opt/soft/ogg/dirdef/test_ogg.def root@jzy01:/opt/soft/ogg/dirdef/
4.2 OGG目标端配置
- 配置管理器mgr
cd /opt/soft/ogg
ggsci
GGSCI (jzy01) 2> edit param mgr
# 添加如下内容
PORT 7809
DYNAMICPORTLIST 7810-7909
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
- 配置checkpoint
GGSCI (jzy01) 3> edit param ./GLOBALS
# 添加如下内容
CHECKPOINTTABLE test_ogg.checkpoint
- 配置replicat进程
GGSCI (jzy01) 4> edit param rekafka
# 添加如下内容
REPLICAT rekafka
sourcedefs /opt/soft/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
即在在源ogg端发送过来的表映射文件;
TARGETDB LIBFILE
即定义kafka一些适配性的库文件以及配置文件,配置文件位于OGG主目录下的dirprm/kafka.props;
REPORTCOUNT
即复制任务的报告生成频率;
GROUPTRANSOPS
为以事务传输时,事务合并的单位,减少IO操作;
MAP
即源端与目标端的映射关系,多表支持通配符形式,如:MAP test_ogg.*, TARGET test_ogg.*;
- 配置kafka.props
[root@jzy01 ~]# cd /opt/soft/ogg/dirprm/
[root@jzy01 dirprm]# vim kafka.props
# 添加如下内容
gg.handlerlist=kafkahandler
gg.handler.kafkahandler.type=kafka
gg.handler.kafkahandler.KafkaProducerConfigFile=custom_kafka_producer.properties
gg.handler.kafkahandler.topicMappingTemplate=test_ogg
gg.handler.kafkahandler.format=json
gg.handler.kafkahandler.format.includePrimaryKeys=true
gg.handler.kafkahandler.mode=op
gg.classpath=dirprm/:/opt/soft/kafka212/libs/*:/opt/soft/ogg/:/opt/soft/ogg/lib/*
注:
gg.classpath
该行配置的路径相关为该服务器上kafka的lib路径
生成的topic可以使用如下形式动态生成,每一张表对应一个topic:
gg.handler.kafkahandler.topicMappingTemplate=${tableName}
- 配置kafka连接参数
vim custom_kafka_producer.properties
# 添加如下内容
bootstrap.servers=192.168.56.10:9092
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
- 添加trail文件到replicat进程
GGSCI (jzy01) 5> add replicat rekafka exttrail /opt/soft/ogg/dirdat/to,checkpointtable test_ogg.checkpoint
以上所有内容配置完成,下面可以对配置中得test_ogg做相关测试。
五、 测试
- 目标端打开kafka相关
[root@jzy01 dirprm]# zkServer.sh start
[root@jzy01 dirprm]# kafka-server-start.sh /opt/soft/kafka212/config/server.properties
- 启动ogg所有进程
启动顺序:
源mgr -> 目标mgr -> 源extract -> 源pump -> 目标replicat
源端
start mgr
start extkafka
start pukafka
目标端
start mgr
start rekafka
可以通过info all
查看所有进程启动信息
如果启动不了,可以去ogg主目录查看相关日志信息
- 改变测试表信息,插入一条数据
conn test_ogg/test_ogg
insert into test_ogg values(1,'zhangsan');
commit;
- 此时表信息发生变化,可以去目标端服务器查看kafka自动创建了test_ogg的topic,消费test_ogg消息可以查看到变化的信息,如下
# 查看topic,发现自动创建的topic
[root@jzy01 ~]# kafka-topics.sh --zookeeper jzy01:2181 --list
test_ogg
# 消费topic,查看投递信息如下
[root@jzy01 ~]# kafka-console-consumer.sh --bootstrap-server jzy01:9092 --from-beginning --topic test_ogg
{"table":"TEST_OGG.TEST_OGG","op_type":"I","op_ts":"2021-04-19 14:31:36.729546","current_ts":"2021-04-19T14:31:41.548000","pos":"00000000000000001062","after":{"ID":1,"NAME":"zhangsan"}}
- 改变测试表信息,插入一条数据
conn test_ogg/test_ogg
insert into test_ogg values(1,'zhangsan');
commit;
- 此时表信息发生变化,可以去目标端服务器查看kafka自动创建了test_ogg的topic,消费test_ogg消息可以查看到变化的信息,如下
# 查看topic,发现自动创建的topic
[root@jzy01 ~]# kafka-topics.sh --zookeeper jzy01:2181 --list
test_ogg
# 消费topic,查看投递信息如下
[root@jzy01 ~]# kafka-console-consumer.sh --bootstrap-server jzy01:9092 --from-beginning --topic test_ogg
{"table":"TEST_OGG.TEST_OGG","op_type":"I","op_ts":"2021-04-19 14:31:36.729546","current_ts":"2021-04-19T14:31:41.548000","pos":"00000000000000001062","after":{"ID":1,"NAME":"zhangsan"}}