您好,登錄后才能下訂單哦!
(一)LogMiner工具的作用
Logminer工具主要用來分析redo log和archive log文件。通過該工具,可以輕松獲得Oracle redo log和archive log文件的具體內容,甚至,可以獲得用戶對數據庫進行的DDL、DML操作。另外還可分析得到一些需要回滾的sql語句。該工具特別適合調試、審計以及回退某個特定的對象。Logminer的作用總結如下:
1.跟蹤數據庫的變化,可以離線跟蹤數據的變化,而不會影響在線的性能;
2.回退數據庫的變化,回退特定的變化的數據,減少point-in-time recovery的執行 ;
3.確定事物級要執行的精細邏輯恢復操作,通過查詢log,取得需要的undo語句;
4.審計,查看具體用戶對數據庫做的具體操作。
注意:
1.LogMiner不支持IOT表、Long、LOB及集合類型;
(二)如何使用
(1)安裝LogMiner
通常在安裝數據庫后就已經安裝了Logminer,要查看數據庫是否安裝了LogMiner,只需查看數據庫中是否已經有了dbms_logmnr和dbms_logmnr_d這2個package,如果有了,則已經安裝,如果沒有,執行下面兩個腳本即可:
$ORACLE_HOME/rdbms/admin/dbmslm.sql$ORACLE_HOME/rdbms/admin/dbmslmd.sql
需要注意,兩個腳本須用DBA用戶身份運行。第1個腳本用來創建dbms_logmnr包,該包用來分析日志文件,第2個腳本用來創建dbms_logmnr_d包,該包用來創建數據字典文件。
創建完成后數據庫中將多出4個procedure和3個view,具體如下:
1. dbms_logmnr_d.build :創建一個數據字典文件;
2. dbms_logmnr.add_logfile :添加日志文件以供分析;
3. dbms_logmnr.start_logmnr :開始分析日志文件;
4. dbms_logmnr.end_logmnr :結束分析日志文件;
1.v$logmnr_dictionary :顯示字典文件的信息;
2.logmnr_logs :在LogMiner啟動時顯示要分析的日志列表;
3.logmnr_contents :Logminer啟動后,可以使用該view查看日志文件的內容。
需要注意,這里的view是session相關,其它session是查看不到的,僅僅可以在當前session中查看。
(2)如果要分析歸檔數據,需要數據庫需處于歸檔模式下,通過如下命令查看歸檔模式
SQL> archive log list; 數據庫日志模式 存檔模式 自動存檔 啟用 存檔終點 /home/app/oracle/oradata/orcl/arch_log 最早的聯機日志序列 46下一個存檔日志序列 49當前日志序列 49
(3)創建數據字典之前需要修改spfile參數utl_executefile_dir,由于是靜態參數需要重啟數據庫
SQL> create directory utlfile as '/home/oracle/logmnr'; Directory created SQL> alter system set utl_executefile_dir = '/home/oracle/logmnr' scope=spfile;
(4)生成數據字典文件(可選)
在使用LogMiner工具之前,可以使用dbms_logmnr_d.build創建一個數據字典文件,創建該文件的目的是將數據字典導出為一個文本文件,該文件是可選的,但是如果沒有該文件,LogMiner解釋出的關于數據字典中的部分,如表名、列名、元數據將會以16進制的形式展現,我們是無法理解的。
需要注意的是,如果我們要分析的數據庫中的表發生了變化,影響到數據字典信息也發生了變化,那么我們在進行分析時,就需要重新生成數據字典文件。
創建數據字典文件需要以dba身份進行,創建到上面建好的logmnr文件中
begindbms_logmnr_d.build(dictionary_filename=>'dict.ora', dictionary_location=>'/home/oracle/logmnr', options=>dbms_logmnr_d.store_in_flat_file);end;/
(5)加入需要分析的日志文件
LogMiner可以對重做日志文件(redo log)和歸檔日志文件(archive log)進行分析,加入要分析的日志文件使用dbms_logmnr.add_logfile過程,第一個文件使用參數dbms_logmnr.NEW參數,后面的文件使用dbms_logmnr.ADDFILE參數。
step1:創建列表,添加第1個文件:
BEGIN dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_49_936489730.dbf',options=>dbms_logmnr.NEW);END;/
step2:添加其它文件到列表
BEGIN dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_50_936489730.dbf',options=>dbms_logmnr.ADDFILE); dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_51_936489730.dbf',options=>dbms_logmnr.ADDFILE);END;/
(6)使用Logminer文件進行分析
LogMiner分析日志文件可以設置限制條件,也可不設置限制條件,不設置限制條件會對加載的全部日志文件進行分析,設置了限制條件,只會對符合條件的日志進行分析。
(6.1)不限制條件
EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora');
(6.2)有限制條件
通過對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 varchar() 數據字典文件的位置
(7)觀察分析結果
通過第(6)步,我們已經得到了重做日志文件的內容,通過動態數據字典v$logmnr_contents可以查看到所有的信息。
select * from v$logmnr_contents;
v$logmnr_contents的部分欄位信息:
欄位 解釋
--------------------------- ------------------------------------
SCN 查詢的特定數據的SCN號
TIMESTAM 數據改變發生的時間
COMMIT_TIMESTAMP 數據改變提交的時間
SEG_OWNER 數據發生改變的段名稱
SEG_NAME 段的所有者的名稱
SEG_TYPE 數據發生改變的段類型
SEG_TYPE_NAME 數據發生改變的段類型名稱
TABLE_SPACE 變化段的表空間
ROW_ID 數據變化行的ID
SESSION_INFO 數據發生變化時會話信息
OPERATION 日志中記錄的操作
SQL_REDO 日志中記錄的指定行變化的SQL語句(正向操作)
SQL_UNDO 為重做日志記錄回退或恢復制定行變化的SQL語句
(三)一次LogMiner使用測試
(1)查看歸檔,下一個歸檔log是53
SQL> archive log listDatabase log mode Archive Mode Automatic archival Enabled Archive destination /home/app/oracle/oradata/orcl/arch_log Oldest online log sequence 50Next log sequence to archive 53Current log sequence 53
(2)查看數據字典存放位置
SQL> show parameter utl_file_dir NAME TYPE VALUE------------- -------- -----------------------utl_file_dir string /home/oracle/LOGMNR
(3)創建一張測試用的表
SQL> create table test06 2 ( 3 id number, 4 name varchar(15) 5 ); Table created SQL> insert into test06 values(1,'lijiaman'); 1 row inserted SQL> insert into test06 values(2,'wangyujie'); 1 row inserted
(4)將redo歸檔
SQL> alter system switch logfile; System altered
(5)查看歸檔情況
SQL> archive log listDatabase log mode Archive Mode Automatic archival Enabled Archive destination /home/app/oracle/oradata/orcl/arch_log Oldest online log sequence 50Next log sequence to archive 53Current log sequence 53SQL> archive log list;Database log mode Archive Mode Automatic archival Enabled Archive destination /home/app/oracle/oradata/orcl/arch_log Oldest online log sequence 51Next log sequence to archive 54Current log sequence 54
(6)創建數據字典文件
begindbms_logmnr_d.build(dictionary_filename=>'dictionary.ora', dictionary_location=>'/home/oracle/LOGMNR', options=>dbms_logmnr_d.store_in_flat_file);end;/
(7)添加要分析的歸檔日志文件
(7.1)先到OS上找到歸檔文件:
[oracle@localhost LOGMNR]$ cd /home/app/oracle/oradata/orcl/arch_log [oracle@localhost arch_log]$ ls1_49_936489730.dbf 1_50_936489730.dbf 1_51_936489730.dbf 1_52_936489730.dbf 1_53_936489730.dbf
(7.2)創建歸檔日志文件列表
SQL> begin 2 dbms_logmnr.add_logfile(LogFileName => '/home/app/oracle/oradata/orcl/arch_log/1_53_936489730.dbf',Options => dbms_logmnr.new); 3 end; 4 / PL/SQL procedure successfully completed
(7.3)如果不確定待分析的數據是否在上面添加的歸檔日志文件中,可以多添加幾個
BEGIN dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_51_936489730.dbf',options=>dbms_logmnr.ADDFILE); dbms_logmnr.add_logfile(logfilename=>'/home/app/oracle/oradata/orcl/arch_log/1_52_936489730.dbf',options=>dbms_logmnr.ADDFILE);END;/PL/SQL procedure successfully completed
(8)開始分析
SQL> EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/LOGMNR/dictionary.ora'); PL/SQL procedure successfully completed
(9)查看結果
SQL> select c.timestamp,c.operation,c.table_space,c.sql_redo,c.sql_undo from v$logmnr_contents c where c.seg_owner='LIJIAMAN'; TIMESTAMP OPERATION TABLE_SPACE SQL_REDO SQL_UNDO ----------- ----------- ------------- ---------------------------------------------------------------------- -------------------------------------------------------------------------------- 2017/4/25 2 DDL create table test06 ( id number, name varchar(15) ) ; 2017/4/25 2 INSERT USERS insert into "LIJIAMAN"."TEST06"("ID","NAME") values ('1','lijiaman'); delete from "LIJIAMAN"."TEST06" where "ID" = '1' and "NAME" = 'lijiaman' and ROW 2017/4/25 2 INSERT USERS insert into "LIJIAMAN"."TEST06"("ID","NAME") values ('2','wangyujie'); delete from "LIJIAMAN"."TEST06" where "ID" = '2' and "NAME" = 'wangyujie' and RO
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。