一、logminer的用途記錄檔中存放著所有進行資料庫恢複的資料,記錄了針對資料庫結構的每一個變化,也就是對資料庫操作的所有DML語句。logminer 工具即可以用來分析線上,也可以用來分析離線記錄檔,即可以分析本身自己資料庫的重作記錄檔,也可以用來分析其他資料庫的重作記錄檔。總的說來,logminer工具的主要用途有:
1.追蹤資料庫的變化:可以離線的追蹤資料庫的變化,而不會影響線上系統的效能。
2. 回退資料庫的變化:回退特定的變化資料,減少point-in-time recovery的執行。
3.最佳化和擴容計劃:可通過分析記錄檔中的資料以分析資料增長模式。
二、安裝logminer
要安裝logminer工具,必須首先要運行下面這樣兩個指令碼:
l. $Oracle_HOME/rdbms/admin/dbmslm.sql
2. $ORACLE_HOME/rdbms/admin/dbmslmd.sql
這兩個指令碼必須均以SYS使用者身份運行。其中第一個指令碼用來建立DBMS_LOGMNR包,該包用來分析記錄檔。第二個指令碼用來建立DBMS_LOGMNR_D包,該包用來建立資料字典檔案。
- SQL> @?/rdbms/admin/dbmslm.sql
-
- 程式包已建立。
-
- 授權成功。
-
- 同義字已建立。
-
- SQL> @?/rdbms/admin/dbmslmd.sql
-
- 程式包已建立。
-
- 同義字已建立。
-
- SQL> show user
- USER 為 "SYS"
三、使用logminer工具
下面將詳細介紹如何使用logminer工具。
1、建立資料字典檔案(data-dictionary)
前面已經談到,logminer工具實際上是由兩個新的PL/SQL內建包((DBMS_LOGMNR 和 DBMS_ LOGMNR_D)和四個V$動態效能檢視(視圖是在利用過程DBMS_LOGMNR.START_LOGMNR啟動logminer時建立)組成。在使用logminer工具分析redo log檔案之前,必須使用DBMS_LOGMNR_D 包將資料字典匯出為一個文字檔。該字典檔案是可選的,但是如果沒有它,logminer解釋出來的語句中關於資料字典中的部分(如表名、列名等)和數值都將是16進位的形式,我們是無法直接理解的。
例如,下面的sql語句: INSERT INTO dm_dj_swry (rydm, rymc) VALUES (00005, '張三');
logminer解釋出來的結果將是下面這個樣子, insert into Object#308(col#1, col#2) values (hextoraw('c30rte567e436'), hextoraw('4a6f686e20446f65'));
建立資料字典的目的就是讓logminer引用涉及到內部資料字典中的部分時為他們實際的名字,而不是系統內部的16進位。資料字典檔案是一個文字檔,使用包DBMS_LOGMNR_D來建立。如果我們要分析的資料庫中的表有變化,影響到庫的資料字典也發生變化,這時就需要重新建立該字典檔案。另外一種情況是在分析另外一個資料庫檔案的重作日誌時,也必須要重建一遍被分析資料庫的資料字典檔案。首先指定資料字典檔案的位置,也就是添加一個參數UTL_FILE_DIR,該參數值為伺服器中放置資料字典檔案的目錄。重新啟動資料庫,使新加的參數生效,然後建立資料字典檔案。
- SQL> show user
- USER 為 "SYS"
- SQL> show parameter utl_file_dir
-
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- utl_file_dir string
-
- SQL> alter system set utl_file_dir='/u01/app/logminer' scope=spfile;
-
- 系統已更改。
-
- SQL> shutdown immediate
- 資料庫已經關閉。
- 已經卸載資料庫。
- ORACLE 常式已經關閉。
- SQL> startup
- ORACLE 常式已經啟動。
-
- Total System Global Area 238530560 bytes
- Fixed Size 1335724 bytes
- Variable Size 150998612 bytes
- Database Buffers 83886080 bytes
- Redo Buffers 2310144 bytes
- 資料庫裝載完畢。
- 資料庫已經開啟。
- SQL> show parameter utl_file_dir
-
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- utl_file_dir string /u01/app/logminer
- SQL> exec dbms_logmnr_d.build( 'dictionary.ora', '/u01/app/logminer');
-
- PL/SQL 過程已成功完成。
開始之前
- SQL> show user
- USER 為 "SYS"
- SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
-
- SUPPLEME
- --------
- NO
-
- SQL> alter database add supplemental log data;
-
- 資料庫已更改。
-
- SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
-
- SUPPLEME
- --------
- YES
supplemental logging(擴充日誌):在通常情況下,redo log 只記錄的進行恢複所必需的資訊,但是這些資訊對於我們使用redo log進行一些其他應用時是不夠的,例如在 redo log中使用rowid唯一標識一行而不是通過Primary key,如果我們在另外的資料庫分析這些日誌並想重新執行某些dml時就可能會有問題,因為不同的資料庫其rowid代表的內容是不同的。在這時候就需要一些額外的資訊(columns)加入redo log,這就是supplemental logging。supplemental logging分為兩個層級database_level and table_level,其中database_level層級分為兩種,minimal supplemental logging and identification key logging,其中minimal supplemental logging不會顯著增加系統的負擔,但是identification key logging對系統負擔比較大,在預設情況下oracle不會設定任何supplemental logging,但是如果要使用logminer,oracle建議至少設定minimal supplemental logging。我在使用logminer是,不設定minimal supplemental logging,從v$logmnr_contents中幾乎得不到任何資訊。
2、建立要分析的記錄檔列表
Oracle的重作日誌分為兩種,線上(online)和離線(offline)歸檔記錄檔,下面就分別來討論這兩種不同記錄檔的列表建立。
(1)分析線上重作記錄檔
- SQL> show user
- USER 為 "SYS"
- SQL> select * from v$log;
-
- GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
- ---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------- ------------ --------------
- 1 1 67 52428800 512 1 YES INACTIVE 643449 14-12月-11 653614 15-12月-11
- 2 1 68 52428800 512 1 NO CURRENT 653614 15-12月-11 2.8147E+14
- 3 1 66 52428800 512 1 YES INACTIVE 614556 13-12月-11 643449 14-12月-11
-
- SQL> select * from v$logfile;
-
- GROUP# STATUS TYPE MEMBER IS_
- ---------- ------- ------- ------------------------------------------------------------ ---
- 1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO
- 2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO
- 3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO
-
- SQL> exec dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo01.log', dbms_logmnr.new);
-
- PL/SQL 過程已成功完成。
-
- SQL> exec dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo02.log', dbms_logmnr.addfile);
-
- PL/SQL 過程已成功完成。
-
- SQL> exec dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo03.log', dbms_logmnr.addfile);
-
- PL/SQL 過程已成功完成。
刪除列表中的記錄檔:exec dbms_logmnr.add_logfile('/u01/app/oracle/oradata/orcl/redo03.log', dbms_logmnr.removefile);
關於這個記錄檔列表中需要分析記錄檔的個數完全由你自己決定,但這裡建議最好是每次只添加一個需要分析的記錄檔,在對該檔案分析完畢後,再添加另外的檔案。