本文主要参考文档和博客如下:
https://dongkelun.com/2018/05/23/oggOracle2Kafka/
https://www.jianshu.com/p/b1e1fb623f15
原因是这样的:当我使用debezium插件对oracle进行cdc日志获取的时候发现我的oracle版本过低为11G,不支持
alter system set enable_goldengate_replication=true;
的属性(虽然不知有何影响),然后看了看debezium对于oracle连接器的说法为孵化阶段,所以就滚去OGG将oracle数据库ddl变更推到kafka了。
源端:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Oracle GoldenGate Manager for Oracle
Version 12.2.0.2.3 OGGCORE_12.2.0.2.0_PLATFORMS_170727.1430
Windows x64 (optimized),
目标端:
OGG_BigData_Linux_x64_19.1.0.0.1.tar
kafka2.12-2.4.0
sqlplus / as sysdba
archive log list --- 该命令为查看归档日志情况
conn / as sysdba (以DBA身份连接数据库)
shutdown immediate (立即关闭数据库)
startup mount (启动实例并加载数据库,但不打开)
alter database archivelog; (更改数据库为归档模式)
alter database open; (打开数据库)
alter system archive log start; (启用自动归档)
--查看辅助日志情况
select force_logging, supplemental_log_data_min from v$database;
alter database force logging;
alter database add supplemental log data;
--这里创建复制用户,便于管理
SQL> create tablespace oggtbs datafile 'C:\app\Administrator\product\oggdata\oggtbs01.dbf' size 1000M autoextend on;
Tablespace created.
SQL> create user ogg identified by ogg default tablespace oggtbs;
User created.
-- 根据实际给予相关权限,这里便于操作给予dba权限,实际需求中请给予正确的权限
SQL> grant dba to ogg;
Grant succeeded.
3. 启动OGG,进入到OGG安装目录,启动文件夹下的ggsci.exe程序
4.在ggsci.exe界面中执行以下命令
dblogin userid ogg password ogg --使用oracle复制用户进行登录
登录成功显示
Successfully logged into database.
下列该步骤可有可无。我试了下并没有影响:
GGSCI > edit param ./globals
添加内容
oggschema ogg
GGSCI > edit param mgr
PORT 7809
DYNAMICPORTLIST 7810-7909
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
ACCESSRULE, PROG SERVER, ALLOW; --记住以;结尾
上述说明:
PORT即mgr的默认监听端口;
DYNAMICPORTLIST动态端口列表,当指定的mgr端口不可用时,会在这个端口列表中选择一个,最大指定范围为256个;
AUTORESTART重启参数设置表示重启所有EXTRACT进程,最多5次,每次间隔3分钟;
PURGEOLDEXTRACTS即TRAIL文件的定期清理
下一步,添加复制表
GGSCI > add trandata test_ogg.test_ogg --此处填写自己需要同步的表 为 库名.表名 的形式编写,注意不要加;否则会找不到该表
Logging of supplemental redo data enabled for table TEST_OGG.TEST_OGG.
GGSCI > 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
GGSCI > edit param extkafka --具体名称自己取,便于管理
extract extkafka
dynamicresolution
SETENV (ORACLE_SID = "orcl")
SETENV (NLS_LANG = "american_america.AL32UTF8") --此处的编码问题也是个坑,可能会GBK问题
userid ogg,password ogg
exttrail c:\ogg\dirdat\to --此处为linux环境的话就填linux下的OGG位置,为windows即填windows位置
table test_ogg.test_ogg;
说明:
第一行指定extract进程名称;
dynamicresolution动态解析;
SETENV设置环境变量,这里分别设置了Oracle数据库以及字符集;
userid ggs,password ggs即OGG连接Oracle数据库的帐号密码,这里使用创建的复制帐号;
exttrail定义trail文件的保存位置以及文件名,注意这里文件名只能是2个字母(即会出现to0000000000这样的文件),其余部分OGG会补齐;
table即复制表的表名,支持*通配,必须以;结尾(这里为单表的形式进行测试)
添加extract进程:
GGSCI > add extract extkafka,tranlog,begin now
EXTRACT added.
添加trail文件的定义与extract进程绑定:
GGSCI (ambari.master.com) 17> add exttrail C:\app\Administrator\ogg122023\dirdat\to,extract extkafka
EXTTRAIL added.
--注意此处的位置依旧是linux环境和windows环境的位置不同,/和\也不同
pump进程本质上来说也是一个extract,只不过他的作用仅仅是把trail文件传递到目标端,配置过程和extract进程类似,只是逻辑上称之为pump进程。
GGSCI (ambari.master.com) 18> edit param pukafka
extract pukafka
passthru
dynamicresolution
userid ogg,password ogg
rmthost 192.168.44.129 mgrport 7809 --目标端的地址和端口
rmttrail /opt/ogg/dirdat/to --目标端的trail文件存储位置名称
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进程:
--注意第一条是源端路径,第二条命令是目标端路径,注意linux和windows地址写法
GGSCI > add extract pukafka,exttrailsource C:\app\Administrator\ogg122023\dirdat\to
EXTRACT added.
GGSCI > add rmttrail /opt/ogg/dirdat/to,extract pukafka
RMTTRAIL added.
Oracle与MySQL,Hadoop集群(HDFS,Hive,kafka等)等之间数据传输可以定义为异构数据类型的传输,故需要定义表之间的关系映射,在OGG命令行执行:
GGSCI > edit param test_ogg
defsfile C:\app\Administrator\ogg122023\dirdef\test_ogg.test_ogg
userid ogg,password ogg
table test_ogg.test_ogg;
在OGG主目录下执行命令,生成映射文件:
注意:linux和windows下的地址问题。
如果是linux下,则在ogg目录下执行该语句
./defgen paramfile dirprm/test_ogg.prm
如果是windows环境下,则进入OGG目录下,按住shift加右键打开powershell,执行下面命令
.\defgen.exe paramfile C:\app\Administrator\ogg122023\dirprm\test_oggg.prm
如下
将生成的test_ogg.test_ogg(自己命名)的文件移动到目标端(好像目标端还没配置。。)的dirdef文件夹下。
此时,源端的配置基本完成。
我们假设已经装好了kafka环境。
与上述源端配置相同,此处是linux下的目标端,所以将压缩包解压完毕。
此处解压到/usr/local/tools/app/ogg目录下
tar -xvf ggs_Adapters_Linux_x64.tar
同理,进行ggsci命令行:
ggsci
此处关于mgr配置基本与源端相似了
mgr文件配置
GGSCI > edit param mgr
PORT 7809
DYNAMICPORTLIST 7810-7909
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
ACCESSRULE, PROG SERVER, ALLOW;
edit param ./GLOBALS
CHECKPOINTTABLE test_ogg.checkpoint
GGSCI > 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即源端与目标端的映射关系。
注意:该版本下的dirprm目录下只有刚刚生成的mgr.mgr文件,并没有kafka.props等配置文件,所以需要去
下面的
拿到配置文件并复制到到dirprm文件夹下。
此处拉取kafka.props和custom_kafka_producer.properties文件。
1. 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_2.11-2.4.0/libs/*:/opt/ogg/:/opt/ogg/lib/*
注意:gg.classpath配置kafka和ogg的libs位置,不然启动的时候读取不到相关jar包,会报错
2. custom_kafka_producer.properties
bootstrap.servers=192.168.44.129: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
GGSCI > add replicat rekafka exttrail /usr/local/tools/app/ogg/dirdat/to,checkpointtable test_ogg.checkpoint
REPLICAT added.
如果上述操作都完成并没有报错ERROR情况,则接下来进行最终测试。
源端目标端都在ggsci命令行下输入命令启动进程。
他们说按照顺序启动
start mgr
start extkafka
start pukafka
启动成功,则会看到三个窗口弹出,并无明显错误信息、无窗口闪退情况:
start mgr
start rekafka
在ggsci命令行中使用
GGSCI > info all
可以查看启动信息
例如:
看到自己启动的进程为RUNNING状态则为启动成功。
若有问题(窗口闪退,报错启动失败),可以查看系统日志:
1. windows下
ogg目录下的ggserr.log日志文件
也可以在ggsci下使用下列命令查看
view report extkafka --这个取决于你的名称是什么,比如是extkafka
2. linux下
与windows相同,但是对于kafka报错可以去
连接oracle,使用刚刚创建的测试表进行插入等语句测试:
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;
注意:这里一定要commit,才可以提交并监测到数据变化。
此时,发现源端和目标端的dirdat文件夹下生成了to0000的文件。
查看kafka的主题情况:
bin/kafka-topics.sh --list --zookeeper localhost:2181
主题创建成功。
消费该test_ogg主题,即监控的表:
能读取到其变化,此时全部步骤完成。
参考:https://blog.csdn.net/u010457406/article/details/75646547
SHUTDOWN IMMEDIATE; --同样需要关闭数据库
STARTUP MOUNT EXCLUSIVE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USEAL32UTF8; --此处加上了INTENAL_USER
SHUTDOWN immediate;
startup;
custom_kafka_producer.properties配置文件中,序列化与反序列化中选择ByteArray。若是选择String则会报错,待解决。
ByteArraySerializer不影响消费(即乱码问题没有出现)
如果想通配整个库的话,只需要把上面的配置所有表名的改为,如test_ogg.test_ogg改为 test_ogg.,但是kafka的topic不能通配,所以需要把所有的表的数据放在一个topic即可,后面再用程序解析表名即可。
可以说查找了挺多的文章博客和官网文档说明,一开始根本找不到之前版本的OGG插件包,然后梯子出去官网下载的根本没有12版本的包,最后还是百度搜索进去才下载好的。
当我很开心看到了有大佬配置的文章,虽然是linux下的配置,但是还是挺舒服解决了这个配置问题。
所以这里是windows下源端的配置,总结到这里。
另外Oracle我想骂娘了,配置这么复杂真的有人用吗(哦,我用啊,那没事了),何况我一开始想好好写这个配置文章的,当我写到后面发现这么长,这么繁琐。当真不想写下去了。前面老哥完整记录下来真的辛苦了。
另外,关于这个配置,我没有进行多表、全库、正则匹配表的尝试。或许之后工作需要会进行填坑。
配置是真的繁琐!!!
文章或许有表名不同的情况,请自行修改。