參考文獻(xiàn)
一、 背景介紹
Oracle的跟蹤文件只記錄系統(tǒng)相關(guān)的內(nèi)容,對于數(shù)據(jù)庫上執(zhí)行的具體的刪除、插入、修改等操作,跟蹤文件并無相關(guān)記錄(若這也記錄的話,跟蹤文件就爆炸了),但是,如果真的需要查看特定時刻特定用戶在數(shù)據(jù)庫上執(zhí)行的操作,也不是沒辦法,可以通過用logminer分析日志文件獲取相關(guān)信息。
logminer分析歸檔日志文件所獲得的信息并不是原始的操作信息,而是等價的原子操作信息,譬如用一條delete語句刪除兩百萬條信息,原始操作只需一條命令,但是分析歸檔文件會獲得兩百萬條delete命令信息。
二、 分析步驟
1. 獲取所要分析時間段歸檔日志文件信息
SELECT 'dbms_logmnr.add_logfile(LogFileName=>'''
|| name
|| ''', Options=>dbms_logmnr.addfile);'
FROM v$archived_log
WHERE first_time > To_date('2019-02-27 20:00', 'yyyy-mm-dd hh24:mi')
AND first_time < To_date('2019-02-27 21:00', 'yyyy-mm-dd hh24:mi')
AND dest_id = 1
ORDER BY first_time
輸出信息格式如下:
dbms_logmnr.add_logfile(LogFileName=>'+DATADG/dggtge/archivelog/2019_02_27/thread_2_seq_229652.7316.1001361899', Options=>dbms_logmnr.addfile);
保存好輸出信息,并將輸出信息第一條中的dbms_logmnr.addfile改成dbms_logmnr.new,即:
dbms_logmnr.add_logfile(LogFileName=>'+DATADG/dggtge/archivelog/2019_02_27/thread_2_seq_229652.7316.1001361899', Options=>dbms_logmnr.new);
2. 設(shè)置utl_file_dir參數(shù)
utl_file_dir參數(shù)用于Oracle進(jìn)行IO操作時指定目錄,此參數(shù)為空值、指定目錄不存在以及IO操作目錄與此參數(shù)不一致都會引起IO操作報錯。可用以下語句查看utl_file_dir的值:
show parameter utl_file_dir
用以下命令設(shè)定utl_file_dir的值:
alter system set utl_file_dir='/tmp' scope=spfile;
此參數(shù)為靜態(tài)參數(shù),需要通過修改spfile重啟數(shù)據(jù)庫生效。
3. 創(chuàng)建數(shù)據(jù)字典文件
因為Oracle日志文件中記錄的并非原始對象名稱,而是其內(nèi)部編碼,為了使logminer分析出的sql信息便于查看,我們需要利用數(shù)據(jù)字典文件將其轉(zhuǎn)換成易讀的表名和列名。
begin
dbms_logmnr_d.build(
dictionary_filename=>'logminer_dict.dat',
dictionary_location=>'/tmp');
end;
/
注意dictionary_location值與utl_file_dir一致。
4. 添加需要分析的日志文件
-- 第一個為new,其他為addfile。
-- logfilename為select name from v$archived_log中的某一塊
begin
dbms_logmnr.add_logfile(LogFileName=>'+DATADG/dggtge/archivelog/2019_02_27/thread_2_seq_229652.7316.1001361899', Options=>dbms_logmnr.new);
dbms_logmnr.add_logfile(LogFileName=>'+DATADG/dggtge/archivelog/2019_02_27/thread_2_seq_229653.7632.1001362211', Options=>dbms_logmnr.addfile);
...
dbms_logmnr.add_logfile(LogFileName=>'+DATADG/dggtge/archivelog/2019_02_27/thread_1_seq_226713.7138.1001365283', Options=>dbms_logmnr.addfile);
end;
/
這里的Options有三個參數(shù):
NEW - 創(chuàng)建一個新的日志文件列表
ADDFILE - 向這個列表中添加日志文件
REMOVEFILE - 移除這個列表中日志文件
5. 開始分析日志文件
用生成的數(shù)字字典文件:
begin
dbms_logmnr.start_logmnr(dictfilename=>'/tmp/logminer_dict.dat');
end;
/
或者:
EXECUTE dbms_logmnr.start_logmnr(options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG);
如果用第二種方式,則無需第3步中創(chuàng)建數(shù)據(jù)字典文件。
6. 查看分析結(jié)果
通過分析視圖v$logmnr_contents獲取具體的sql語句信息。