oracle ogg java_『OGG 03』Win7 配置 Oracle GoldenGate 一次性成功(包括Adapter Java)

本文档详细介绍了在Win7环境下配置Oracle GoldenGate 11.1 for Oracle,包括32位OGG安装、Oracle数据库的配置、OGG与Java Adapter的配合使用,以及Java程序捕获数据库变化的实现过程。通过配置源端和目标端的OGG服务,实现了数据库间的同步,并通过Java程序监听和处理数据变化。
摘要由CSDN通过智能技术生成

安装Oracle:

安装 Oracle_11g 32位【Oracle 32位的话,OGG 也必须是 32位,否则会有0xc000007b无法正常启动 错误】

安装目录为 D:\oracle\product\11.1.0\db1 【这个目录要设置为 环境变量 ORACLEHOME】

设置环境变量:

JAVAHOME C:\Program Files\Java\jdk1.8.0121

ORACLEHOME D:\oracle\product\11.1.0\db1

ORACLE_SID ORCL

验证环境变量:

获取 ORACLESID : 打开 SQLPlus,登录 SYS 账户,执行 select instancename from v$instance;

获取 ORACLEHOME : 查找 Oracle安装目录,这个目录有个特征:有一个子目录名叫 RDBMS。就是说: %ORACLEHOME%\RDBMS\ 这个路径要能正常打开即为配置成功。

Oracle数据库创建用户,授予 DBA权限

Oracle启用日志存档模式

安装 OGG

安装 32位的 OGG 11.1,用于数据库之间的 同步 (和 Oracle 数据库版本、位数一致)

安装 64位的 OGG Adapter Java 12,用于Java程序适配(11.1 的版本会崩溃)

安装 64位的 JDK 1.8 (OGG Adapter Java 因为是64位的)

http://www.oracle.com/technetwork/cn/middleware/goldengate/downloads/index.html

拖到页面最后面

180630133515.png

搜索 需要下载的 OGG

180630132811.png

单击“购物车”,选择需要下载的版本

180630132825.png

180630132830.png

点击 右下角的 “下载”,把OGG文件 放到 D盘

180630132835.png

180630132841.png

先说一下目标:

Oracle 数据库中 有 两个用户(结构) ADMIN 和

每个用户(结构) 都有结构完全一样的 表: TB_TEST

目标1:我们要配置OGG,当 ADMIN.TBTEST 的数据变化时,ROOT.TBTEST 能自动同步这种变化(实现容灾备份)

目标2:我们要配置OGG,当 ADMIN.TB_TEST 的数据变化时,Java程序可以捕获到这种变化。

部署 OGG

180630132846.png

上面4个目录的意思:

dirdat 目标端的 Trail 文件目录

s 源端(ADMIN.TB_TEST 的OGG服务,数据抽取)

t 目标端(ROOT.TB_TEST 的 OGG服务,数据备份)

javaue 目标端(从 D:\dirdat\ 中,将 Trail文件变化 交给Java程序处理)

编辑配置

源端配置:一个管理服务、两个抽取进程

180630132857.png

ext1.prm

extract ext1

userid admin,password oracle

rmthost 127.0.0.1, mgrport 7909

rmttrail D:/ogg/dirdat/r1

grouptransops 1

maxtransops 1

flushsecs 0

eofdelay 0

dynamicresolution

gettruncates

table admin.*;

ext2

extract ext2

userid admin,password oracle

rmthost 127.0.0.1, mgrport 7909

rmttrail D:/ogg/dirdat/r2

grouptransops 1

maxtransops 1

flushsecs 0

eofdelay 0

dynamicresolution

gettruncates

table admin.*;

mgr.prm

PORT 7809

DYNAMICPORTLIST 7840-7850

目标端配置:一个管理服务、一个同步进程

180630132905.png

rep1.prm

replicat rep1

userid root,password oracle

assumetargetdefs

reperror default,discard

grouptransops 1

maxtransops 1

discardfile D:/ogg/dirdat/repsz.dsc,append

map admin.*, target root.*;

mgr.prm

PORT 7909

DYNAMICPORTLIST 7940-7950

Javaue配置:一个管理服务、一个Javaue进程

180630132910.png

javaue.prm

Extract JAVAUE

SetEnv (GGS_USEREXIT_CONF = "dirprm/javaue.properties")

SourceDefs dirprm/source.def

--getEnv (JAVA_HOME)

--getEnv (LD_LIBRARY_PATH_12) --边境变量 LD_LIBRARY_PATH_12 指向的是 D:\ogg\javaue12\ggjava\resources\lib

--getEnv (PATH)

CUserExit ggjava_ue.dll CUSEREXIT PassThru IncludeUpdateBefores

GetUpdateBefores

-- NoCompressDeletes

-- NoCompressUpdates

Table ADMIN.*;

javaue.properties

### java.naming.provider.url=tcp://localhost:61616

### java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory

gg.handlerlist=sample

gg.handler.sample.type=sample.SampleHandler

# com.goldengate.atg.datasource.handler.ConsoleHandler

goldengate.userexit.timestamp=utc

goldengate.userexit.nochkpt=true

goldengate.userexit.writers=javawriter

goldengate.log.logname=cuserexit

goldengate.log.level=INFO

goldengate.log.tofile=true

javawriter.stats.display=TRUE

javawriter.stats.full=TRUE

# javaue.prm 我们之所以注释掉了 getEnv (LD_LIBRARY_PATH_12) 是因为:我们手动把路径配置在了下面代码中

javawriter.bootoptions=-Djava.class.path=.;dirprm;ggjava/resources/classes;ggjava/resources/lib;ggjava/ggjava.jar;dirprm/fastjson-1.2.7.jar;dirprm/custom.jar -Dlog4j.configuration=log4j.properties

mgr.prm

PORT 7509

DYNAMICPORTLIST 7540-7550

生成 source.def 文件(Javaue 运行需要)

在 D:\Temp\创建一个 source.prm 文件

180630132915.png

D:\Temp\source.prm

defsfile D:\Temp\source.def, purge

userid admin,password oracle

table admin.*;

运行命令行:

180630132921.png

180630132927.png

用Eclipse 编写Java插件:

打开 Eclipse 新建“Java项目”custom12,新建一个包 sample,新建一个类 SampleHandler.java 将如下代码 复制到 SampleHandler.java 中

package sample;

import java.io.*;

import java.util.ArrayList;

import java.util.List;

import java.util.Set;

//这是 OGG 11 的 import

//import com.goldengate.atg.datasource.AbstractHandler;

//import com.goldengate.atg.datasource.DsConfiguration;

//import com.goldengate.atg.datasource.DsEvent;

//import com.goldengate.atg.datasource.GGDataSource.Status;

//import com.goldengate.atg.datasource.handler.*;

//import com.goldengate.atg.datasource.meta.DsMetaData;

//import com.goldengate.atg.datasource.test.DsTestUtils.Logger;

//import com.goldengate.atg.datasource.meta.*;

//import com.goldengate.atg.datasource.*;

//这是 OGG 12 的 import

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import oracle.goldengate.datasource.AbstractHandler;

import oracle.goldengate.datasource.DsColumn;

import oracle.goldengate.datasource.DsConfiguration;

import oracle.goldengate.datasource.DsEvent;

import oracle.goldengate.datasource.DsOperation;

import oracle.goldengate.datasource.DsOperation.OpType;

import oracle.goldengate.datasource.DsTransaction;

import oracle.goldengate.datasource.GGTranID;

import oracle.goldengate.datasource.meta.ColumnMetaData;

import oracle.goldengate.datasource.meta.DsMetaData;

import oracle.goldengate.datasource.meta.TableMetaData;

import oracle.goldengate.datasource.meta.TableName;

import oracle.goldengate.datasource.GGDataSource.Status;

public class SampleHandler extends AbstractHandler {

//OGG 11 和 OGG 12 的 日志好像不一样, OGG 12 似乎要写 LoggerFactory.getLogger(SampleHandler.class);

//private final Logger logger = Log4jLogger.getLogger(SampleHandler.class);

private final Logger logger = LoggerFactory.getLogger(SampleHandler.class);

@Override

public void init(DsConfiguration conf, DsMetaData metaData) {

super.init(conf, metaData);

logger.info("init!");

WriteStringToFile("D:\\SampleHandler.log", "SampleHandler.init(*)");

}

@Override

public Status transactionCommit(DsEvent e, DsTransaction tx) {

// DsMetaData meta = e.getMetaData();

// //System.out.println(meta);

//

// Set tableNames = meta.getTableNames();

// for(TableName tableName : tableNames){

// String tableStr = "";

// tableStr = tableStr + tableName+" : ";

//

// TableMetaData metaData = meta.getTableMetaData(tableName);

// ArrayList columns = metaData.getColumnMetaData();

// for(ColumnMetaData column : columns){

// tableStr = tableStr + "\r\n " + column.getColumnName() + " | "+column.getDataType().toString();

// }

//

// System.out.println(tableStr+"\r\n");

// //System.out.println(metaData);

// }

//

// //GGTranID tranId = e.getTargetCheckpointInfo();

// //System.out.println(tranId);

//

// System.out.println(tx.getSize());

// System.out.println(tx.getTotalOps());

// System.out.println(tx.getReadTime());

// System.out.println(tx.getTransactionBeginTime());

//

//

// Object eventSource = e.getEventSource();

// System.out.println(eventSource);

//

// DsOperation lastOp = tx.getLastOperation();

// System.out.println(lastOp);

//

//

// List listOp = tx.getOperations();

// System.out.println(listOp.size());

// //System.out.println(listOp.get(0).getColumn(0).getBeforeValue());

// for(DsOperation op : listOp){

// System.out.println(op.getTableName());

// }

Status superResult = super.transactionCommit(e, tx);

logger.info("transactionCommit!");

WriteStringToFile("D:\\SampleHandler.log", "SampleHandler.transactionCommit(*) => "+superResult);

return superResult;

}

@Override

public Status operationAdded(DsEvent e, DsTransaction tx, DsOperation dsOperation) {

DsMetaData meta = e.getMetaData();

//System.out.println(meta);

// Set tableNames = meta.getTableNames();

// for(TableName tableName : tableNames){

// String tableStr = "";

// tableStr = tableStr + tableName+" : ";

//

// TableMetaData metaData = meta.getTableMetaData(tableName);

// ArrayList columns = metaData.getColumnMetaData();

// for(ColumnMetaData column : columns){

// tableStr = tableStr + "\r\n " + column.getColumnName() + " | "+column.getDataType().toString();

// }

//

// System.out.println(tableStr+"\r\n");

// //System.out.println(metaData);

// }

System.out.println("---------------------------------------");

OpType opType = dsOperation.getOperationType();

System.out.println(opType);

TableName tableName = dsOperation.getTableName();

System.out.println(tableName.getFullName());

TableMetaData metaData = meta.getTableMetaData(tableName);

ArrayList columnMetas = metaData.getColumnMetaData();

List columns = dsOperation.getColumns();

for(int i=0; i

ColumnMetaData columnMeta = columnMetas.get(i);

DsColumn column = columns.get(i);

System.out.println(" " + columnMeta.getColumnName() + "\t | \t"+ column.getAfterValue() + (column.isChanged()? "\t >>> \t" +column.getAfterValue():""));

}

System.out.println("---------------------------------------");

Status superResult = super.operationAdded(e, tx, dsOperation);

logger.info("operationAdded!");

WriteStringToFile("D:\\SampleHandler.log", "SampleHandler.operationAdded(*) => "+superResult);

return superResult;

}

//@Override

//public DataSourceListener.State getState() {

// return super.getState();

//}

@Override

public void destroy() {

super.destroy();

WriteStringToFile("D:\\SampleHandler.log", "SampleHandler.destroy(*)");

logger.info("destroy!");

}

@Override

public String reportStatus() {

String superResult = "OK"; //super.reportStatus(); 调用父类函数,程序就会崩溃。

WriteStringToFile("D:\\SampleHandler.log", "SampleHandler.reportStatus(*) => "+superResult);

return superResult;

//return "status report...===";

}

public static void WriteStringToFile(String filePath, String text) {

try {

System.out.println("AAAAAAAAAAAAAAAAA :" + text);

FileWriter writer = new FileWriter(filePath, true);

writer.write("\r\n"+text);

writer.close();

} catch (IOException e) {

//e.printStackTrace();

System.out.println(e.getMessage());

}

}

}

*下面截图的包名 sample 错写成了 simple *

180630132934.png

添加外部jar包引用,具体包括

ggjava\ggjava.jar

ggjava\resources\lib 目录下的全部 jar 包

180630132939.png

180630132959.png

180630133003.png

180630133010.png

180630133014.png

180630133021.png

至此,OGG整个配置环节,需要准备的 文件都已经准备完成,接下来准备启动 OGG。

启动源端OGG:

启动源端OGG:

进入 D:\ogg\s\ 目录,双击 ggsci.exe,运行如下命令

> create subdirs

> dblogin userid admin,password oracle

> add trandata admin.*

> add extract ext1, tranlog, begin now

> add rmttrail D:/ogg/dirdat/r1 extract ext1

> add extract ext2, tranlog, begin now

> add rmttrail D:/ogg/dirdat/r2 extract ext2

> start mgr

> start ext1

> start ext2

180630133027.png

180630133032.png

180630133037.png

启动目标端OGG:

进入 D:\ogg\t\ 目录,双击 ggsci.exe,运行如下命令

> create subdirs

> add replicat rep1 exttrail D:/ogg/dirdat/r1, nodbcheckpoint

> start mgr

> start rep1

180630133042.png

验证 源端>目标端 的同步:

如果 ext1 ext2 因为 rep1 没有启动而自动停止,则需要 重新启动一次 源端的 ext1 ext2

180630133047.png

我们向 ADMIN.TBTEST 插入一行记录,理论上 ROOT.TBTEST 也会对应的 同步一行记录

180630133054.png

启动OGG Javaue:

进入 D:\ogg\javaue12\ 目录,双击 ggsci.exe,运行如下命令

180630133103.png

180630133108.png

最后的话:

至此:OGG(Oracle GoldenGate)同步配置 和 Adaper Java 程序适配 已经全部完成。

建议:严格按照上面的步骤,所有名称 都尽量不要变化 —— 先把第一次 全部跑通。

等全部跑通后,你再试着修改 其中的 各个部分的名称 —— 对照 prm 文件配置,试着理解 OGG配置原理。

如果配置过程中,出现任何诡异BUG,

欢迎参考

—— 事实上,OGG配置的坑很多,总有一款适合你,两篇《踩坑指南》 你逃不掉的。

舒小龙 2018-06-04

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值