要安装LogMiner工具,必须首先要运行下面这样两个脚本,
@F:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\dbmslm.sql
@F:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\dbmslmd.sql.
这两个脚本必须均以SYS用户身份运行。
2 创建数据字典文件
首先在init.ora初始化参数文件中,添加参数UTL_FILE_DIR,该参数值为服务器中放置数据
字典文件的目录。如:
utl_file_dir=F:\hisrun
[SYS@orcl] SQL>execute dbms_logmnr_d.build('showdict.ora','F:\hisrun');
BEGIN dbms_logmnr_d.build('showdict.ora','F:\hisrun'); END;
*
第 1 行出现错误:
ORA-01308: 未设置初始化参数 utl_file_dir
ORA-06512: 在 "SYS.DBMS_LOGMNR_INTERNAL", line 3474
ORA-06512: 在 "SYS.DBMS_LOGMNR_INTERNAL", line 3552
ORA-06512: 在 "SYS.DBMS_LOGMNR_D", line 12
ORA-06512: 在 line 1
[SYS@orcl] SQL>show parameter utl_file;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
utl_file_dir string
[SYS@orcl] SQL>show parameter utl;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
create_stored_outlines string
utl_file_dir string
[SYS@orcl] SQL>show user;
USER 为 "SYS"
[SYS@orcl] SQL>alter system set utl_file_dir='F:\hisrun' scope=spfile;
系统已更改。
[SYS@orcl] SQL>show parameter utl
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
create_stored_outlines string
utl_file_dir string
[SYS@orcl] SQL>shutdown abort
ORACLE 例程已经关闭。
[SYS@orcl] SQL>startup
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 218106756 bytes
Database Buffers 385875968 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
数据库已经打开。
[SYS@orcl] SQL>show parameter utl;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
create_stored_outlines string
utl_file_dir string
F:\hisrun
[SYS@orcl] SQL>execute dbms_logmnr_d.build('showdict.ora','F:\hisrun');
20100122补充:SQL> execute dbms_logmnr_d.build(dictionary_filename=>'showdict.ora',dictionary_l
ocation=>'F:\hisrun');
PL/SQL 过程已成功完成。
3 将要分析的日志文件加入要分析的log list中,察看有哪些日志文件可以用select * from v$logfile;查询已经加入那些可以用select * from v$logmnr_logs(注:查询必须在同一个会话中查询,单独开查询将查不到)语句如下:
execute dbms_logmnr.add_logfile('F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG
',dbms_logmnr.new);
[SYS@orcl] SQL>select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG
[SYS@orcl] SQL>execute dbms_logmnr.add_logfile('F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG',dbms_logmnr.new);
PL/SQL 过程已成功完成。
再增加一个:
[SYS@orcl] SQL>execute dbms_logmnr.add_logfile('F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG',dbms_logmnr.addfile);
如果需要从分析列表里去掉一个文件用
('F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG',dbms_logmnr.removefile);
20100122补充:
(1)分析在线重作日志文件
如上所示
(2)分析离线日志文件
SQL> EXECUTE dbms_logmnr.add_logfile(
LogFileName=>' E:\Oracle\oradata\sxf\archive\ARCARC09108.001',
Options=>dbms_logmnr.new);
4 更改会话时间表达方式(注一定要在本会话下修改,我开始发生错误就是因为在别的会话里修改的,如果允许,可以将数据库默认的时间表达方式修改掉)会话内修改为alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 系统设置在注册表。
5 查询分析的日志文件包含的scn范围和日期范围。
select low_time,high_time,low_scn,next_scn from v$logmnr_logs;会列出你加入的日志文件的以上信息。
6 使用LogMiner进行日志分析
SQL>execute dbms_logmnr.start_logmnr(DictFileName=>'F:\hisrun\showdict.ora',options=>dbms_logmnr.committed_data_only,startscn=>116295629,endscn=>116685026);
20100122补充:
(1)无限制条件
SQL> EXECUTE dbms_logmnr.start_logmnr(
DictFileName=>' e:\oracle\logs\ v816dict.ora ');
(2)有限制条件
通过对过程DBMS_ LOGMNR.START_LOGMNR中几个不同参数的设置(参数含义见表1),可以缩小要分析日志文件的范围。通过设置起始时间和终止时间参数我们可以限制只分析某一时间范围的日志。如下面的例子,我们仅仅分析2001年9月18日的日志,:
SQL> EXECUTE dbms_logmnr.start_logmnr(
DictFileName => ' e:\oracle\logs\ v816dict.ora ',
StartTime => to_date('2001-9-18 00:00:00','YYYY-MM-DD HH24:MI:SS')
EndTime => to_date(''2001-9-18 23:59:59','YYYY-MM-DD HH24:MI:SS '));
也可以通过设置起始SCN和截至SCN来限制要分析日志的范围:
SQL> EXECUTE dbms_logmnr.start_logmnr(
DictFileName => ' e:\oracle\logs\ v816dict.ora ',
StartScn => 20,
EndScn => 50);
7 观察分析结果(LogMiner的分析结果是放在v$logmnr_contents中)
A.SQL> select sql_redo from v$logmnr_contents where upper(sql_redo) like '%DELETE%;
在视图v$logmnr_contents中查找真实被删除的记录。
B.SQL> SELECT timeseg_name,sql_redo FROM v$logmnr_contents WHERE seg_name='MS_CF01' and sql_redo like '%DELETE%';
功能同A。
C.SQL> select sql_undo from v$logmnr_contents where seg_name='MS_CF01' and sql_redo like '%delete%' and rownum<10;
D.SQL> select sql_undo from v$logmnr_contents where seg_name='MS_CF01' and upper(OPERATION)='DELETE';
针对SQL_REDO重做记录重做指定行变化的SQL语句,所对应的反操作就是重做记录回退或恢复指定行变化的SQL语句。
select timestamp,sql_undo,sql_redo from v$logmnr_contents where seg_name='MS_CF01'
20100122补充:
需要强调一点的是,视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr'这个会话的生命期中存在。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。
8 结束分析,清空v$logmnr_contents
SQL>execute dbms_logmnr.end_logmnr (结束会话,会自清除分析记录)
9 下面将就视图v$logmnr_contents的常用字段含义进行说明:
其中operation指的是操作,sql_redo指的是实际的操作,sql_undo指的是用于取消的相反的操作)
名称 含义
----------------------- -------- --------------------------------------------
SCN 特定数据变化的系统更改号
TIMESTAMP 数据改变发生的时间
COMMIT_TIMESTAMP 数据改变提交的时间
SEG_OWNER 数据发生改变的段名称
SEG_NAME 段的所有者名称
SEG_TYPE 数据发生改变的段类型
SEG_TYPE_NAME 数据发生改变的段类型名称
TABLE_SPACE 变化段的表空间
ROW_ID 特定数据变化行的ID
SESSION_INFO 数据发生变化时用户进程信息
OPERATION 重做记录中记录的操作(如INSERT)
SQL_REDO 可以为重做记录重做指定行变化的SQL语句(正向操作)
SQL_UNDO 可以为重做记录回退或恢复指定行变化的SQL语句(反向操作)
注:SQL_REDO 列显示的是所做的操作(SQL 语句),SQL_UNDO 列显示的是要恢复该操作所需要的SQL语句
只要顺序执行SQL_UNDO的内容,就可以恢复到修改前的数据。