<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      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 框架圖

      clip_image002[6]

      1.3 流程圖

      clip_image002[4]

      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:源數據庫、目標數據庫配置、字典文件和歸檔文件路徑。

      clip_image006[4]

      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("測試一下,已經執行過了");
                  }
              }
              
              // 更新scn
              Constants.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表,并插入數據

      clip_image008[4]

      2、創建EMP1表

      clip_image010[4]

      3.2 運行Demo

      在控制臺中輸出如下日志

      clip_image012[4]

      3.3 目標數據庫結果

      創建AAAAA和EMP1表,并在AAAAA插入了數據

      clip_image014[4]

      posted @ 2013-06-19 08:33  shishanyuan  閱讀(5237)  評論(6)    收藏  舉報
      主站蜘蛛池模板: 国产成人无码精品亚洲| 国产熟女高潮一区二区三区| 欧美牲交a欧美牲交aⅴ免费真| 国产精品久久蜜臀av| 亚洲精品成人A在线观看| 人妻少妇精品中文字幕| 嫩草欧美曰韩国产大片| 国产一级黄色片在线播放| 日本公与熄乱理在线播放| 人妻 日韩精品 中文字幕| 亚洲色偷偷色噜噜狠狠99| 青草热在线观看精品视频| 亚洲国产成人久久精品APP| 日本中文字幕在线| 久久国产精品二国产人妻| 国产精品一二区在线观看| 加勒比无码人妻东京热| 中文字幕国产精品资源| 亚洲欧美日韩久久一区二区| 26uuu另类亚洲欧美日本| 天天拍夜夜添久久精品大| 亚洲成av人片天堂网无码 | 国产综合久久99久久| 国产在线啪| 亚洲欧美综合精品二区| 亚洲国产另类久久久精品网站 | 欧美成人精品| 日韩精品有码中文字幕| 国产精品丝袜一区二区三区| 1精品啪国产在线观看免费牛牛| 中文字幕成熟丰满人妻| 亚洲国产精品久久电影欧美| 男女啪啪永久免费观看网站| 国产极品尤物粉嫩在线观看| 麻豆成人精品国产免费| 免费观看日本污污ww网站69| 国产va免费精品观看| 国产成人亚洲综合91精品| 亚洲中文字幕无码专区| 在线看无码的免费网站| 高清国产av一区二区三区|