3、使用Oracle Logminer同步Demo
使用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、图解Oracle Logminer配置使用
LogMiner配置使用手册 1 Logminer简介 1.1 LogMiner介绍 Oracle LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻 ...
- DSG-RealSync Oracle数据库同步复制及容灾技术简述
DSG-RealSync Oracle数据库同步复制及容灾技术简述 1 为什么需要数据复制 1.1 信息系统存在的问题及需求 随着计算机应用系统的爆炸式发展,业务量迅速增加,业务种类日益复杂,企业必须 ...
- Oracle数据同步
温习一下Oracle中常说的HA.RAC.Datagurad的区别 简单的说 rac侧重于负载均衡 dg侧重于容灾 datagourd 双机侧重于业务的自动接管 关键看你的应用要求是什么样的 来进行 ...
- oracle数据库同步交换的方法
oracle数据同步方案与实现: 如何在两个oracle服务器之间交换数据? 来源:无忧模板 作者:网络编辑 更新时间:2010-08-09 18:10 点击:次 方案一:建立两个数据库之间的DATA ...
- Oracle Logminer 做数据恢复 说明示例
在IBM DBA 小荷的blog上看到一个用Logminer 做数据恢复的例子. 虽然对Logminer 也了解一点,但是用Logminer 做恢复还真没用过,所以也测试一下. 原文链接地址如下: 客 ...
- 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 ...
- 基于OGG Datahub插件将Oracle数据同步上云
摘要:随着数据规模的不断扩大,传统的RDBMS难以满足OLAP的需求,本文将介绍如何将Oracle的数据实时同步到阿里云的大数据处理平台当中,并利用大数据工具对数据进行分析. 一.背景介绍 随着数据规 ...
- Oracle Logminer 说明
一. Logminer 说明 Oracle LogMiner 的官网说明: Using LogMiner to Analyze Redo Log Files http://download.orac ...
- oracle 上搭建ogg文档,ogg搭建配置实现oracle数据同步到mysql)
在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 参考博客文章:https://www.jianshu.com/p/53882229b70e ? 1)根据不同的数据库 ...
最新文章
- Python基础18-常用模块之os、sys、json、pickle、shelve、xml、re、logging、configparse、hashlib等
- 彻底澄清:C#方法参数
- python open 打开是什么类型的文件-详解Python中open()函数指定文件打开方式的用法...
- EasyExcel实现文件读取、导出、上传、下载操作
- windows phone7资料整理
- apache lucene_全文搜索Apache Lucene简介
- 【华为云技术分享】解析数据治理在过程可信变革中的运作流程
- C++俄罗斯方块(linux环境)-转 感觉非常好
- 动态主机配置协议DHCP
- 【目标跟踪】基于matlab背景差分多目标捕捉【含Matlab源码 810期】
- MAC终端命令颜色设置
- CKEditor与CKFinder学习--安全的使用CKFinder与权限控制
- win10以太网未识别的网络解决方法
- ubuntu mate 18.04官网下载,烧录及安装 SSH VNC ROS MAVROS librealsense realsense-ros vision_to_mavros(我自己亲自弄的)
- 企业微信可以自动回复吗?
- 可以背在身后的机器人助你一臂之力
- 微信小程序图片的加载
- 随处可见的红黑树详解
- 数据结构知识梳理笔记
- 计算机操作系统引论(操作系统)