今天寫篇原創的,把在工作中遇到的logminer問題總結下
(1)簡介:
logminer 工具即可以用來分析在線,也可以用來分析離線日志文件,即可以分析本身自己數據庫的重作日志文件,也可以用來分析其他數據庫的重作日志文件。
總的說來,logminer工具的主要用途有:
1. 跟蹤數據庫的變化:可以離線的跟蹤數據庫的變化,而不會影響在線系統的性能。
2. 回退數據庫的變化:回退特定的變化數據,減少point-in-time recovery的執行。
3. 優化和擴容計划:可通過分析日志文件中的數據以分析數據增長模式。
說到這里,不得不提一下oracle日志的問題,oracle日志分為在線redo日志和離線歸檔日志兩種,在線redo日志是必須的,離線歸檔日志可以設置是否歸檔,從而離線歸檔日志可以不存在,但如果沒有離線歸檔日志,那么是沒有什么實際價值的,如果數據庫崩潰,就不能進行回滾和回復了
(1)可以通過select * from v$log查看在線redo日志。

其中archived字段顯現的是否開啟歸檔,如上所示,未開啟歸檔模式,實際就沒有實際價值,可以啟動歸檔日志,可以看另一篇博客,在此不再說明
在線redo日志,有current,active和inactive字段,在線redo日志的切換原理是,正在修改的日志會標記為current,例如redo1,redo2,redo3,當redo1是current時,會一直寫redo1日志,當該日志寫滿后會修改redo2日志為current,redo1日志標記變為active,此時會對redo1進行歸檔,當歸檔完成后,變為inactive標記,current會循環着變化,當在變到redo1時就會覆蓋掉以前的內容。因此說開啟歸檔日志非常重要。
(2) 用select * from v$logfile;確定在線redo日志位置

注意:這里提示一點,在linux和windows系統的oracle中,在線redo日志為。。。。。.log,以.log后綴結尾,而在AIX中是沒有后綴的,在后面我會說這回有問題。
(3)使用select * from v$archived_log;查看離線歸檔日志位置。

歸檔日志在linux下是以.dbf后綴結尾
(4)開始介紹使用logminer工具(整個logminer都必須是sysdba運行)
要安裝logminer工具,必須首先要運行下面這樣兩個腳本,
l $ORACLE_HOME/rdbms/admin/dbmslm.sql
2 $ORACLE_HOME/rdbms/admin/dbmslmd.sql
l $ORACLE_HOME/rdbms/admin/dbmslm.sql
2 $ORACLE_HOME/rdbms/admin/dbmslmd.sql
3 $ORACLE_HOME/rdbms/admin/dbmslms.sql
這兩個腳本必須均以SYS用戶身份運行。其中第一個腳本用來創建DBMS_LOGMNR包,該包用來分析日志文件。第二個腳本用來創建DBMS_LOGMNR_D包,該包用來創建數據字典文件。 (即必須以sysdba運行)
這兩個腳本必須均以SYS用戶身份運行。其中第一個腳本用來創建DBMS_LOGMNR包,該包用來分析日志文件。第二個腳本用來創建DBMS_LOGMNR_D包,該包用來創建數據字典文件。 (即必須以sysdba運行)
設置生成數據字典位置:alter system set UTL_FILE_DIR='/oracle' scope=spfile;設置完成后必須重啟數據庫:shutdown immediate; //如果不好用就shutdown abort; 或者shutdown force;強行關閉
startup;開啟數據庫
生成數據字典:execute dbms_logmnr_d.build('dict.ora','/oracle');運行后將在/oracle 下生成數據字典
添加日志文件:(這里添加的是AIX下的在線redo日志)
execute dbms_logmnr.add_logfile(LogFileName=>'/dev/rredo1_1',Options=>dbms_logmnr.new);
execute dbms_logmnr.add_logfile(LogFileName=>'/dev/rredo1_2',Options=>dbms_logmnr.addfile);
execute dbms_logmnr.add_logfile(LogFileName=>'/dev/rredo1_2',Options=>dbms_logmnr.addfile);
execute dbms_logmnr.start_logmnr(DictFileName=>'/oracle/dict.ora'); //開啟logminer工具
隨后可以在v$logmnr_contents查看內容了,查看完成后使用:
execute dbms_logmnr.end_logmnr; //關閉logminer日志
這里介紹下logminer原理,logminer的原理是以數據字典為基礎加載redo日志文件,當運行dbms_logmnr.start_logmnr()后,會開啟,但不會掃描分析日志,logminer是在單進程PGA中運行,也就是只有在運行logminer工具的窗口中v$logmnr_contents視圖存在,新開啟SQLwindows查詢該表時不存在的,v$logminer生存期直到調用了end,會清空PGA。同時v$logmnr_contents采用的是動態掃描的方法,只有當有select 。。。。from v$log_contents動作時,logminer工具會開始從頭加載添加的日志文件,直到所有日志文件添加完成,或者是達到指定的日期(這個在后面說),所以v$logmnr_contents是動態生成的,因為這個原理,如果想以create table my_logmnr_contents as select * from v$logmnr_contents,可能就會出現死循環問題,注意這里是分析的在線redo日志,create table my_logmnr_contents也會寫到日志中,而v$logmnr_contents是動態的,也就是create table my_logmnr_contents的日志也會出現在v$logmnr_contents里,這就會造成死循環。注意,不是所有情況都會造成死循環。舉例說明:
redo1 current
redo2 inactive
redo3 inactive
redo4 inactive
如果把四個日志都加載進去,就一定會造成死循環,會導致current非常快速的切換日志,這是非常嚴重的后果,redo日志切換頻繁會出的問題可以自行查看,最終將導致create table my_logmnr_contents表的失敗,
但是如果加載單獨的日志,比如redo1日志,因為此時是current,logminer建自己的表后,current會切換,如果切換一圈又回到自身而create table還沒建完,就會出錯,而如果沒有在切回來,就不會錯,在舉個例子,如果加載的是redo2日志,此時為inactive,忘了說了將v$logmnr_contents復制成靜態表會大量增加日志,因此就會造成日志切換過快,加載redo2日志,current會很快切換redo2日志,這樣logminer也會出錯,總結就是如果一個日志在用logminer分析時,如果該日志標記改變,用create table就會不成功,這里有個例外就是如果不開啟歸檔模式,不管如何切換,復制自己的logminer表都可以成功。(這些都是經驗總結啊,說多了都是淚)
總之,用logminer解析日志,如果想存成自己的靜態表,會導致日志增加非常迅速,這點一定要注意。所以,一個方法就是只查詢,不產生自己的靜態表,二就是盡量加上日期等進行限制。加日期的方法如下:
(1)無限制條件
SQL> EXECUTE dbms_logmnr.start_logmnr( DictFileName=>' /oracle/dict.ora ');
(2)有限制條件
通過對過程DBMS_ LOGMNR.START_LOGMNR中幾個不同參數的設置(參數含義見表1),可以縮小要分析日志文件的范圍。通過設置起始時間和終止時間參數我們可以限制只分析某一時間范圍的日志。如下面的例子,我們僅僅分析2004年9月18日的日志,:
SQL> EXECUTE dbms_logmnr.start_logmnr(
DictFileName => ' /oracle/dict.ora',
StartTime => to_date('2004-9-18 00:00:00','YYYY-MM-DD HH24:MI:SS')
EndTime => to_date(''2004-9-18 23:59:59','YYYY-MM-DD HH24:MI:SS '));
也可以通過設置起始SCN和截至SCN來限制要分析日志的范圍:
SQL> EXECUTE dbms_logmnr.start_logmnr( DictFileName => '/oracle/dict.ora',
StartScn => 20, EndScn => 50);
表1 DBMS_LOGMNR.START__LOGMNR過程參數含義
參數
參數類型
默認值
含義
StartScn
數字型(Number)
0
分析重作日志中SCN≥StartScn日志文件部分
EndScn
數字型(Number)
0
分析重作日志中SCN≤EndScn日志文件部分
StartTime
日期型(Date)
1998-01-01
分析重作日志中時間戳≥StartTime的日志文件部分
EndTime
日期型(Date)
2988-01-01
分析重作日志中時間戳≤EndTime的日志文件部分
DictFileName
字符型(VARCHAR2)
0
字典文件,該文件包含一個數據庫目錄的快照。使用該文件可以使得到的分析結果是可以理解的文本形式,
4、觀察分析結果(v$logmnr_contents)
一共有四個表,詳細說明如下
V$LOGMNR_DICTIONARY-------查詢使用的數據字典文件
V$LOGMNR_PARAMETERS-------查詢當前LogMiner設定的參數
V$LOGMNR_LOGS-------查詢分析的日志文件
V$LOGMNR_CONTENTS-------日志文件的內容
SQL> EXECUTE dbms_logmnr.start_logmnr( DictFileName=>' /oracle/dict.ora ');
(2)有限制條件
通過對過程DBMS_ LOGMNR.START_LOGMNR中幾個不同參數的設置(參數含義見表1),可以縮小要分析日志文件的范圍。通過設置起始時間和終止時間參數我們可以限制只分析某一時間范圍的日志。如下面的例子,我們僅僅分析2004年9月18日的日志,:
SQL> EXECUTE dbms_logmnr.start_logmnr(
DictFileName => ' /oracle/dict.ora',
StartTime => to_date('2004-9-18 00:00:00','YYYY-MM-DD HH24:MI:SS')
EndTime => to_date(''2004-9-18 23:59:59','YYYY-MM-DD HH24:MI:SS '));
也可以通過設置起始SCN和截至SCN來限制要分析日志的范圍:
SQL> EXECUTE dbms_logmnr.start_logmnr( DictFileName => '/oracle/dict.ora',
StartScn => 20, EndScn => 50);
表1 DBMS_LOGMNR.START__LOGMNR過程參數含義
參數
參數類型
默認值
含義
StartScn
數字型(Number)
0
分析重作日志中SCN≥StartScn日志文件部分
EndScn
數字型(Number)
0
分析重作日志中SCN≤EndScn日志文件部分
StartTime
日期型(Date)
1998-01-01
分析重作日志中時間戳≥StartTime的日志文件部分
EndTime
日期型(Date)
2988-01-01
分析重作日志中時間戳≤EndTime的日志文件部分
DictFileName
字符型(VARCHAR2)
0
字典文件,該文件包含一個數據庫目錄的快照。使用該文件可以使得到的分析結果是可以理解的文本形式,
4、觀察分析結果(v$logmnr_contents)
一共有四個表,詳細說明如下
V$LOGMNR_DICTIONARY-------查詢使用的數據字典文件
V$LOGMNR_PARAMETERS-------查詢當前LogMiner設定的參數
V$LOGMNR_LOGS-------查詢分析的日志文件
V$LOGMNR_CONTENTS-------日志文件的內容
用logminer解析離線歸檔日志就沒有那么多事了,方法同上,而且也可以建自己的表保存v$logmnr_contents,但日志同樣會暴增,而且歸檔日志一般是按照一定的規則生成,不像在線redo日志,就那么幾個是固定的。
這里在說一下工作中遇到的問題,因為日志暴增的問題,想到的就是將服務器的字典文件,在線redo日志通過ssh或者ftp等方式,發送到遠程的另一個機器中進行分析,同時在遠程的服務器上生成自己的v$logmnr_contents日志,這樣就可以避免生產庫日志暴增的問題,但是也遇到了其他問題:
首先:原計划想分析在線日志文件,當一個日志由current變成非current時,說明該日志以滿,通過scp發送到遠程,但是AIX上的在線redo日志不知道什么原因,不能發送到windows服務器上,字典文件可以發送成功,但是日志怎么都不行,但是在centos上的oracle的在線redo日志就可以發送到windows服務器上,可能是由於沒有后綴,不能識別該文件,用ftp也不可以。但是可以將歸檔日志成功發送到windows服務器端。
其次:發送文件將涉及到斷網的情況,如何能夠在判斷歸檔日志發送到哪個,是否有新增歸檔日志,斷網后連網如何保證同步傳輸,不會丟失的問題。這些還沒有成功解答,成功后會有后續介紹。
這里寫下遠程分析logminer注意事項:
我們可以利用logminer日志分析工具來分析其他數據庫實例產生的重作日志文件,而不僅僅用來分析本身安裝logminer的數據庫實例的redo logs文件。使用logminer分析其他數據庫實例時,有幾點需要注意:
1. logminer必須使用被分析數據庫實例產生的字典文件,而不是安裝logminer的數據庫產生的字典文件,另外必須保證安裝logminer數據庫的字符集和被分析數據庫的字符集相同。
2. 被分析數據庫平台必須和當前logminer所在數據庫平台一樣,也就是說如果我們要分析的文件是由運行在UNIX平台上的Oracle 9i產生的,那么也必須在一個運行在UNIX平台上的Oracle實例上運行logminer,而不能在其他如Microsoft NT上運行logminer。當然兩者的硬件條件不一定要求完全一樣。
3. logminer日志分析工具僅能夠分析Oracle 8以后的產品,對於8以前的產品,該工具也無能為力
1. logminer必須使用被分析數據庫實例產生的字典文件,而不是安裝logminer的數據庫產生的字典文件,另外必須保證安裝logminer數據庫的字符集和被分析數據庫的字符集相同。
2. 被分析數據庫平台必須和當前logminer所在數據庫平台一樣,也就是說如果我們要分析的文件是由運行在UNIX平台上的Oracle 9i產生的,那么也必須在一個運行在UNIX平台上的Oracle實例上運行logminer,而不能在其他如Microsoft NT上運行logminer。當然兩者的硬件條件不一定要求完全一樣。
3. logminer日志分析工具僅能夠分析Oracle 8以后的產品,對於8以前的產品,該工具也無能為力