参考文献
一、 背景介绍
Oracle的跟踪文件只记录系统相关的内容,对于数据库上执行的具体的删除、插入、修改等操作,跟踪文件并无相关记录(若这也记录的话,跟踪文件就爆炸了),但是,如果真的需要查看特定时刻特定用户在数据库上执行的操作,也不是没办法,可以通过用logminer分析日志文件获取相关信息。
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. 设置utl_file_dir参数
utl_file_dir参数用于Oracle进行IO操作时指定目录,此参数为空值、指定目录不存在以及IO操作目录与此参数不一致都会引起IO操作报错。可用以下语句查看utl_file_dir的值:
show parameter utl_file_dir
用以下命令设定utl_file_dir的值:
alter system set utl_file_dir='/tmp' scope=spfile;
此参数为静态参数,需要通过修改spfile重启数据库生效。
3. 创建数据字典文件
因为Oracle日志文件中记录的并非原始对象名称,而是其内部编码,为了使logminer分析出的sql信息便于查看,我们需要利用数据字典文件将其转换成易读的表名和列名。
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有三个参数:
NEW - 创建一个新的日志文件列表
ADDFILE - 向这个列表中添加日志文件
REMOVEFILE - 移除这个列表中日志文件
5. 开始分析日志文件
用生成的数字字典文件:
begin
dbms_logmnr.start_logmnr(dictfilename=>'/tmp/logminer_dict.dat');
end;
/
或者:
EXECUTE dbms_logmnr.start_logmnr(options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG);
如果用第二种方式,则无需第3步中创建数据字典文件。
6. 查看分析结果
通过分析视图v$logmnr_contents获取具体的sql语句信息。
网友评论