使用Oracle Logminer同步Demo

1 Demo介绍

1.1 Demo设想

前面介绍了Oracle LogMiner配置使用以及使用LogMiner进行解析日志文件性能,在这篇文章中将利用LogMiner进行数据同步,实现从源目标数据库到目标数据库之间的数据同步。由于LogMiner支持的版本是8.1及以上,所以进行数据同步的Oracle数据库版本也必须是8.1及以上。

当然在本文中介绍的是LogMiner进行数据同步例子,也可以利用LogMiner进行数据审计、数据操作追踪等功能,由于这些从操作原理来说是一致,在本文不做讨论。

1.2 框架图

1.3 流程图

l 配置阶段

1、 控制端:指定源端、目标端数据库信息、LOGMINER同步时间等配置信息;

l 获取源端同步数据

2、 控制台:通过定时轮询的方式检测是否到达数据同步时间,如果是则进行数据同步,否则继续进行轮询;

3、 源数据库:定时加载数据库归档日志文件到动态表v$logmnr_contents中;

4、 源数据库:根据条件读取指定sql语句;

l 目标端数据入库

5、 源数据库:执行sql语句。

2 代码分析

2.1 目录及环境配置

在该Demo项目中需要引入Oracle JDBC驱动包,具体项目分为四个类:

1. Start.java:程序入口方法;

2. SyncTask.java:数据同步Demo核心,生成字典文件和读取日志文件、目标数据库执行SQL语句等;

3. DataBase.java:数据库操作基础类;

4. Constants.java:源数据库、目标数据库配置、字典文件和归档文件路径。

2.2 代码分析

2.2.1 Constants.java

在该类中设置了数据同步开始SCN号、源数据库配置、目标数据库配置以及字典文件/日志文件路径。需要注意的是在源数据库配置中有两个用户:一个是调用LogMiner用户,该用户需要拥有dbms_logmnr、dbms_logmnr_d两个过程权限,在该Demo中该用为为sync;另外一个为LogMiner读取该用户操作SQL语句,在该Demo中该用为为LOGMINER。

package com.constants;/*** [Constants]|描述:Logminer配置参数* @作者: **** @日期: 2013-1-15 下午01:53:57* @修改历史:*/
public class Constants {/** 上次数据同步最后SCN号 */public static String LAST_SCN = "0";/** 源数据库配置 */public static String DATABASE_DRIVER="oracle.jdbc.driver.OracleDriver";public static String SOURCE_DATABASE_URL="jdbc:oracle:thin:@127.0.0.1:1521:practice";public static String SOURCE_DATABASE_USERNAME="sync";public static String SOURCE_DATABASE_PASSWORD="sync";public static String SOURCE_CLIENT_USERNAME = "LOGMINER";/** 目标数据库配置 */public static String SOURCE_TARGET_URL="jdbc:oracle:thin:@127.0.0.1:1521:target";public static String SOURCE_TARGET_USERNAME="target";public static String SOURCE_TARGET_PASSWORD="target";/** 日志文件路径 */public static String LOG_PATH = "D:\\oracle\\oradata\\practice";/** 数据字典路径 */public static String DATA_DICTIONARY = "D:\\oracle\\oradata\\practice\\LOGMNR";
}

2.2.2 SyncTask.java

在该类中有两个方法,第一个方法为createDictionary,作用为生成数据字典文件,另外一个是startLogmur,该方法是LogMiner分析同步方法。

/*** <p>方法名称: createDictionary|描述: 调用logminer生成数据字典文件</p>* @param sourceConn 源数据库连接* @throws Exception 异常信息*/
public void createDictionary(Connection sourceConn) throws Exception{String createDictSql = "BEGIN dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location =>'"+Constants.DATA_DICTIONARY+"'); END;";CallableStatement callableStatement = sourceConn.prepareCall(createDictSql);callableStatement.execute();
}

/*** <p>方法名称: startLogmur|描述:启动logminer分析 </p>* @throws Exception*/
public void startLogmur() throws Exception{Connection sourceConn = null;Connection targetConn = null;try {ResultSet resultSet = null;// 获取源数据库连接sourceConn = DataBase.getSourceDataBase();Statement statement = sourceConn.createStatement();// 添加所有日志文件,本代码仅分析联机日志StringBuffer sbSQL = new StringBuffer();sbSQL.append(" BEGIN");sbSQL.append(" dbms_logmnr.add_logfile(logfilename=>'"+Constants.LOG_PATH+"\\REDO01.LOG', options=>dbms_logmnr.NEW);");sbSQL.append(" dbms_logmnr.add_logfile(logfilename=>'"+Constants.LOG_PATH+"\\REDO02.LOG', options=>dbms_logmnr.ADDFILE);");sbSQL.append(" dbms_logmnr.add_logfile(logfilename=>'"+Constants.LOG_PATH+"\\REDO03.LOG', options=>dbms_logmnr.ADDFILE);");sbSQL.append(" END;");CallableStatement callableStatement = sourceConn.prepareCall(sbSQL+"");callableStatement.execute();// 打印获分析日志文件信息resultSet = statement.executeQuery("SELECT db_name, thread_sqn, filename FROM v$logmnr_logs");while(resultSet.next()){System.out.println("已添加日志文件==>"+resultSet.getObject(3));}System.out.println("开始分析日志文件,起始scn号:"+Constants.LAST_SCN);callableStatement = sourceConn.prepareCall("BEGIN dbms_logmnr.start_logmnr(startScn=>'"+Constants.LAST_SCN+"',dictfilename=>'"+Constants.DATA_DICTIONARY+"\\dictionary.ora',OPTIONS =>DBMS_LOGMNR.COMMITTED_DATA_ONLY+dbms_logmnr.NO_ROWID_IN_STMT);END;");callableStatement.execute();System.out.println("完成分析日志文件");// 查询获取分析结果System.out.println("查询分析结果");resultSet = statement.executeQuery("SELECT scn,operation,timestamp,status,sql_redo FROM v$logmnr_contents WHERE seg_owner='"+Constants.SOURCE_CLIENT_USERNAME+"' AND seg_type_name='TABLE' AND operation !='SELECT_FOR_UPDATE'");// 连接到目标数据库,在目标数据库执行redo语句targetConn = DataBase.getTargetDataBase();Statement targetStatement = targetConn.createStatement();String lastScn = Constants.LAST_SCN;String operation = null;String sql = null;boolean isCreateDictionary = false;while(resultSet.next()){lastScn = resultSet.getObject(1)+"";if( lastScn.equals(Constants.LAST_SCN) ){continue;}operation = resultSet.getObject(2)+"";if( "DDL".equalsIgnoreCase(operation) ){isCreateDictionary = true;}sql = resultSet.getObject(5)+"";// 替换用户sql = sql.replace("\""+Constants.SOURCE_CLIENT_USERNAME+"\".", "");System.out.println("scn="+lastScn+",自动执行sql=="+sql+"");try {targetStatement.executeUpdate(sql.substring(0, sql.length()-1));} catch (Exception e) {System.out.println("测试一下,已经执行过了");}}// 更新scnConstants.LAST_SCN = (Integer.parseInt(lastScn))+"";// DDL发生变化,更新数据字典if( isCreateDictionary ){System.out.println("DDL发生变化,更新数据字典");createDictionary(sourceConn);System.out.println("完成更新数据字典");isCreateDictionary = false;}System.out.println("完成一个工作单元");}finally{if( null != sourceConn ){sourceConn.close();}if( null != targetConn ){targetConn.close();}sourceConn = null;targetConn = null;}
}

3 运行结果

3.1 源数据库操作

1、创建AAAAA表,并插入数据

2、创建EMP1表

3.2 运行Demo

在控制台中输出如下日志

3.3 目标数据库结果

创建AAAAA和EMP1表,并在AAAAA插入了数据

3、使用Oracle Logminer同步Demo相关推荐

  1. 1、图解Oracle Logminer配置使用

    LogMiner配置使用手册 1 Logminer简介 1.1 LogMiner介绍 Oracle LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻 ...

  2. DSG-RealSync Oracle数据库同步复制及容灾技术简述

    DSG-RealSync Oracle数据库同步复制及容灾技术简述 1 为什么需要数据复制 1.1 信息系统存在的问题及需求 随着计算机应用系统的爆炸式发展,业务量迅速增加,业务种类日益复杂,企业必须 ...

  3. Oracle数据同步

    温习一下Oracle中常说的HA.RAC.Datagurad的区别 简单的说 rac侧重于负载均衡 dg侧重于容灾  datagourd 双机侧重于业务的自动接管 关键看你的应用要求是什么样的 来进行 ...

  4. oracle数据库同步交换的方法

    oracle数据同步方案与实现: 如何在两个oracle服务器之间交换数据? 来源:无忧模板 作者:网络编辑 更新时间:2010-08-09 18:10 点击:次 方案一:建立两个数据库之间的DATA ...

  5. Oracle Logminer 做数据恢复 说明示例

    在IBM DBA 小荷的blog上看到一个用Logminer 做数据恢复的例子. 虽然对Logminer 也了解一点,但是用Logminer 做恢复还真没用过,所以也测试一下. 原文链接地址如下: 客 ...

  6. toad查看oracle的plsql包,Oracle logminer 分析redo log(TOAD与PLSQL)

    Oracle logminer 分析redo log Oracle 11g r2 RAC centos 6.5 设置时间格式 select to_char(sysdate,'yyyy-mm-dd hh ...

  7. 基于OGG Datahub插件将Oracle数据同步上云

    摘要:随着数据规模的不断扩大,传统的RDBMS难以满足OLAP的需求,本文将介绍如何将Oracle的数据实时同步到阿里云的大数据处理平台当中,并利用大数据工具对数据进行分析. 一.背景介绍 随着数据规 ...

  8. Oracle Logminer 说明

    一.  Logminer 说明 Oracle LogMiner 的官网说明: Using LogMiner to Analyze Redo Log Files http://download.orac ...

  9. oracle 上搭建ogg文档,ogg搭建配置实现oracle数据同步到mysql)

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 参考博客文章:https://www.jianshu.com/p/53882229b70e ? 1)根据不同的数据库 ...

最新文章

  1. Python基础18-常用模块之os、sys、json、pickle、shelve、xml、re、logging、configparse、hashlib等
  2. 彻底澄清:C#方法参数
  3. python open 打开是什么类型的文件-详解Python中open()函数指定文件打开方式的用法...
  4. EasyExcel实现文件读取、导出、上传、下载操作
  5. windows phone7资料整理
  6. apache lucene_全文搜索Apache Lucene简介
  7. 【华为云技术分享】解析数据治理在过程可信变革中的运作流程
  8. C++俄罗斯方块(linux环境)-转 感觉非常好
  9. 动态主机配置协议DHCP
  10. 【目标跟踪】基于matlab背景差分多目标捕捉【含Matlab源码 810期】
  11. MAC终端命令颜色设置
  12. CKEditor与CKFinder学习--安全的使用CKFinder与权限控制
  13. win10以太网未识别的网络解决方法
  14. ubuntu mate 18.04官网下载,烧录及安装 SSH VNC ROS MAVROS librealsense realsense-ros vision_to_mavros(我自己亲自弄的)
  15. 企业微信可以自动回复吗?
  16. 可以背在身后的机器人助你一臂之力
  17. 微信小程序图片的加载
  18. 随处可见的红黑树详解
  19. 数据结构知识梳理笔记
  20. 计算机操作系统引论(操作系统)

热门文章

  1. 不使用vue-cli来创建项目
  2. lua学习笔记之位及字节
  3. hduoj1021 Fibonacci Again
  4. 测试时用存储过程来修改测试数据
  5. Makefile中常用的函数
  6. 算法学习——递推之猴子爬山
  7. 并发下常见的加锁及锁的PHP具体实现-转载
  8. 将表数据生成Insert脚本
  9. linux内核网络协议栈--监控和调优:发送数据(三十)
  10. 20164317《网络对抗技术》Exp9 Web安全基础