1. 程式人生 > >Oracle 11g之LogMiner常用案例

Oracle 11g之LogMiner常用案例

LogMiner案例

  • Enable Supplemental Logging

  • Extract a LogMiner Dictionary(unless you plan to use the online catalog)

  • Specify Redo Log Files for Analysis

  • Start LogMiner

  • Query V$LOGMNR_CONTENTS

  • End the LogMiner Session

1.1 顯式指定重做日誌檔案的LogMiner例項

本節內容必須開啟最小補充日誌:

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

另外有些例項用到日期格式,這裡事先設定日期格式:

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'dd-mon-yyyy hh24:mi:ss';

1.1.1 查詢最新歸檔重做檔案中所有的更改操作

   最簡單的檢查資料庫的修改歷史是在源資料庫中使用線上聯機日誌來解析重做日誌檔案,本節案例找出了資料庫生成的最後的歸檔日誌中的所有的修改操作(假定該資料不是RAC資料庫)。

1.查詢最新歸檔的重作日誌。

SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE FIRST_TIME = (SELECT MAX(FIRST_TIME) FROM V$ARCHIVED_LOG);

2.新增重做日誌檔案

SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -

 LOGFILENAME => '/usr/oracle/data/db1arch_1_16_482701534.dbf', -

 OPTIONS => DBMS_LOGMNR.NEW);

3.開始分析

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( -

     OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

4.查詢結果

SQL> SELECT username AS USR, (XIDUSN || '.' || XIDSLT || '.' ||  XIDSQN) AS XID,

   SQL_REDO, SQL_UNDO FROM V$LOGMNR_CONTENTS WHERE username IN ('HR', 'OE');

5.關閉LogMiner會話

SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();

1.1.2 查詢提交事務中的DML語句

   如上節所示,預設情況下LogMiner顯示重做日誌檔案中所有的修改操作,不管事務是否提交,由上節查詢結果可知屬於同一事務DML語句沒有羅列在一起,查詢結果不那麼易讀。雖然可以使用SQL來控制想要的輸出結果,但是LogMiner提供了一個更簡單的方法。在這個例子中,最新的歸檔重做日誌檔案將再次被分析,但它將只返回提交的事務。

   除了分析步驟,其他步驟與上節完全一樣,分析語句如下:

SQL>EXECUTE DBMS_LOGMNR.START_LOGMNR( -

    OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + -

    DBMS_LOGMNR.COMMITTED_DATA_ONLY); 

1.1.3 重構SQL語句

如果想輸出的結果更為直觀易讀,可以通過指定PRINT_PRETTY_SQL引數來美化輸出結果。

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(-

   OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + -

              DBMS_LOGMNR.COMMITTED_DATA_ONLY + -

              DBMS_LOGMNR.PRINT_PRETTY_SQL);

1.1.4 使用重作日誌檔案中的LogMiner字典

   當LogMiner字典存於線上聯機日誌檔案中,必須在源資料庫分析重做日誌檔案,而當LogMiner字典存於重作日誌檔案中,就可以在不同的資料庫分析重做日誌檔案。

1.查詢最新歸檔的重作日誌。

SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE FIRST_TIME = (SELECT MAX(FIRST_TIME) FROM V$ARCHIVED_LOG);

2.查詢包含字典的重做日誌檔案

  • 查詢包含字典提取結束的重做日誌檔案
SQL> SELECT NAME, SEQUENCE#, DICTIONARY_BEGIN d_beg, DICTIONARY_END d_end FROM V$ARCHIVED_LOG WHERE SEQUENCE# = 

   (SELECT MAX (SEQUENCE#) FROM V$ARCHIVED_LOG WHERE DICTIONARY_END = 'YES' and SEQUENCE# <= 210);
  • 查詢包含字典提取開始的重做日誌檔案
SQL> SELECT NAME, SEQUENCE#, DICTIONARY_BEGIN d_beg, DICTIONARY_END d_end 

    FROM V$ARCHIVED_LOG WHERE SEQUENCE# = (SELECT MAX (SEQUENCE#) 
 
   FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN = 'YES' and SEQUENCE# <= 208);
  • 新增重做日誌檔案
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(-

    LOGFILENAME => '/usr/oracle/data/db1arch_1_210_482701534.dbf', -

       OPTIONS => DBMS_LOGMNR.NEW);

SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(-

   LOGFILENAME => '/usr/oracle/data/db1arch_1_208_482701534.dbf');

SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(-

   LOGFILENAME => '/usr/oracle/data/db1arch_1_207_482701534.dbf');
  • 通過V$LOGMNR_LOGS查詢重做日誌檔案分析列表
SQL> SELECT FILENAME AS name, LOW_TIME, HIGH_TIME FROM V$LOGMNR_LOGS;

3.開始分析

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(-

   OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + -

              DBMS_LOGMNR.COMMITTED_DATA_ONLY + -

              DBMS_LOGMNR.PRINT_PRETTY_SQL);

4.查詢分析結果

SQL> SELECT USERNAME AS usr, SQL_REDO FROM V$LOGMNR_CONTENTS 

   WHERE SEG_OWNER IS NULL OR SEG_OWNER NOT IN ('SYS', 'SYSTEM') AND

   TIMESTAMP > '10-jan-2003 15:59:53';

5.關閉LogMiner會話

SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();

1.1.5 跟蹤內部字典的DDL語句

其他步驟與上節相同,唯一不同的事步驟3開始分析,如下:

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(-

   OPTIONS => DBMS_LOGMNR.DICT_FROM_REDO_LOGS + -

              DBMS_LOGMNR.DDL_DICT_TRACKING + -

              DBMS_LOGMNR.COMMITTED_DATA_ONLY + -

              DBMS_LOGMNR.PRINT_PRETTY_SQL);

1.1.6 通過時間範圍過濾輸出

   前面的例子中都是通過查詢分析結果的時間限定的SQL子句來過濾輸出結果,然而有一個更高效的方法來達到這個目的,這就是通過指定DBMS_LOGMNR.START_LOGMNR的時間範圍。

1.建立重做日誌列表

--

-- 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-2003 14:00:00');

2.查詢V$LOGMNR_LOGS確定重做日誌檔案列表

SQL> SELECT FILENAME name, LOW_TIME start_time, FILESIZE bytes

    FROM V$LOGMNR_LOGS;

3.調整重做日誌列表

假定要分析的時產生於3 p.m.到4 p.m的重做日誌檔案:

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(-

   STARTTIME => '13-jan-2003 15:00:00', -

   ENDTIME   => '13-jan-2003 16:00:00', -

   OPTIONS   => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + -

                DBMS_LOGMNR.COMMITTED_DATA_ONLY + -

                DBMS_LOGMNR.PRINT_PRETTY_SQL);

4.查詢V$LOGMNR_CONTENTS

SQL> SELECT TIMESTAMP, (XIDUSN || '.' || XIDSLT || '.' || XIDSQN) 

     AS XID, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = 'OE';

5.關閉LogMiner會話

SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();

1.2 未指定重做日誌檔案列表的LogMiner例項

   上一節的諸多例項都是顯式指定要分析的重做日誌檔案或者歸檔檔案,但是,對於同一資料庫生成的重做日誌檔案,可以通過指定時間或者SCN範圍來確定要分析的重做日誌列表,這個可以通過使用DBMS_LOGMNR.START_LOGMNR過程的DBMS_LOGMNR.CONTINUOUS_MINE來完成。

1.2.1 在給定的時間範圍內分析重做日誌

1.確定包含資料字典起始的重做日誌檔案時間戳

SQL> SELECT NAME, FIRST_TIME FROM V$ARCHIVED_LOG WHERE SEQUENCE# = (SELECT MAX(SEQUENCE#)

   FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN = 'YES');

2.查出該時間戳到現在所有的重做日誌

該步驟不是必須的,但是它可以用來證明CONTINUOUS_MINE是按預期來進行的,用來步驟4作對比。

SQL> SELECT FILENAME name FROM V$LOGMNR_LOGS WHERE LOW_TIME > '10-jan-2003 12:01:34';

3.開始分析

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(-

   STARTTIME => '10-jan-2003 12:01:34', -

     ENDTIME => SYSDATE, -

     OPTIONS => DBMS_LOGMNR.DICT_FROM_REDO_LOGS + -

                DBMS_LOGMNR.COMMITTED_DATA_ONLY + -

                DBMS_LOGMNR.PRINT_PRETTY_SQL + -

                    DBMS_LOGMNR.CONTINUOUS_MINE);

4.查詢V$LOGMNR_LOGS

該步驟用來顯示帶有CONTINUOUS_MINE引數的DBMS_LOGMNR.START_LOGMNR過程所執行的所有的重做日誌檔案,參見步驟2.

SQL> SELECT FILENAME name FROM V$LOGMNR_LOGS;

5.查詢V$LOGMNR_CONTENTS

SQL> SELECT USERNAME AS usr,(XIDUSN || '.' || XIDSLT || '.' || XIDSQN) as XID, SQL_REDO 

    FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER IS NULL OR SEG_OWNER NOT IN ('SYS', 'SYSTEM') AND TIMESTAMP > '10-jan-2003 15:59:53';

6.關閉LogMiner會話

SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();

1.2.2 在給定的SCN範圍內分析重做日誌

1.確定上一檢查點的SCN

SQL> SELECT CHECKPOINT_CHANGE#, CURRENT_SCN FROM V$DATABASE;

2.開始LogMiner並指定CONTINUOUS_MINE

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(-

   STARTSCN => 56453576, -

   ENDSCN   => 56454208, -

   OPTIONS  => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + -

               DBMS_LOGMNR.COMMITTED_DATA_ONLY + -

               DBMS_LOGMNR.PRINT_PRETTY_SQL + -

               DBMS_LOGMNR.CONTINUOUS_MINE);

3.查詢LogMiner中的重做日誌列表

SQL> SELECT FILENAME name, LOW_SCN, NEXT_SCN FROM V$LOGMNR_LOGS;

   請注意,LogMiner新增的重做日誌檔案不包括整個SCN範圍,當用指定CONTINUOUS_MINE引數來執行DBMS_LOGMNR.START_LOGMNR時,LogMiner僅僅是新增歸檔日誌。根據查詢需要,LogMiner會自動新增SCN範圍內其他的線上重做日誌,用如下的SQL來確定最新的歸檔檔案中是否包含了該重做日誌檔案。

SQL> SELECT NAME FROM V$ARCHIVED_LOG

   WHERE SEQUENCE# = (SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG);

4.查詢V$LOGMNR_CONTENTS

該查詢不返回1.6.1911事務的SET TRANSACTION READ WRITE和COMMIT語句,因為這些語句沒有SEG_OWNER。

SQL> SELECT SCN, (XIDUSN || '.' || XIDSLT || '.' ||  XIDSQN) as XID, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER NOT IN ('SYS', 'SYSTEM');

5.關閉LogMiner會話

SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();

1.2.3 在包含未來值的查詢中使用連續分析

   指定一個查詢到指定的時間或者SCN才停止,可以通過設定DBMS_LOGMNR.START_LOGMNR的CONTINUOUS_MINE引數和設定一個未來時間點的ENDTIME或未來的ENDSCN引數來達到目的。

下面的例子,假設你想使用線上字典來監控hr.employees表現在開始到5小時後所有的變化,

1.開始LogMiner

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(-

   STARTTIME => SYSDATE, -

   ENDTIME   => SYSDATE + 5/24, -

   OPTIONS   => DBMS_LOGMNR.CONTINUOUS_MINE  + -

                DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

2.查詢V$LOGMNR_CONTENTS

   該查詢操作直到查到指定的時間範圍內(5小時後)生成的第一個重做日誌檔案記錄才會停止,當然你也可以通過Ctrl+C結束查詢。本例中“SET ARRAYSIZE”語句使得查詢結果格式可以跟它在重做日誌檔案中一樣,如果不這樣設定,那麼查詢結果的SQL會填滿行才換行,不夠美觀易讀。

SQL> SET ARRAYSIZE 1;

SQL> SELECT USERNAME AS usr, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE  SEG_OWNER = 'HR' AND TABLE_NAME = 'EMPLOYEES';

3.停止LogMiner

SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();

本文參閱Oracle官方文件翻譯,不足之處歡迎批評指正!

相關推薦

Oracle 11gLogMiner常用案例

1 LogMiner案例 Enable Supplemental Logging Extract a LogMiner Dictionary(unless you plan to use the online catalog) Specify Redo Log Fi

Oracle 11gLogMiner常用場景

1 LogMiner常用場景 1.1 用LogMiner跟蹤特定使用者所做的更改 本節例子,查出使用者joedevo在特定時間範圍內對資料庫所做的所有操作,步驟如下: 1.建立LogMiner字典    使用LogMiner分析joedevo相關的資料,必須在joe

Oracle 語句簡單常用查詢

新增欄位和備註ALTER TABLE 表名 ADD (COL1 VARCHAR2(10) ,COL2 VARCHAR2(10),...); COMMENT ON COLUMN 表名.COL1 IS '

Oracle 11g RAC 管理常用命令

1、檢查 CRS 狀態[[email protected] ~]$ crsctl check crsCRS-4638: Oracle High Availability Services is onlineCRS-4537: Cluster Ready Servi

ORACLE 11G DATAGUARD搭建物理standby

1 安裝環境 在Primary庫上安裝資料庫軟體,並建監聽和例項,在Standby庫上安裝資料庫軟體,並建監聽,但不建例項。 Primary庫 Standby庫 作業系統 CentOS release 6.4 64位 CentOS release 6

oracle 11g dataguarddgmgrl

dgmgrl snapshot環境概述:搭好Dataguard,搭建參考:http://blog.51cto.com/snowhill/1923591源:db_name:db rac備:db_name:sbdb1 單機 1 啟用dgmgrl相關參數: dg_broker_startdg_broker_con

Oracle 11g 查看執行計劃10046事件

oradebug event 1004 tkprof 使用10046事件查看真實的執行計劃操作如下:SQL> conn / as sysdbaConnected.SQL> SQL> oradebug setmypid Statement processed.SQL> SQL&g

Oraclejob 常用定時時間

sunday months class ast 星期 sysdate int 執行 UNC 1 每天午夜12點 ‘‘TRUNC(SYSDATE + 1)‘‘ 2 每天早上8點30分 ‘‘TRUNC(SYSDATE +

oracle 創建表空間及oracle 11g表空間最大最小

rop create default 數據文件 32位系統 conn dbf ide 剩余空間 /*分為四步 *//*第1步:創建臨時表空間 */create temporary tablespace emaoyi_temp tempfile ‘D:\app\Adminis

oracle 11g常用的基本管理命令,包括建立使用者、表空間、許可權等

Oracle 11g最常用的基本管理命令,包括建立使用者、表空間,許可權分配等 1、啟動oracle資料庫: 從root切換到oracle使用者進入:su - oracle 進入sqlplus環境,nolog引數表示不登入:sqlplus /nolog 以管理員模式登入:sqlplu

oracle 11g表空間最大最小

oracle支援的檔案大小和他的db_block_size和db_block的數量決定的。在oracle 9i以前,oracle 的db_block的數量最大隻能為2的22次方個,而我們通過oracle預設的模板建的資

Oracle 11g RAC 錯誤集錦---VIP 故障

Oracle 11g RAC 錯誤集錦之---VIP 故障故障現象:Oracle RAC VIP 故障系統環境: 作業系統:Redhat EL55 叢集軟體:CRS 11G 資料庫軟體:Oracle 1

Oracle 錯誤Oracle Database 11g 未在當前作業系統中經過認證

出處:http://www.educity.cn/windows/621732.html 錯誤資訊如下:   《提示有1個錯誤,1個警告,2個要求待驗證 錯誤問題詳細資訊如下:正在檢查作業系統要求… 要求的結果: 5.0,5.1,5.2,6.0 之一實際結果: 6.1

Oracle 叢集】Oracle 11G RAC教程叢集安裝(七)

Oracle登入rac1進行上傳,解壓安裝p13390677_112040_Linux-x86-64_1of7.zip、p13390677_112040_Linux-x86-64_2of7.zip、p13390677_112040_Linux-x86-64_3of7.zip到/media下,並解壓

oracle 11g 安裝及netca,dbca亂碼解決

 在中文Linux下安裝Oracle 11g,執行runInstaller後預設會出現亂碼,解決辦法如下: 1、準備字型zysong.ttf,點選下載,解壓下載到的fallback 2、使用歸檔管理器開啟database/stage/Components/oracle.jdk/1.5.0.17.0/1/D

Oracle 11g Data Guard主備庫切換(switchover不使用DG Broker)

--目前主庫PROD3,備庫AUX --檢視主備庫日誌傳輸情況 [email protected]> select max(sequence#) from v$archived_log; MAX(SEQUENCE#) --------------

Oracle日誌挖掘LogMiner(前部分原理解釋,後部分實操!)

官方文件地址:http://docs.oracle.com/cd/E11882_01/server.112/e22490/logminer.htm#SUTIL019本文轉自:http://blog.itpub.net/26736162/viewspace-2141148/眾所周知,所有對使用者資料和資料字典的

Oracle 11g常用管理命令

首先,以oracle使用者登陸。 1、啟動ORACLE資料庫: 進入sqlplus環境,nolog引數表示不登入:$sqlplus /nolog 以管理員模式登入:$sqlplus / as sysd

Oracle 11g R2資料庫檔案遷移案例

資料庫檔案存放在儲存上,當需要更換新儲存時,就需要變更新的儲存路徑,遷移原有的資料檔案,本文件介紹兩種資料檔案遷移的方法。省略輸出結果。一、RMAN遷移資料檔案 步驟:1.修改引數檔案中控制檔案的存放位置SQL>alter system set control_file

Oracle學習路(二):oracle多表查詢+分組查詢+子查詢講解與案例分析+經典練習題

1.笛卡爾集和叉集 笛卡爾集會在下面條件下產生:省略連線條件、連線條件無效、所有表中的所有行互相連線。 為了避免笛卡爾集, 可以在 WHERE 加入有效的連線條件。在實際執行環境下,應避免使用全笛卡爾集。 使用CROSS JOIN 子句使連線的表產生叉集。叉集和笛卡