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


    安装Oracle:

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

    安装目录为 D:oracleproduct11.1.0db1 【这个目录要设置为 环境变量 ORACLEHOME】

    设置环境变量:

    JAVAHOME C:Program FilesJavajdk1.8.0121

    ORACLEHOME D:oracleproduct11.1.0db1

    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:oggjavaue12ggjava
    esourceslib
    --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:Tempsource.prm

    defsfile D:Tempsource.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 + "
       " + column.getColumnName() + " | "+column.getDataType().toString();
    //          }
    //          
    //          System.out.println(tableStr+"
    ");            
    //          //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 + "
       " + column.getColumnName() + " | "+column.getDataType().toString();
    //          }
    //          
    //          System.out.println(tableStr+"
    ");            
    //          //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() + "	 | 	"+ column.getAfterValue() + (column.isChanged()? "	 >>> 	" +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("
    "+text);       
                writer.close();     
            } catch (IOException e) {     
                //e.printStackTrace();  
                System.out.println(e.getMessage()); 
            } 
        }     
    
    }
    

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

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

    ggjavaggjava.jar

    ggjava esourceslib 目录下的全部 jar 包

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

    启动源端OGG:

    启动源端OGG:

    进入 D:oggs 目录,双击 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 目录,双击 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:oggjavaue12 目录,双击 ggsci.exe,运行如下命令

    最后的话:

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

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

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

     

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

    欢迎参考

    __Win7 配置 Oracle GoldenGate 踩坑指南》 和 《__Win7 配置 Oracle GoldenGate Adapter Java 踩坑指南》 两篇踩坑文章。

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

     

    舒小龙 2018-06-04

  • 相关阅读:
    设计模式--总结
    设计模式--行为型模式--解释器模式
    设计模式--行为型模式--备忘录模式
    设计模式--行为型模式--访问者模式(Visitor模式)
    设计模式--行为型模式--迭代器模式
    设计模式--行为型模式--中介者模式
    js常用方法集合
    CSS 每隔4行显示不同样式的表格
    常用正则验证
    wIndow 强制关闭被占用的端口
  • 原文地址:https://www.cnblogs.com/shuxiaolong/p/Win7_OGG_And_Javaue.html
Copyright © 2020-2023  润新知