前言

Oracle Goldengate在很早前就推出了一个for java的版本,主要目的是方便把关系型数据实时写入到不支持的目标端,如JMS或Redis等key value数据库。在Hadoop刚出来的时候,也可以使用ogg for java adapter将数据实时投递到HDFS等平台,只是后来专门推出了一个ogg for bigdata版本,可以不用二次开发,即可将数据实时投递到hbase ,hive, kafka, mongodb等。所以,针对不支持的目标端,还是需要使用ogg for java adapter进行二次开发和投递。

官网上的OGG for java adapter介质:

官网上ogg for bigdata介质:


架构

针对ogg for java adapter,常用的架构如下:

OGG for java adapter可用于将增量数据实时写入到flatfile,通过ETL的Load,加载到DW中,实现实时数据仓库的加载和分析。如下架构:


配置

针对ogg for java adapter,还是需要配置传统的source extract,目标端也需要配置replicat,但此时,是调用自己开发的java投递程序。而OGG提供有一套框架接口,开发人员只需要实现对应的接口和重载部分函数,即可完成获取增量数据,获取表结构定义,数据变更类型(Insert/update/delete等),事务控制等操作,从而实现自定义的数据投递。


源端抽取配置

1、oracle goldengate要求数据库日志为存档模式

CMD> set ORACLE_SID=jxk

CMD> sqlplus / as sysdba

SQL> archive log list;(查看数据库日志模式)

(1)如数据库模式为禁用存档模式,且数据库正在运行,需要先将数据库先关闭,再启动,并修改配置

SQL> shutdown immediate;

注:shutdown immediate可以强行结束或回滚正在执行的事务、进程就可以close DB

SQL> startup mount;

SQL> alter database archivelog;

SQL> alter database open;

SQL> alter database force logging;

SQL> alter database add supplemental log data(primary key,unique) columns;

SQL> alter system archive log current;

2、oracle推荐新建专用同步用户,执行ogg操作,与业务用户做区分。

SQL> create user ogg identified by ogg;

SQL>grant dba to ogg;

3、对需要同步的表生成对应的表结构信息(针对OGG12.2以下的版本)

编辑 $OGG_HOME/def.prm

defsfile busiuser.def --文件名

USERID ogg, PASSWORD ogg --ogg数据库同步用户

table busiuser.iy01; --需要同步的表

table newuser.*;

cd E:/ogg

Cmd > defgen paramfile def.prm

将生成的busiuser.def文件拷贝至目标端的$OGG_HOME/dirdef目录下

注意:如果busiuser.def文件已存在,则需要手动删除,再执行生成命令,否则报错。原因是oracle此处不会自动删除已存在的文件。另外 table busiuser.iy01后面必须跟分号”;”,否则执行defgen的时候会报 command ‘TABLE’ not terminate ……错误。

--抽取

add extract ex2, tranlog, begin now

add exttrail ./dirdat/e2, extract ex2, megabytes 100

--传输

add extract pu2, exttrailSource ./dirdat/e2

add rmttrail ./dirdat/e3, extract pu2, megabytes 200

--投递

add replicat re2, exttrail ./dirdat/e3, nodbcheckpoint

4、配置ogg进程

cd E:/ogg

E:

ggsci

> create subdirs

> edit param mgr (创建管理进程)输入端口

port 7809

> edit param ex1

extract ex1

oracle_home

setenv(oracle_sid="jxk") --设置oracle_sid

nls_lang

userid ogg, password ogg --设置操作ogg的用户

rmthost 192.168.0.44, mgrport 7809 --目标端ogg的ip和端口

rmttrail ./dirdat/ea --目标端的队列文件保存目录,相对与安装ogg目录的路径

table busiuser.*; --需要执行同步的表,可单表配置,也支持通配 用户名.表名

注:ex1文件发生改变,需要重启mgr和ex1进程;ex1名称自定义

默认只支持DML,如果要支持DDL需要执行一些单独的配置。

> add extract ex1(此名称需要与配置prm文件名一致), tranlog, begin now

--TRANLOG 表示使用事务日志的方式

--BEGIN NOW 表示从现在开始,你也可以指定一个具体的开始时间

> add rmttrail ./dirdat/ea, extract ex1

> start mgr

> start ex1

> info 进程名(查看进程状态)

> info all(查看所有进程状态)

> view report ex1(查看进程ex1运行日志)

完成上述操作后,还需要对需要同步的表做trandata操作,否则没有主键的表同步会报错,异常信息如下:

OGG-00730 No minimum supplemental logging is enabled. This may cause extract process to handle key update incorrectly if key column is not in first row piece.

Cmd > set oracle_sid=orcl

Cmd > ggsci

> dblogin userid ogg, password ogg

> add trandata business.iy01

> start ex1(重启进程)

如遇到错误:ERROR OGG-00717 Found unsupported in-memory undo record in sequence 38978, at RBA 4562448, with SCN 0.2055451476 (2055451476) ... Minimum supplemental logging must be enabled to prevent data loss. 执行如下操作

> alter ex1, tranlog, begin now

> start ex1

> stats ex1(查看当前正在队列中的数据)

目标端JDBC连接方式配置

1、下载ogg application adapters for linux

2、解压配置环境变量

export JAVA_HOME=/home/gbase/jdk1.8.0_45

export PATH=$JAVA_HOME/bin:$PATH

export LD_LIBRARY_PATH=${JAVA_HOME}/jre/lib/amd64/server:/home/oracle/ogg:${LD_LIBRARY_PATH}

注意:LD_LIBRARY_PATH这个配置是因为ogg中的库文件需要依赖

3、进入安装目录执行命令

$>./ggsci

> create subdirs

> edit param mgr

Port 7809

> start mgr

>info all

4、目标端启动mgr后,源端启动抽取进程才会成功,下面执行目标端进程配置

(以下使用传统的extract模式进行投递,在ogg12.2及以后版本,可使用replicat模式)

1)拷贝redis-jdbc驱动包和二次开发的jar包到 $OGG_HOME/ggjava目录下

2)>edit param rejava

Extract rejava

-- Sample extract prm file for the Oracle GoldenGate for Java user-exit. A properties

-- file configures the user-exit; by default named "dirprm/{extract_name}.properties"

-- e.g., javaue.prm loads javaue.properties. The user-exit runs in a data pump extract:

-- ggsci> add extract javaue, extTrailSource dirdat/tc

-- ggsci> info javaue

-- the source-def's must match the trail data

SourceDefs ./dirdef/busiuser.def

getEnv (JAVA_HOME)

getEnv (PATH)

getEnv (LD_LIBRARY_PATH)

-- windows:

--CUserExit ggjava_ue.dll CUSEREXIT PassThru IncludeUpdateBefores

-- unix/linux:

CUserExit libggjava_ue.so CUSEREXIT PassThru IncludeUpdateBefores

GetUpdateBefores

-- tables to be processed; as of 11.2 data may be filtered, tables/operations skipped

Table busiuser.*;

> edit rejava.properties

gg.handlerlist=use_redis --随意,但下面配置必须和此名称一致

gg.classpath=./ggjava/ogg_gbase_1.0.jar,./ggjava/gbase-connector-java-8.3.81.53-build52.8-bin.jar --引入jar包到classpath

gg.handler.use_redis.type=sample.handler.jdbc.SimpleJDBCHandler --二次开发程序入口

gg.handler.use_redis.driver= redis jdbc driver信息

gg.handler.use_redis.url=redis jdbc url

gg.handler.use_redis.user=

gg.handler.use_redis.password=

gg.handler.use_redis.mode=op

gg.handler.use_redis.maxBatchSize=100

gg.handler.use_redis.reportCount=10000

gg.handler.use_redis.dateFormat=yyyy-MM-dd:HH:mm:ss

配置完成后,需要关闭mgr,重启mgr

5、增加extract进程

> ADD EXTRACT rejava, EXTTRAILSOURCE ./dirdat/ea, BEGIN now

> ADD RMTTRAIL ./dirdat/ea, EXTRACT rejava

> start rejava

> info all

6、测试:

在源端insert 数据,使用stats可以在源端和目标端看到数据增变量,和执行的标识语句,在目标数据库中查询数据

总结

1、源端和目标端部署完成后,需要两端都将mgr进程启动,然后再启动extract进程。

2、远端和目标端的配置文件发生改变时,需要重启mgr和extract进程。

3、如碰上目标端投递数据有问题,可先使用单独的java程序尝试手工写入数据,确保目标端是可用的,再进行ogg for java extract/replicat进程的调试。

4、使用ogg for java adapter,可以很容易实现将关系型数据库的增量数据(其实也可以抽取存量数据),实时写入到任意目标存储平台,包括非官方直接配置支持的redis, 各种key-value db, memory db(如gemfire),mariadb, sqlite,JSON等,适合于各种场景应用。

下一期会基于代码介绍OGG for java adapter的部分接口和函数。

GoldenGate for Java Adapter介绍一(原理篇)的更多相关文章

  1. GoldenGate for Java adapter介绍二(代码篇)

    本示例主要介绍通过实现OGG的接口函数,实现自定义处理增量数据,将数据实时写入到mariadb (OGG官方不支持此数据库,所以只能采用自定义方式实现).以下是本次示例的4个类: Connection ...

  2. java并发编程系列原理篇--JDK中的通信工具类Semaphore

    前言 java多线程之间进行通信时,JDK主要提供了以下几种通信工具类.主要有Semaphore.CountDownLatch.CyclicBarrier.exchanger.Phaser这几个通讯类 ...

  3. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  4. [转]深入理解Java 8 Lambda(类库篇——Streams API,Collectors和并行)

    以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...

  5. 深入理解Java 8 Lambda(类库篇——Streams API,Collectors和并行)

    转载:http://zh.lucida.me/blog/java-8-lambdas-inside-out-library-features/ 关于 深入理解 Java 8 Lambda(语言篇——l ...

  6. Java线程池的原理及几类线程池的介绍

    刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所 ...

  7. java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互

    java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...

  8. Java有用经验总结--Swing篇

    Java有用经验总结--Swing篇 前言 本文前言部分为我的一些感想,假设你仅仅对本文介绍的Java有用技巧感兴趣,能够跳过前言直接看正文的内容. 本文的写作动机来源于近期接给人家帮忙写的一个小程序 ...

  9. Java位向量的实现原理与巧妙应用

    Java位向量的巧实现原理与巧妙应用 1.博文介绍 本篇博文将会介绍几本的位运算含义.位向量介绍.BitSet实现原理.Java位向量的应用.拓展介绍Bloom Filter等. 2.位运算介绍 1) ...

随机推荐

  1. 3里氏代换原则LSP

    一.什么是里氏代换原则 里氏代换原则(Liskov Substitution Principle): 一个软件实体如果使用的是一个父类的话,那 么一定适用于其子类,而且它察觉不出父类和子 类对象的区别 ...

  2. Servlet开发 中使用 log4jdbc 记录 hibernate 的 SQL信息

    一.前言 使用log4jdbc在不改变原有代码的情况下,就可以收集执行的SQL文和JDBC执行情况. 平时开发使用的ibatis,hibernate,spring jdbc的sql日志信息,有一点个缺 ...

  3. iOS开发之--单个页面禁止右滑返回操作

    禁止右滑: if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) ...

  4. 禅道迁移(windows_to_linux)

    需求分析 随着禅道数据的增加,原来通过虚拟机提供的mysql服务器相应速度跟不上需求.且原来禅道的前端与数据库分离安装在windows与linux中,现在提供实体服务器,需要将禅道环境迁移. 确认环境 ...

  5. 【Java线程安全】锁

    Java都有哪些锁? synchronized 和 reentranlock是最常见的,其中前者又JVM提供实现,后者有专门对应的java.util.concurrent包提供:同时后者功能更加丰富. ...

  6. 微信小程序中显示与隐藏(hidden)

    1.wx.wxml页面部分 <view bindtap='click'>点击</view> //这是显示隐藏的部分 <view hidden="{{hidden ...

  7. python 字符类型

    1.整型 int 短整型在window中是2**30--2**39 长整型 long 在python中不区分长短 2.浮点数 float 一般是小数 3.复数 4.boolen类型(布尔类型) 运算结 ...

  8. 新版Ubuntu安装日文输入法

    在Ubuntu的设置中安装日文输入法 本周在调试书上代码时需要安装日文输入法,我发现在百度上并没有在最新版Ubuntu下安装日文输入法的教程,于是我写了这篇博客来与大家分享一下我的安装过程. a.如图 ...

  9. eclipse maven项目下载jar包失败解决办法

    1.找到我们的本地maven仓库目录 我的是 H:\Java\maven\Repository 2.搜索出该目录下的*lastUpdated.properties文件并删除,如下图所示,可以通过模糊搜 ...

  10. Visual Studio中配置Beyond Compare为版本比较工具

    VS自带的合并工具并不理想,个人比较习惯Beyond Compare,这里替换成Beyond Compare,因为并不想改变所有的VS项目设置,这里以单个仓库项目为例,源代码管理器使用GIT 找到.g ...