LogMiner学习笔记

来源:互联网 发布:python培训班 马哥 编辑:程序博客网 时间:2024/06/07 10:49
LogMiner学习笔记
LogMiner的基本介绍
  所有对用户数据和数据字典的改变都记录在Oracle的Redo Log中,因此,
redo log包含了所有进行恢复操作所需要的信息。利用这些数据,DBA可以:
       在应用级别上,发现发生于数据库上的逻辑错误。例如错误地Update了
某个表中的全部记录。
       发现用户的误操作。
       确定如何在事务级别上进行最精细的还原操作。
       通过趋向分析,进行数据库的调优和规划。
       进行岗位审计。
  Oracle公司通过LogMiner提供了访问redo log的SQL,其是Oracle数据库
服务器的一部分。LogMiner通过V$LOGMNR_CONTENTS视图显示redo log中
的信息。这个视图中保存着与对数据库的改变有关的历史信息,包含,但不局限
于,下列信息:
       数据库的改变的类型(Insert、Update、Delete或者是DDL)
       发生变化时的SCN
       变化被提交时的SCN
       该变化属于那个事务
       所修改的对象的表名和方案名
       提交了该DDL或DML语句的用户信息
       重建的SQL语句,其示出了回滚UNDO该变化所需的SQL语句。
Oracle 9i提供的LogMiner的增强特性
  1、支持更多数据/存储类型:链接/迁移行、CLUSTER表操作、DIRECT PATH
插入以及DDL操作。在V$LOGMNR_CONTENTS的SQL_REDO中可以看到
DDL操作的原句(CREATE USER除外,其中的密码将以加密的形式出现,而
不是原始密码)。如果TX_AUDITING初始化参数设为TRUE,则所有操作的数
据库账号将被记录。 
  2、提取和使用数据字典的选项:现在数据字典不仅可以提取到一个外部文
件中,还可以直接提取到重做日志流中,它在日志流中提供了操作当时的数据字
典快照,这样就可以实现离线分析。 
  3、允许对DML操作按事务进行分组:可以在START_LOGMNR()中设置
COMMITTED_DATA_ONLY选项,实现对DML操作的分组,这样将按SCN的
顺序返回已经提交的事务。 
  4、支持SCHEMA的变化:在数据库打开的状态下,如果使用了LogMiner
的DDL_DICT_TRACKING选项,Oracle9i的LogMiner将自动对比最初的日志
流和当前系统的数据字典,并返回正确的DDL语句,并且会自动侦察并标记当
前数据字典和最初日志流之间的差别,这样即使最初日志流中所涉及的表已经被
更改或者根本已经不存在,LogMiner同样会返回正确的DDL语句。 
  5、在日志中记录更多列信息的能力:例如对于UPDATE操作不仅会记录被
更新行的情况,还可以捕捉更多前影信息。 
  6、支持基于数值的查询:Oracle9i LogMiner在支持原有基于元数据(操作、
对象等)查询的基础上,开始支持基于实际涉及到的数据的查询。例如涉及一个
工资表,现在我们可以很容易地查出员工工资由1000变成2000的原始更新语句,
而在之前我们只能选出所有的更新语句。
  Redo log使用内部产生的数字化标识符来标识表和其相关的列,为了重建
SQL语句,LogMiner需要知道内部标识符和用户定义的名称之间的映射关系。
这一映射关系存储在一个数据字典(Dictionary)中。LogMiner提供了一个程序
(DBMS_LOGMNR_D.BUILD)来提取该数据字典。


LogMiner的基本组成
  LogMiner包含两个PL/SQL包和几个视图: 
  1、dbms_logmnr_d包,包括一个用于提取数据字典信息的过程,即
dbms_logmnr_d.build()过程。 还包含一个重建LogMiner表的过程,
dbms_logmnr_d.SET_TABLESPACE,默认情况下,LogMiner的表是建在SYSTEM表
空间下的。
  2、dbms_logmnr包,它有三个过程: 
  add_logfile(name varchar2, options number) - 用来添加/删除用于分析的日志
文件; 
  start_logmnr(start_scn number, end_scn number, start_time number,end_time 
number, dictfilename varchar2, options number) - 用来开启日志分析,同时确定分
析的时间/SCN窗口以及确认是否使用提取出来的数据字典信息。 
  end_logmnr() - 用来终止分析会话,它将回收LogMiner所占用的内存。 
  
  与LogMiner相关的视图: 
  1、v$logmnr_dictionary,LogMiner可能使用的数据字典信息,因logmnr
可以有多个字典文件,该视图用于显示这方面信息。 
  2、v$logmnr_parameters,当前LogMiner所设定的参数信息。 
  3、v$logmnr_logs,当前用于分析的日志列表。 
  4、v$logmnr_contents,日志分析结果。
  
    
  在开始使用LogMiner之前,了解LogMiner怎样利用redo log和字典文件是
非常重要的。这有利于你获得有利的结果并规划对系统资源的利用。现在将讨论
如下几个概念:
       Redo Log
       字典的选择
       跟踪DDL语句
  当使用LogMiner时,必须指定所需要分析的redo log的名称,LogMiner检
索这些redo log文件中的信息并通过V$LOGMNR_CONTENTS视图返回结果。
为了保证redo log中包含着你所需的信息,你必须打开至少最小的追加日志
(Supplemental Logging)。
  可以象查询其他视图那样来查询V$LOGMNR_CONTETNS视图。每一次对
V$LOGMNR_CONTETNS视图的查询都会使redo log文件被依次读取。
  记住以下这些有关redo log的要点:
       所分析的redo log文件必须来自8.0或之后的版本。然而,某些LogMiner
的特性,只针对Oracle 9i或之后的数据库版本。
       从9.2开始支持LOB和LONG数据类型,但是只对来自9.2版本的Oracle
数据库的redo log有效。
       Redo log所使用的字符集必须兼容于运行LogMiner的数据库的字符集。
       通常情况下,分析redo log需要使用一个字典,而该字典需要来自产生
redo log文件的同一个数据库。
       当使用flat file平面文件或存储在redo log中的字典时,所分析的redo log
文件可以来自LogMiner运行的数据库或其他数据库。
       如果需要使用online catalog联机目录作为LogMiner的字典,则只能分
析来自运行LogMiner的数据库的redo log。
       LogMiner所运行的硬件平台必须和产生redo log文件的硬件平台一致,
但OS可以不一样。
       在运行LogMiner时需要指定正确的redo log文件名。
  为了确定那个日志文件正在被LogMiner分析,可以查询V$LOGMNR_LOGS
视图。
  
  
  为了完全地转换redo日志中的内容,LogMiner需要访问一个数据库字典。
  LogMiner使用该字典将Oracle内部的对象标识符和数据类型转换为对象名
称和外部的数据格式。没有字典,LogMiner将使用16进制字符显示内部对象ID。
  例如,对于如下的SQL语句:
INSERT INTO emp(name, salary) VALUES ('John Doe', 50000);
  LogMiner将显示为:
insert into Object#2581(col#1, col#2) 
values (hextoraw('4a6f686e20446f65'),hextoraw('c306'));"
  字典文件必须具有和产生redo日志的数据库相同的字符集。然而,一旦提
取了该字典,就可以利用它在一个单独的数据库示例中挖掘redo日志,而不需
要连接至源数据库。
  提取一个字典文件,也可以避免在当前的数据字典只包含着最新的表的定义
时出现文件。例如,如果你搜索的表在过去某个时间被删除,而当前的数据字典
中没有任何有关它的参考。
  
  LogMiner提供了三种提取字典文件的方式:
       将字典文件提取为一个flat file(平面文件或中间接口文件);
       将字典文件提取为redo日志
       使用online catalog(联机日志)
  
将字典文件提取为一个flat file
  与将字典文件提取为redo日志相比,将字典文件提取为flat file将使用更少
的系统资源。建议你经常地备份所提取的字典,以便确保对较旧的redo日志的
正确分析。
  为了将数据库字典信息提取为flat file,需要使用带有
STORE_IN_FLAT_FILE参数的DBMS_LOGMNR_D.BUILD程序。
  DBMS_LOGMNR_D.BUILD程序需要访问一个能够放置字典文件的目录。
因为PL/SQL程序通常不能直接访问用户目录,必须手动指定一个由
DBMS_LOGMNR_D.BUILD程序使用的目录。为了指定该目录,必须修改初始
化文件中的UTL_FILE_DIR参数:
ALTER SYSTEM SET UTL_FILE_DIR =’ /oracle/database’ SCOPE=SPFILE
  然后重新引导启动数据库。
  
  确保在创建flat file文件的过程中,没有DDL操作发生。
  在创建flat file文件时,数据库必须处于open状态,然后执行
DMBS_LOGMNR_D.BUILD程序:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD(’dictionary.ora’, -
2 ’/oracle/database/’, -
3 OPTIONS => DBMS_LOGMNR_D.STORE_IN_FLAT_FILE);
  上述的语句将创建一个位于/oracle/database/目录中的字典文件
dictionary.ORA。该语句也可以简化为:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD(’dictionary.ora’, -
2 ’/oracle/database/’);
  
将字典文件提取为redo日志
  为了将字典文件提取为redo日志,数据库必须处于open状态,并且处于归
档模式,必须打开归档。当将字典提取为redo日志时,不能有DDL语句被执行。
因此,被提取为redo日志的字典快照被认为是一致的,而提取为flat file的则不
是。
  为了将字典提取为redo日志,需要使用带有STORE_IN_REDO_FILES参数
的DBMS_LOGMNR_D.BUILD程序:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD ( -
2 OPTIONS=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
  将字典提取为redo日志的操作占用大量的系统资源,所以最好将这一操作
限制在系统压力较小的时段进行。依赖于字典信息的大小,有可能产生多个redo
日志,在这些redo日志被归档之后,可以通过查询V$ARCHIVED_LOG视图来
查询:
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN=’YES’;
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END=’YES’;
  如果是将字典信息提取为redo文件的,那么在使用
DBMD_LOGMNR.ADDLOGFILE指定所需要分析的日志文件时,需要将这些包
含字典信息的redo文件也添加进去。
  同时在使用START_LOGMNR开始分析时,需要指定
DICT_FROM_REDO_LOGS的参数。
使用联机目录
  为了使LogMiner直接使用数据库当前使用的字典,在开始LogMiner时可
以指定将联机目录作为字典源:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
2 DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
  使用联机目录,意味着不需要再提取字典文件,是开始分析日志的最快的方
式。除了可以分析联机redo日志外,还可以在和产生归档日志文件相同的系统
上分析归档日志文件。
  然而,记住联机目录只能重建应用于表的最新版本上的SQL语句。一旦表
被修改,联机目录就无法反映出表之前的版本。这就意味着LogMiner不能重建
执行于表的旧版本上的SQL语句。相反,LogMiner产生类似于如下语句的不可
执行的SQL语句:
insert into Object#2581(col#1, col#2) 
values (hextoraw('4a6f686e20446f65'),hextoraw('c306'));"




跟踪DDL语句
  当你启动LogMiner时,其会自动创建其自己的内部字典。如果源字典是flat 
file字典或redo日志中的字典,则可以使用DDL_DICT_TRACKING参数来跟踪
DDL语句。DDL跟踪默认是关闭的。为了打开这一功能,可以在启动LogMiner
时使用DDL_DICT_TRACKING参数:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
2 DBMS_LOGMNR.DDL_DICT_TRACKING);
  当使用这一参数时,LogMiner将所有在redo日志中发现的DDL语句存储
在其的内部字典中:
SQL> SELECT USERNAME, SQL_REDO
2 FROM V$LOGMNR_CONTENTS
3 WHERE USERNAME = ’SYS’ AND OEPRATION = ’DDL’;
  当使用DDL_DICT_TRACKING时,记住如下的要点:
       当使用联机目录(Online catalog)时,也就是当使用
DICT_FROM_ONLINE_CATALOG参数时,是不能使用
DDL_DICT_TRACKING选项的。
       使用DDL_DICT_TRACKING时,要求数据库处于open状态。
  
  应该为LogMiner的表提供一个单独的表空间。默认情况下LogMiner的表
是创建在SYSTEM表空间中的。使用DBMS_LOGMNR_D.SET_TABLESPACE
可以在一个单独的表空间中重建这些LogMiner的表:
SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE(’logmnrts$’);
  
  
过滤LogMiner返回的数据
只显示已提交的事务:
  可以使用COMMITTED_DATA_ONLY参数来只显示那些被提交的事务:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
2 DBMS_LOGMNR.COMMITTED_DATA_ONLY);
  当使用这一参数时,LogMiner将所有的DML操作按照事务的关系组合在一
起。这些事务按照它们被提交的顺序显示出来。
忽略Redo错误
  可以使用SKIP_CORRUPTION参数来忽略redo日志中的所有错误:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
2 DBMS_LOGMNR.SKIP_CORRUPTION);
按时间过滤数据:
  为了按照时间过滤数据,使用STARTTIME和ENDTIME参数:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( -
2 DICTFILENAME => '/oracle/dictionary.ora', -
3 STARTTIME => TO_DATE('01-Jan-1998 08:30:00', 'DD-MON-YYYY HH:MI:SS'),-
4 ENDTIME => TO_DATE('01-Jan-1998 08:45:00', 'DD-MON-YYYY HH:MI:SS'));
按照SCN过滤:
  为了按照SCN(System Change Number)来过滤数据,使用STARTSCN和
ENDSCN参数:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( -
2 DICTFILENAME => '/oracle/dictionary.ora', -
3 STARTSCN => 100, -
4 ENDSCN => 150);


典型的LogMiner步骤:
  一个典型的LogMiner的操作包含如下步骤:
1.        进行初始化设置;
2.        提取一个字典
3.        指定需要分析的redo日志文件
4.        开始LogMiner
5.        查询V$LOGMNR_CONTENTS视图
6.        结束LogMiner
1、进行初始化设置
  打开你希望使用的那一种supplemental logging,Oracle公司建议打开最小的
supplemental logging:
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA
  使用DBMS_LOGMNR_D.SET_TABLESPACE重新创建所有的LogMiner
表:
SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE(’logmnrts$’);
2、提取字典
  如前所属,分别将字典文件提取为flat file或redo日志,或者直接使用Online 
catalog:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD(’dictionary.ora’, -
2 ’/oracle/database/’);
  或:
SQL> EXECUTE DBMS_LOGMNR_D.BUILD ( -
2 OPTIONS=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
3、指定需要分析的redo日志:
  在启动LogMiner之前,必须首先使用DBMS_LOGMNR.ADD_LOGFILE来
指定需要分析的redo文件。如下的示范步骤,用来添加或删除需要分析的Redo
日志文件:
1、        确保数据库处于打开状态
2、        创建redo日志的列表。在DBMS_LOGMNR.ADD_LOGFILE中指定NEW
参数来表明这是一个新的列表:
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
2 LOGFILENAME => '/oracle/logs/log1.f', -
3 OPTIONS => DBMS_LOGMNR.NEW);
3、        如果需要的话,在DBMS_LOGMNR.ADD_LOGFILE中指定ADDFILE
参数,以便追加redo日志:
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
2 LOGFILENAME => '/oracle/logs/log2.f', -
3 OPTIONS => DBMS_LOGMNR.ADDFILE);
        上面示例中的OPTIONS是可选的,也可以直接添加:
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
2 LOGFILENAME=>’/oracle/logs/log2.f’);
4、        如果需要的话,可以从列表中删除redo日志:
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
2 LOGFILENAME => '/oracle/logs/log2.f', -
3 OPTIONS => DBMS_LOGMNR.REMOVEFILE);
5、        当进行LogMiner的实例就是产生Redo日志的实例时,可以使用连续分
析日志。首先需要指定一个redo日志文件,然后在开始LogMiner时,
指定DBMS_LOGMNR.CONTINUOUS_MINE参数。(该参数在RAC环
境中不能使用)
  在添加分析的redo日志文件时,不仅可以添加归档后的redo日志文件,也
可以添加联机redo日志文件。
4、启动LogMiner
1、        执行DBMS_LOGMNR.START_LOGMNR来启动LogMiner。
     建议在启动时指定Dictionary参数,如果不指定,那么LogMiner无法
完成内部标识符和目标名称和外部数据类型之间的转换。
     如果使用flat file,则需要指定该文件的完整路径名称:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( -
2 DICTFILENAME =>'/oracle/database/dictionary.ora');
     如果没有指定字典,则需要指定DICT_FROM_REDO_LOGS或 
DICT_FROM_ONLINE_CATALOG参数。
     如果指定了DICT_FROM_REDO_LOGS,LogMiner会期待在你使用
DBMS_LOGMNR.ADD_LOGFILE指定的redo日志中发现字典。
2、        如果需要的话,可以按时间或SCN过滤信息
3、        也可以使用Options参数来指定LogMiner的其他特性:
4、查询V$LOGMNR_CONTETNS视图
5、结束LogMiner
  可以使用DBMS_LOGMNR.END_LOGMNR来结束一个LogMiner:
SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR;




使用LogMiner的示例:
  在开始下面的示例之前,已经设置了UTL_FILE_DIR并且在一个新建的表
空间内重建了LogMiner的表。
一、使用Logminer来分析当前的联机redo日志文件
SQL> execute dbms_logmnr_d.build('dictionary.dic',-
> 'd:\oracle\oradata\oradell\logmnr\',-
> options=>dbms_logmnr_d.store_in_flat_file);
PL/SQL 过程已成功完成。
//创建字典文件


SQL> select member from v$logfile
  2  where group#=(select group# from v$log
  3  where status ='CURRENT')
  4  ;
MEMBER
--------------------------------------------------------------------------------
D:\ORACLE\ORADATA\ORADELL\REDO03.LOG                                          
//查询当前的联机redo日志文件的位置


SQL> execute dbms_logmnr.add_logfile( -
> logfilename =>'d:\oracle\oradata\oradell\redo03.log',-
> options =>dbms_logmnr.new);
PL/SQL 过程已成功完成。
//将该文件加入日志分析的列表中


SQL> execute dbms_logmnr.start_logmnr(-
> dictfilename=>'d:\oracle\oradata\oradell\logmnr\dictionary.dic',-
> options =>dbms_logmnr.committed_data_only);
PL/SQL 过程已成功完成。
//开始Logminer,只显示已提交的事务


SQL> select count(*) from v$logmnr_contents;
  COUNT(*)                                                                      
----------                                                                      
    100277
//对分析结果进行查询


二、分析已归档的redo日志文件,将字典文件提取为redo日志文件
SQL> execute dbms_logmnr_d.build(-
> options=>dbms_logmnr_d.store_in_redo_logs);
PL/SQL 过程已成功完成。
//将字典信息提取为redo日志
SQL>  SELECT NAME FROM V$ARCHIVED_LOG WHERE 
DICTIONARY_BEGIN='YES';


NAME
--------------------------------------------------------------------------------
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00030.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00035.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00039.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00042.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00045.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00048.001


已选择6行。


SQL>  SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END='YES';


NAME
--------------------------------------------------------------------------------
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00030.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00035.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00039.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00042.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00045.001
D:\ORACLE\ORADATA\ORADELL\ARCHIVE\ARC00048.001


已选择6行。
//查询前一步中生产的包含字典信息的redo文件


SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00048.001',-
> options=>dbms_logmnr.new);
PL/SQL 过程已成功完成。
//首先,将包含字典信息的redo日志加入等待分析的日志文件列表中


SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00020.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 过程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00021.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 过程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00022.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 过程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00023.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 过程已成功完成。
//之后依次添加需要分析的redo日志文件


SQL> execute dbms_logmnr.start_logmnr(-
> options=>dbms_logmnr.dict_from_redo_logs);
PL/SQL 过程已成功完成。
//启动LogMiner


SQL> select filename from v$logmnr_logs;
FILENAME                                                                        
--------------------------------------------------------------------------------
d:\oracle\oradata\oradell\archive\arc00020.001                                  
d:\oracle\oradata\oradell\archive\arc00021.001                                  
d:\oracle\oradata\oradell\archive\arc00022.001                                  
d:\oracle\oradata\oradell\archive\arc00023.001                                  
Missing log file(s) for thread number 1, sequence number(s) 24 to 47            
d:\oracle\oradata\oradell\archive\arc00048.001                                  
已选择6行。
//将被分析的redo日志列表


SQL> select sql_redo from v$logmnr_contents
  2  where username='SYS';
SQL_REDO                                                                        
--------------------------------------------------------------------------------
set transaction read write;                                                     
Unsupported                                                                     
commit;                                                                         
commit;                                                                         
set transaction read write;                                                     
已选择16921行。
//查询分析结果


SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00020.001',-
> options=>dbms_logmnr.removefile);
PL/SQL 过程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00021.001',-
> options=>dbms_logmnr.removefile);
PL/SQL 过程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00022.001',-
> options=>dbms_logmnr.removefile);
PL/SQL 过程已成功完成。
SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00023.001',-
> options=>dbms_logmnr.removefile);
PL/SQL 过程已成功完成。
//删除已被分析的redo日志,但保留包含字典信息的redo日志文件


SQL> select filename from v$logmnr_logs;
FILENAME                                                                        
--------------------------------------------------------------------------------
d:\oracle\oradata\oradell\archive\arc00048.001                                  
//此时的redo日志列表


SQL> execute dbms_logmnr.add_logfile(-
> logfilename=>'d:\oracle\oradata\oradell\archive\arc00040.001',-
> options=>dbms_logmnr.addfile);
PL/SQL 过程已成功完成。
//增加新的等待分析的redo日志
SQL> select filename from v$logmnr_logs;
FILENAME                                                                        
--------------------------------------------------------------------------------
d:\oracle\oradata\oradell\archive\arc00040.001                                  
d:\oracle\oradata\oradell\archive\arc00048.001                                  
//此时的redo日志列表


SQL> execute dbms_logmnr.start_logmnr(-
> options=>dbms_logmnr.dict_from_redo_logs);
PL/SQL 过程已成功完成。
SQL> select count(*) from v$logmnr_contents where username ='ALEX';
  COUNT(*)                                                                      
----------                                                                      
         0   
//重新启动LogMiner分析,并查询结果