『OGG 03』Win7 配置 Oracle GoldenGate 一次性成功(包括Adapter Java)
安装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权限
略(参见 《__Win7 配置 Oracle GoldenGate 踩坑指南》中的配置)
Oracle启用日志存档模式
略(参见 《__Win7 配置 Oracle GoldenGate 踩坑指南》中的配置)
安装 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
拖到页面最后面
搜索 需要下载的 OGG
单击“购物车”,选择需要下载的版本
点击 右下角的 “下载”,把OGG文件 放到 D盘
先说一下目标:
Oracle 数据库中 有 两个用户(结构) ADMIN 和
每个用户(结构) 都有结构完全一样的 表: TB_TEST
目标1:我们要配置OGG,当 ADMIN.TBTEST 的数据变化时,ROOT.TBTEST 能自动同步这种变化(实现容灾备份)
目标2:我们要配置OGG,当 ADMIN.TB_TEST 的数据变化时,Java程序可以捕获到这种变化。
部署 OGG
上面4个目录的意思:
dirdat 目标端的 Trail 文件目录
s 源端(ADMIN.TB_TEST 的OGG服务,数据抽取)
t 目标端(ROOT.TB_TEST 的 OGG服务,数据备份)
javaue 目标端(从 D:\dirdat\ 中,将 Trail文件变化 交给Java程序处理)
编辑配置
源端配置:一个管理服务、两个抽取进程
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
目标端配置:一个管理服务、一个同步进程
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进程
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 文件
D:\Temp\source.prm
defsfile D:\Temp\source.def, purge
userid admin,password oracle
table admin.*;
运行命令行:
用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<TableName> tableNames = meta.getTableNames();
// for(TableName tableName : tableNames){
// String tableStr = "";
// tableStr = tableStr + tableName+" : ";
//
// TableMetaData metaData = meta.getTableMetaData(tableName);
// ArrayList<ColumnMetaData> 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<DsOperation> 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<TableName> tableNames = meta.getTableNames();
// for(TableName tableName : tableNames){
// String tableStr = "";
// tableStr = tableStr + tableName+" : ";
//
// TableMetaData metaData = meta.getTableMetaData(tableName);
// ArrayList<ColumnMetaData> 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<ColumnMetaData> columnMetas = metaData.getColumnMetaData();
List<DsColumn> columns = dsOperation.getColumns();
for(int i=0; i<columnMetas.size(); 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 *
添加外部jar包引用,具体包括
ggjava\ggjava.jar
ggjava\resources\lib 目录下的全部 jar 包
至此,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
启动目标端OGG:
进入 D:\ogg\t\ 目录,双击 ggsci.exe,运行如下命令
> create subdirs
> add replicat rep1 exttrail D:/ogg/dirdat/r1, nodbcheckpoint
> start mgr
> start rep1
验证 源端>目标端 的同步:
如果 ext1 ext2 因为 rep1 没有启动而自动停止,则需要 重新启动一次 源端的 ext1 ext2
我们向 ADMIN.TBTEST 插入一行记录,理论上 ROOT.TBTEST 也会对应的 同步一行记录
启动OGG Javaue:
进入 D:\ogg\javaue12\ 目录,双击 ggsci.exe,运行如下命令
最后的话:
至此:OGG(Oracle GoldenGate)同步配置 和 Adaper Java 程序适配 已经全部完成。
建议:严格按照上面的步骤,所有名称 都尽量不要变化 —— 先把第一次 全部跑通。
等全部跑通后,你再试着修改 其中的 各个部分的名称 —— 对照 prm 文件配置,试着理解 OGG配置原理。
如果配置过程中,出现任何诡异BUG,
欢迎参考
《__Win7 配置 Oracle GoldenGate 踩坑指南》 和 《__Win7 配置 Oracle GoldenGate Adapter Java 踩坑指南》 两篇踩坑文章。
—— 事实上,OGG配置的坑很多,总有一款适合你,两篇《踩坑指南》 你逃不掉的。
舒小龙 2018-06-04
『OGG 03』Win7 配置 Oracle GoldenGate 一次性成功(包括Adapter Java)的更多相关文章
- 『OGG 02』Win7 配置 Oracle GoldenGate Adapter Java 踩坑指南
上一文章 <__Win7 配置OGG(Oracle GoldenGate).docx>定下了 两个目标: 目标1: 给安装的Oracle_11g 创建 两个用户 admin 和 root ...
- 『OGG 01』Win7 配置 Oracle GoldenGate 踩坑指南
安装 Oracle 安装 Oracle11g 32位[Oracle 32位的话,OGG 也必须是 32位,否则会有0xc000007b无法正常启动 错误] 安装目录为 D:\oracle\produc ...
- 配置Oracle GoldenGate安全性
本章介绍如何配置Oracle GoldenGate安全性. 本章包括以下部分: Overview of Oracle GoldenGate Security Options Encrypting Da ...
- Oracle GoldenGate
Oracle GoldenGate实现数据库同步 前言:最近刚好在弄数据库同步,网上查了些资料再加上自己整理了一些,做个分享! 一.GoldenGate的安装 官方文档: Oracle®GoldenG ...
- Oracle GoldenGate实现数据库同步
前言:最近刚好在弄数据库同步,网上查了些资料再加上自己整理了一些,做个分享! 一.GoldenGate的安装 1.安装包准备 数据库版本:Oracle Database 11g Release 2(1 ...
- 建立Oracle GoldenGate凭证
了解如何为与数据库交互的流程创建数据库用户,分配正确的权限并防止未经授权使用凭据. 主题: 为Oracle GoldenGate分配凭证 保护Oracle GoldenGate凭证 3.1 为Orac ...
- 为Oracle GoldenGate准备数据库
了解如何为Oracle GoldenGate准备数据库,包括如何配置连接和日志记录,如何在数据库中启用Oracle GoldenGate,如何设置闪回查询以及如何管理服务器资源. 为集成进程配置连接 ...
- Oracle GoldenGate理论
1Oracle GoldenGate处理方法和支持的数据库Oracle GoldenGate在多样和异构的基础IT平台中,可以在事务级别上进行数据交换和数据操作.在保证交易完整性和最小的开销的条件下, ...
- 『调错』OGG Error opening module ggjava_ue.dll
Win7 配置 OGG (GoldenGate) Adapter Java 时, 报错: ERROR OGG-01122 Oracle GoldenGate Capture, javaue.prm: ...
随机推荐
- SpringCloud实战-Hystrix请求熔断与服务降级
我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...
- 5月2日——iOS11定位失效问题
所存在的问题: (1)定位不能正常使用 (2)首次安装APP 时 "是否允许使用定位信息" 系统提示框不显示 iOS定位失效原因: 因为苹果现在增加了一项新的隐私保护功能 NSL ...
- Python_方法演示
class Root: __total=0 def __init__(self,v): #构造函数 self.__value=v Root.__total+=1 def show(self): #普通 ...
- Git分支合并冲突解决(续)
接Git分支合并冲突解决,在使用rebase合并冲突情况下,如果不小心,执行完add后执行了commit,此时本地仓库HEAD处于游离态(即HEAD指向未知的分支),如何解决? 解决方法 (1)此时, ...
- (细节)My SQL中主键为0和主键自排约束的关系
开始不设置主键 表的设计如下: 如果id的位置有好几个0的话:设置主键并且自动排序时,0会从1开始递增: Insert 进去 id = 0的数据,数据会从实际的行数开始增加,和从0变化不一样: 现在主 ...
- awk高级玩法
1. 程序元素 一个awk 程序是一对以模式(pattern) 与大括号框起来的操作(action) 组合而成的,或许,还会加上实现操作细节的函数(function ) .针对每个匹配于输人数据的模式 ...
- 阅读GIC-500 Technical Reference Manual笔记
GIC-500是ARM GICv3的一个实现,它只支持ARMv8核和实现了GIC Stream协议的GIC CPU Interface,比如Cortex-A53. 关于GIC有四份相关文档:<C ...
- 在单用户模式下修改CentOS的root密码
我们在使用CentOS的过程中可能会发生忘记root用户密码的情况,本文就从应用的角度简单介绍一下如何在单用户模式下修改root用户的密码. 开启CentOS,进入系统启动菜单 将光标停留在系统开机时 ...
- django从0到1搭建网站
曾经有人说我前端很水,那么在这一系列文章中我打算把前后端融合在一起来做一次网站的全面重构,希望可以把刚刚入行的同学带上正途 请尊重原创,转载请注明来源网站www.shareditor.com以及原 ...
- LoadRunner 11 中Analysis分析
原文:http://www.cnblogs.com/Chilam007/p/6445165.html analysis简介 分析器就是对测试结果数据进行分析的组件,它是LR三大组件之一,保存着大量用来 ...