zoukankan      html  css  js  c++  java
  • 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。


    免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

    更多网易技术、产品、运营经验分享请点击


    相关文章:
    【推荐】 6月第5周业务风控关注 | 《网络安全等级保护条例(征求意见稿)》本周正式发布

  • 相关阅读:
    喵哈哈村的魔法考试 Round #19 (Div.2) B 快速加
    hdu5676 ztr loves lucky numbers DFS
    hdu 5950 Recursive sequence 矩阵快速幂
    AI大语音(三)—傅里叶变换家族
    AI大语音(二)——语音预处理
    AI大语音(一)——语音识别基础
    第二章:声学模型之EM算法
    量子力学2
    量子力学1
    C#学习系列(一)——C#和C++的区别
  • 原文地址:https://www.cnblogs.com/zyfd/p/10033540.html
Copyright © 2011-2022 走看看