oracle goldengate的两种用法
此文已由作者赵欣授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
自从oracle收购来了goldengate这款产品并以后对它做了一系列改进后,有非常多的用户使用它做数据迁移、etl抽取、复制容灾等等场景。
这里还有两个goldengate的另类用法,也是非常实用。
1.通过dataguard的备库+goldengate直接格式化输出操作的sql
大多数时候我们要检查某些表数据的变化是怎么产生的、何时产生的,在没有打开详细审计监控的时候一般都会使用logminer来操作。
但如果只想提取修改部分表的操作sql而不是要做集体回滚操作、或者不想通过logminer做整体的挖掘审计时logminer操作起来稍显麻烦
在很多oracle场景里都会有dataguard+goldengate使用,那么我们其实可以很简单的利用dataguard的adg+goldengate快速抽取归档,格式化输出我们感兴趣表的相关sql

以下是我们的测试步骤,环境为oracle11.2.2.8+goldengate11.2.1.20:
主库创建测试用户
create user oggtest identified by oracle;
grant connect,resource to oggtest;
打开force logging和最小附加日志
select supplemental_log_data_min from v$database;
alter database add supplemental log data;
select force_logging from v$database;
Alter database force logging;
开启表级补全日志,这里我们使用全库打开补全
alter database add supplemental log data (primary key,unique,foreign key) columns;
创建goldengate需要的用户
create user goldengate identified by oracle;
grant resource, connect, dba to goldengate;
备库上
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
解压缩ogg安装包,创建目录
mkdir trails
./ggsci
CREATE SUBDIRS
创建mgr配置文件
edit param mgr
Port 7809
userid goldengate , password oracle
DYNAMICPORTLIST 9101-9356
在standby备库上只需要配置alo模式的抽取,因为只测试抽取进程,也不需要设置任何检查点
ADD EXTRACT t1,TRANLOG, EXTSEQNO 746, EXTRBA 0
edit param t1
extract t1
USERID goldengate, PASSWORD oracle
DISCARDFILE t1dsc,APPEND,MEGABYTES 50
TRANLOGOPTIONS altarchivelogdest /home/oracle/arch
TRANLOGOPTIONS ARCHIVEDLOGONLY
TRANLOGOPTIONS NOCOMPLETEARCHIVEDLOGONLY
FORMATSQL
EXTTRAIL ./trails/t1
TABLE oggtest.*; ADD EXTTRAIL ./trails/t1 EXTRACT T1
这里的EXTSEQNO 746是我们测试环境里的归档日志号
都配置完成后start相应进程
主库上测试做insert和update操作
create table oggtest.ogg(a int constraint key1 primary key,b varchar2(100),c varchar2(100),d date default sysdate);
insert into oggtest.ogg(a,b,c,d) values(1,1,1,sysdate);
insert into oggtest.ogg(a,b,c,d) values(2,2,2,sysdate);
insert into oggtest.ogg(a,b,c,d) values(3,3,3,sysdate);
commit;
insert into oggtest.ogg(a,b,c,d) values(4,4,4,sysdate);
insert into oggtest.ogg(a,b,c,d) values(5,5,5,sysdate);
commit;
update oggtest.ogg set b=2 where a=5;
commit;
然后我们在备库./trails/t1000000文件里就可以看到
B,2015-02-24:14:53:05.000000,1424760785,749,
INSERT INTO OGGTEST.OGG (A,B,C,D) VALUES ('1','1','1','2015-02-24:14:53:05');
INSERT INTO OGGTEST.OGG (A,B,C,D) VALUES ('2','2','2','2015-02-24:14:53:05');
INSERT INTO OGGTEST.OGG (A,B,C,D) VALUES ('3','3','3','2015-02-24:14:53:05');
C,
B,2015-02-24:14:53:06.000000,1424760786,749,
INSERT INTO OGGTEST.OGG (A,B,C,D) VALUES ('4','4','4','2015-02-24:14:53:05');
INSERT INTO OGGTEST.OGG (A,B,C,D) VALUES ('5','5','5','2015-02-24:14:53:05');
C,
B,2015-02-24:14:53:49.000000,1424760829,750,
UPDATE OGGTEST.OGG SET B='2' WHERE A='5';
C,
什么时间点,对各个表做了哪些操作就可以很容易的显示出来,
平时这个在备库上的ogg可以不使用,在特定时候可以手工配置需要检查抽取的归档
手工调整新的归档日志去抽取
alter EXTRACT t1,TRANLOG, EXTSEQNO 754, EXTRBA 0
ADD EXTTRAIL ./trails/t1 EXTRACT T1
然后start t1让其运行再去日志记录里检查,如果有新增其他用户下的表要监控修改参数文件即可
比如增加一个表ogg2.test2015的抽取
在t1的参数文件最后增加一行
TABLE ogg2.test2015;
然后输出日志里就可以看到
B,2015-02-24:15:04:45.000000,1424761485,755,
INSERT INTO OGG2.TEST2015 (A,B,C,D) VALUES ('1','1','1','2015-02-24:15:04:45');
C,
B,2015-02-24:15:04:46.000000,1424761486,755,
UPDATE OGG2.TEST2015 SET B='2' WHERE A='1';
这样可以快速定位做操作的sql用来做很多事情。
2.通过goldengate生成平面文件用于数据交换
很多时候我们在不同系统或者db之间交换数据都会用到ETL,比如银行的总行和下面支行之间是用etl抽取出当日数据变化然后输出文本文件压缩后下发,支行再利用etl工具做数据导入。oracle的数据导入hadoop则可以选择sqoop这样的产品。
但是我们知道etl做增量抽取往往都是使用时间戳,包括sqoop也是如此,这样可能会对原始表有一定的修改要求。
而基于oracle日志抽取的goldengate可以很方便的做平面文件输出到HDFS,甚至是直接使用java输出到hive里。
这里我们介绍一下goldengate生产平面文件。

整个结构图如上所示,环境为oracle11.2.2.8+goldengate11.2.1.20+GOLDENGATE ADAPTERS V11.2.1.0.1:
和普通的goldengate部署源和目标都是goldengate不同,源端部署goldengate,目标端部署的是GOLDENGATE ADAPTERS
整个配置过程大家可以参考一下官方手册,主要注意以下几点:
1.defgen文件需要在源端生成然后拷贝到目标端,每次表变化需要重新生成def文件
2.需要通过配置参数文件控制平面文件的生成和分离
3.如果需求是生成表里所有数据的平面文件,需要单独对表所有列做trandata,例如add trandata oggtest.ogg, cols(b,c,d) 这里主键之外的列是b、c、d ,这样的话如果列太多可能会是问题(对早期版本的OGG来说)
4.每个平面文件的大小需要通过内部参数和外部shell做整合,特别是放到hadoop里的时候,因为过多的小平面文件会浪费hadoop的namenode的内存,对性能上也没用好处
具体的配置大家可以参考官方文档,我们简要说明一下实现的效果:
源库上增加
create table oggtest.ogg2(a int constraint key2 primary key,b varchar2(100),c varchar2(100),d date default sysdate);
源库OGG里执行
dblogin userid goldengate, password oracle
add trandata oggtest.ogg2, cols(b,c,d)
在源库上更新表
insert into oggtest.ogg2(a,b,c,d) values(8,8,8,sysdate);
insert into oggtest.ogg2(a,b,c,d) values(9,9,9,sysdate);
insert into oggtest.ogg(a,b,c,d) values(1,1,1,sysdate);
commit;
update oggtest.ogg2 set b=9 where a=8;
commit;
目标库上可以看到
[oracle@oel5 dirout]$ more pump_OGGTEST_OGG2_2015-02-24_21-41-25_00000_data.dsv.temp
I|8|8|8|2015-02-24:21:41:19
I|9|9|9|2015-02-24:21:41:19
U|8|9|8|2015-02-24:21:41:19
[oracle@oel5 dirout]$ more pump_OGGTEST_OGG_2015-02-24_21-41-25_00001_data.dsv.temp
I|1|1|1|2015-02-24:21:41:19
可以看到OGG自动将平面文件打出来,I表示Insert,U表示update,甚至可以设置delete
不同的表OGG也可以自动分离到不同的文件
通过goldengate我们可以按照各自需求来生成不同的平面文件,比如生成带insert和update的文件用于异构数据库导入操作或者不同oracle之间交换数据
生成只包含行数据的平面文件直接用于hadoop处理,或者oracle做merge导入等等,甚至还可以配置包含update前后值的文件。
最后还需要说一点这个操作同样适用于处理其他数据库比如db2,mysql,sybase。
免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 浏览器插件及好用的小工具
【推荐】 深入浅出“跨视图粒度计算”--1、理解数据的粒度
oracle goldengate的两种用法的更多相关文章
- c++ operator操作符的两种用法:重载和隐式类型转换,string转其他基本数据类型的简洁实现string_cast
C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换.对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式 ...
- operator 的两种用法
C++,有时它的确是个耐玩的东东,就比如operator,它有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换).1.操作符 ...
- Service的两种用法及其生命周期
先来一点基础知识: Service 是android的四大组件之一,与Activity同属于一个级别,它是运行在后台进行服务的组件(例如在后台播放的音乐,播放音乐的同时并不影响其他操作).Servic ...
- JSP中的include的两种用法
1.两种用法 <%@ include file=” ”%> <jsp:include page=” ” flush=”true”/> 2.用法区别 (1)执行时间上区别 < ...
- 子查询。ANY三种用法。ALL两种用法。HAVING中使用子查询。SELECT中使用子查询。
子查询存在的意义是解决多表查询带来的性能问题. 子查询返回单行多列: ANY三种用法: ALL两种用法: HAVING中的子查询返回单行单列: SELECT中使用子查询:(了解就好,避免使用这种方法! ...
- mstsc远程报:这可能是由于CredSSP 加密Oracle修正的两种完美解决方法
win10很完美,用的也很舒服!当然人无完人,也总有不尽如人意的时候.比如说我们经常用的远程mstsc,就出现了一个坑,既然出现坑了,我们就得把坑解决掉吧!下面就记录一下这个坑的解决方法. 本文地址: ...
- .Net 中读写Oracle数据库常用两种方式
.net中连接Oracle 的两种方式:OracleClient,OleDb转载 2015年04月24日 00:00:24 10820.Net 中读写Oracle数据库常用两种方式:OracleCli ...
- Comparable和Comparator的区别&Collections.sort的两种用法
在Java集合的学习中,我们明白了: 看到tree,可以按顺序进行排列,就要想到两个接口.Comparable(集合中元素实现这个接口,元素自身具备可比性),Comparator(比较器,传入容器构造 ...
- in有两种用法:
# in有两种用法: 1. 在for中. 是把每一个元素获取到赋值给前⾯的变量. 2. 不在for中. 判断xxx是否出现在str中. #len() 为内置函数,输出为1,2,3,4....., 长度 ...
随机推荐
- IPHONE 64位和32位
参考段一:iPhone 5没有64位的,只有32位架构,苹果是从iPhone 5s开始对全线移动产品使用64位架构.iPhone 5s发布之后的所有产品都是64位的使用LUAJIT或LUAC都可以对L ...
- MySQL数据库篇之完整性约束和表关系
主要内容: 一.完整性约束 二.表关系 1️⃣ 完整性约束 (1)何为完整性约束? 约束条件与数据类型的宽度一样,都是可选参数. 作用:用于保证数据的完整性和一致性 (2)分类主要有以下五类: 1.n ...
- spring 采用编程式事务
1.getCurrentSession()与openSession()的区别? * 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession() ...
- 编译gcc5.1.0时的报错
编译安装gcc5.1.0时出现如下报错: configure: error: error verifying int64_t uses long long 这是由于没有安装gcc_c++导致的,安装下 ...
- 113. Path Sum II (Tree; DFS)
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- 原生JS的使用,包括jquery和原生JS获取节点、jquery和原生JS修改属性的比较
一.前言 相比于JS这条直达终点.满是荆棘的小路,jquery无疑是康庄大道了,足够的简洁.易用给了它辉煌的地位.然而,毕竟是绕着道的插件,当小路走着走着变成大路的时候,曾经的大路也就失去了他自身的优 ...
- Spring中Aspect的切入点的表达式定义细节
用过很多次切面aspect了,对于表达式总是记得很模糊,今天总结一下. 1.切面做如下设置则只会拦截返回值为String类型的方法 @Aspect public class MyInterceptor ...
- 【Unity】Collider随骨骼动画运动
Collider位置和角色的动作不一致会导致Mesh互相镶嵌,让游戏失真. 想象一扇门的Collider没随它打开的动画移动,结果就是你看着门开着却穿不过去. 而我遇到的情况是: 角色在执行跑 ...
- java中如何实现两个值互换
public class SwapVariable { public static void main(String[] args) { // 将两个数据进行交换: method2(,); metho ...
- C#创建COM组件
本文详细阐述如何用C#创建COM组件,并能用VC6.0等调用. 附:本文适用任何VS系列工具. 在用C#创建COM组件时,一定要记住以下几点: 1.所要导出的类必须为公有: 2.所有属性.方法也必须为 ...