プライマリ・コンテンツに移動
Oracle® Databaseユーティリティ
12cリリース1 (12.1.0.2)
B71303-09
目次へ移動
目次
索引へ移動
索引

前
次

例6: 時間範囲による出力のフィルタ処理

前の2つの例では、問合せにタイムスタンプ・ベースの条件(TIMESTAMP > '10-jan-2012 15:59:53')を指定して、行をフィルタ処理しました。ただし、タイムスタンプ値に基づいてREDOレコードを除外するには、この例で示すとおり、DBMS_LOGMNR.START_LOGMNRプロシージャ・コールで時間範囲を指定する方法がより効率的です。

  1. マイニングするREDOログ・ファイルのリストを作成します。

    指定した時刻以降に生成されたREDOログ・ファイルをマイニングするとします。次のプロシージャは、指定した時刻に基づいてREDOログ・ファイルのリストを作成します。その後のSQL EXECUTE文は、プロシージャをコールし、開始時刻を2012年1月13日の午後2時に指定します。

    --
    -- my_add_logfiles
    -- Add all archived logs generated after a specified start_time.
    --
    CREATE OR REPLACE PROCEDURE my_add_logfiles (in_start_time  IN DATE) AS
      CURSOR  c_log IS 
        SELECT NAME FROM V$ARCHIVED_LOG 
          WHERE FIRST_TIME >= in_start_time;
    
    count      pls_integer := 0;
    my_option  pls_integer := DBMS_LOGMNR.NEW;
    
    BEGIN
      FOR c_log_rec IN c_log
      LOOP
        DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => c_log_rec.name, 
                                OPTIONS => my_option);
        my_option := DBMS_LOGMNR.ADDFILE;
        DBMS_OUTPUT.PUT_LINE('Added logfile ' || c_log_rec.name);
      END LOOP;
    END;
    /
    
    EXECUTE my_add_logfiles(in_start_time => '13-jan-2012 14:00:00');
  2. V$LOGMNR_LOGSを問い合せて、REDOログ・ファイルのリストを確認します。

    この例では、出力にREDOログ・ファイルのサイズを含めます。

    SELECT FILENAME name, LOW_TIME start_time, FILESIZE bytes 
        FROM V$LOGMNR_LOGS;
    
    NAME                                START_TIME            BYTES
    ----------------------------------- --------------------  ----------------
    /usr/orcl/arch1_310_482932022.dbf    13-jan-2012 14:02:35  23683584
    /usr/orcl/arch1_311_482932022.dbf    13-jan-2012 14:56:35  2564096
    /usr/orcl/arch1_312_482932022.dbf    13-jan-2012 15:10:43  23683584
    /usr/orcl/arch1_313_482932022.dbf    13-jan-2012 15:17:52  23683584
    /usr/orcl/arch1_314_482932022.dbf    13-jan-2012 15:23:10  23683584
    /usr/orcl/arch1_315_482932022.dbf    13-jan-2012 15:43:22  23683584
    /usr/orcl/arch1_316_482932022.dbf    13-jan-2012 16:03:10  23683584
    /usr/orcl/arch1_317_482932022.dbf    13-jan-2012 16:33:43  23683584
    /usr/orcl/arch1_318_482932022.dbf    13-jan-2012 17:23:10  23683584
  3. REDOログ・ファイルのリストを調整します。

    午後3時から4時の間に生成されたREDOログ・ファイルのみをマイニングする必要があるとします。

    問合せ条件(timestamp > '13-jan-2012 15:00:00' and timestamp < '13-jan-2012 16:00:00')を使用してこれを行います。ただし、問合せ条件はLogMinerによって返される各行で評価されるため、問合せ条件に基づく行のフィルタ処理は、内部マイニング・エンジンでは行われません。したがって、REDOログ・ファイルarch1_311_482932022.dbfからarch1_315_482932022.dbfまでの行のみを取得する場合でも、この問合せでは、LogMinerセッションに登録されたすべてのREDOログ・ファイルがマイニングされます。

    また、問合せ条件を使用し、分析する時間範囲外のREDOログ・ファイルを手動で削除することもできますが、最も簡単な解決法は、DBMS_LOGMNR.START_LOGMNRプロシージャ・コールで分析する時間範囲を指定する方法です。

    この方法では、REDOログ・ファイルのリストは変更されませんが、指定した時間範囲内のREDOログ・ファイルのみがLogMinerによってマイニングされます。

    EXECUTE DBMS_LOGMNR.START_LOGMNR(-
       STARTTIME => '13-jan-2012 15:00:00', -
       ENDTIME   => '13-jan-2012 16:00:00', -
       OPTIONS   => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + -
                    DBMS_LOGMNR.COMMITTED_DATA_ONLY + -
                    DBMS_LOGMNR.PRINT_PRETTY_SQL);
  4. V$LOGMNR_CONTENTSビューを問い合せます。

    SELECT TIMESTAMP, (XIDUSN || '.' || XIDSLT || '.' || XIDSQN) AS XID,
     SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = 'OE';
    
    TIMESTAMP              XID          SQL_REDO
    ---------------------  -----------  --------------------------------
    13-jan-2012 15:29:31   1.17.2376    update "OE"."PRODUCT_INFORMATION"
                                          set
                                            "WARRANTY_PERIOD" = TO_YMINTERVAL('+05-00')
                                          where
                                            "PRODUCT_ID" = 3399 and
                                            "WARRANTY_PERIOD" = TO_YMINTERVAL('+02-00') and
                                            ROWID = 'AAAHTKAABAAAY9TAAE';
    13-jan-2012 15:29:34   1.17.2376      insert into "OE"."PRODUCT_TRACKING"
                                            values
                                            "PRODUCT_ID" = 3399,
                                            "MODIFIED_TIME" = TO_DATE('13-jan-2012 15:29:34', 
                                            'dd-mon-yyyy hh24:mi:ss'),
                                            "OLD_LIST_PRICE" = 815,
                                            "OLD_WARRANTY_PERIOD" = TO_YMINTERVAL('+02-00');
    
    13-jan-2012 15:52:43   1.15.1756      update "OE"."PRODUCT_INFORMATION"
                                            set
                                              "WARRANTY_PERIOD" = TO_YMINTERVAL('+05-00')
                                            where
                                              "PRODUCT_ID" = 1768 and
                                              "WARRANTY_PERIOD" = TO_YMINTERVAL('+02-00') and
                                              ROWID = 'AAAHTKAABAAAY9UAAB';
    
    13-jan-2012 15:52:43   1.15.1756      insert into "OE"."PRODUCT_TRACKING"
                                            values
                                            "PRODUCT_ID" = 1768,
                                            "MODIFIED_TIME" = TO_DATE('13-jan-2012 16:52:43', 
                                            'dd-mon-yyyy hh24:mi:ss'),
                                            "OLD_LIST_PRICE" = 715,
                                            "OLD_WARRANTY_PERIOD" = TO_YMINTERVAL('+02-00');
    
  5. LogMinerセッションを終了します。

    EXECUTE DBMS_LOGMNR.END_LOGMNR();