【Oracle篇】日志挖掘 LogMiner 技术详解:模拟DELETE/TRUNCATE/DROP操作及可恢复性验证

💫《博主主页》:
   🔎 CSDN主页: 奈斯DB
   🔎 IF Club社区主页: 奈斯、
   🔎 微信公众号: 奈斯DB
🔥《擅长领域》:
   🗃️ 数据库:阿里云AnalyticDB (云原生分布式数据仓库)、Oracle、MySQL、SQLserver、NoSQL(Redis)
   🛠️ 运维平台与工具:Prometheus监控、DataX离线异构同步工具
💖如果觉得文章对你有所帮助,欢迎点赞收藏加关注💖

在这里插入图片描述

    Oracle LogMiner 是Oracle公司自数据库产品 8i 版本起提供的一款极具实用价值的分析工具。借助该工具,数据库管理员可以深入解析Oracle在线与归档日志文件的具体内容,尤其能够精准捕获所有针对数据库执行的DML与DDL操作语句。🔍 它成为数据库调试、操作审计乃至特定事务回退等关键任务的强大支撑。🚀

    在Oracle 8i之前,解读重做日志的常规做法只能是将所有日志文件打包并提交至Oracle官方技术支持,被动等待分析结果💾。自 8i 版本起,Oracle正式将 LogMiner 这一强力工具交付给用户,彻底改变了这一局面。

    众所周知,重做日志文件承载了数据库恢复所需的所有数据变更记录,完整记载了包括DML、DDL及数据结构性操作在内的每一次更改,精确到具体的数据块和数据行发生了什么操作、值如何变化,通过 LogMiner 工具,既能分析在线重做日志文件,也能处理离线归档日志文件;既适用于分析本数据库的日志,也可用于分析其他数据库的日志📈。从技术实现上看,LogMiner分析工具实质上由一组PL/SQL内置程序包和若干动态视图构成(作为Oracle 8i内置组件的一部分)。🎯 它是Oracle数据库产品中完全免费的标准功能。

    值得注意的是,自 Oracle Database 12c 版本起,官方进一步推出了图形用户界面 Oracle LogMiner Viewer,作为Oracle Enterprise Manager的一部分,为LogMiner的功能提供了更直观便捷的管理和操作体验🖥️。

    那么这篇文章就唠一唠日志挖掘 LogMiner 技术,并模拟DELETE/TRUNCATE/DROP操作,对操作所在的重做日志文件进行解析,验证一下那些可以恢复,那些不行。先上模拟结果结论:

结论:drop、truncate在日志中只记录执行的sql语句,而不像delete记录每行数据的详细情况,所以delete删除全表可以通过logminer日志挖掘恢复,而drop、truncate只能通过其他手段。

分类dropTruncateDelete
是否删除表结构删除表结构及其表上的约束,且依赖于该表的存储过程和函数等将变为INVALID 状态只删除数据。不删除表的定义、约束、触发器和索引
SQL 命令类型DDL 语句,隐式提交,不能对TRUNCATE 和DROP 使用ROLLBACK 命令(不可回滚)DML 语句,事务提交(COMMIT)之后才生效,可以使用ROLLBACK 语句撤销未提交的事务(可回滚)
删除的数据是否放入回滚(ROLLBACK SEGMENT)
高水位是否下降
日志的产生少量(ddl语句操作的信息,数据不产生undo日志)少量(ddl语句操作的信息,数据不产生undo日志)大量undo日志
是否可以对视图进行操作
级联删除不能drop一个带有enable外键的表不能truncate一个带有enable外键的表,会报错ora-02266可以delete一个带有enable外键的表
执行速度DROP>TRUNCATE>DELETE

DROP和TRUNCATE是在底层修改了数据字典,所以无论是大表还是小表执行都非常快

而DELETE 是需要读取数据到Undo,所以对于大表进行DELETE全表操作将会非常慢
安全性DROP 和TRUNCATE 在无备份的情况下需谨慎
使用方面想删除部分数据行只能用DELETE 且带上WHERE 子句;想删除表数据及其结构则使用DROP;想保留表结构而将所有数据删除则使用TRUNCATE
恢复方法闪回数据库
闪回drop(回收站)
RMAN备份
DUL工具等
闪回数据库
RMAN备份
DUL工具等
闪回数据库
闪回查询
闪回表
LogMiner日志挖掘
RMAN备份
DUL工具等

   

特别说明💥:本篇文章部分理论性知识点均来源于版权归 Oracle 所有的官方公开文档手册,并结合了我个人的解读和案例演示。若需要调整,请联系,会尽快处理😄
   
官方文档对于 logminer 的介绍(Oracle 12c):
22 Using LogMiner to Analyze Redo Log Files
在这里插入图片描述



   

一、LogMiner的配置要求:

源和挖掘数据库:

  1. 源数据库和挖掘数据库必须运行在同一硬件平台上。
  2. 挖掘数据库可以与源数据库相同,也可以完全独立于源数据库。
  3. 挖掘数据库必须运行与源数据库相同版本或更高版本的Oracle数据库软件。
  4. 挖掘数据库必须使用与源数据库相同的字符集(或字符集的超集)。
       

LogMiner词典:

  1. 该字典必须由生成LogMiner将分析的重做日志文件的同一源数据库生成。
       

所有重做日志文件:

  1. 必须由相同的源数据库生成。
  2. 必须与同一数据库相关联RESETLOGS SCN.
  3. Oracle数据库必须是8.0或更高版本。然而,在9.0.1版本中引入的一些LogMiner特性只适用于在Oracle9i或更高版本数据库上生成的重做日志文件。请参阅“支持的数据库和重做日志文件版本”。

注意:在生成将由LogMiner分析的日志文件之前,必须启用补充日志记录。默认情况下,Oracle数据库不提供任何补充日志记录,这意味着默认情况下LogMiner不可用。因此在生成将由LogMiner分析的日志文件之前,必须至少启用最低限度的补充日志记录。也就是说如果误操作数据之前没有启用补充日志那么就不能使用logminer工具恢复误操作的数据。

   

二、logminer用途:

  1. 跟踪数据库的变化:可以离线的跟踪数据库的变化,而不会影响在线系统的性能。
  2. 回退数据库的变化:回退特定的变化数据,减少point-in-time recovery的执行。
  3. 优化和扩容计划:可通过分析日志文件中的数据以分析数据增长模式。

   

三、LogMiner不支持挖掘的数据类型和表存储属性(除以下类型外,基本上都是支持的):

  1. BFILE
  2. 嵌套表格
  3. 带有嵌套表格的对象
  4. 带有标识列的表
  5. 时间有效性列
  6. PKREF列
  7. PKOID列
  8. 嵌套表属性和独立嵌套表列

   

四、安装logminer:11g需要安装,12c之后默认安装了logminer

    在使用LogMiner之前需要确认Oracle是否带有进行LogMiner分析包,一般来说Windows操作系统10g以上都默认包含。如果不能确认,可以DBA身份登录系统,查看系统中是否存在运行LogMiner 所需要的dbms_logmnr、dbms_logmnr_d包,如果没有需要安装LogMiner工具,必须首先要运行下面二个脚本 (LogMiner分析工具实际上是由一组PL/SQL包和一些动态视图组成,11g需要安装,12c之后默认安装了logminer)

SQL> @$ORACLE_HOME/rdbms/admin/dbmslm.sql    ---创建DBMS_LOGMNR包,用于分析重做日志文件。
SQL> @$ORACLE_HOME/rdbms/admin/dbmslmd.sql   ---创建DBMS_LOGMNR_D包,用于创建数据字典文件。

   

执行完成sql脚本将生成以下过程和视图:

类型过程名用途
过程dbms_logmnr_d.build创建一个数据字典文件。
过程dbms_logmnr.add_logfile在类表中增加日志文件以供分析。
过程dbms_logmnr.start_logmnr使用一个可选的字典文件和前面确定要分析日志文件来启动LogMiner。
过程dbms_logmnr.end_logmnr停止LogMiner分析。
视图v$logmnr_dictionary显示有关LogMiner字典文件的信息,该文件是使用STORE_IN_FLAT_FILE选项创建到DBMS_LOGMNR.START_LOGMNR的。显示的信息包括关于创建LogMiner字典的数据库的信息。
视图v$logmnr_parameters显示有关可选LogMiner参数的信息,包括开始和结束系统更改编号(scn),以及开始和结束logminer的时间。
视图v$logmnr_logs在LogMiner启动时显示分析的日志列表。
视图v$logmnr_contentsLogMiner启动后,可以使用该视图在SQL提示符下输入SQL语句来查询重做日志的内容。

   

五、相关视图:

  1. v$logmnr_dictionary: 显示有关LogMiner字典文件的信息,该文件是使用STORE_IN_FLAT_FILE选项创建到DBMS_LOGMNR.START_LOGMNR的。显示的信息包括关于创建LogMiner字典的数据库的信息。

  2. v$logmnr_parameters: 显示有关可选LogMiner参数的信息,包括开始和结束系统更改编号(scn),以及开始和结束logminer的时间。只有启动分析dbms_logmnr.add_logfile添加日志的时间范围和scn范围时才能看到相关开始的时间scn。相关结束的时间scn记录到这个表中,启动分析dbms_logmnr.add_logfile添加的所有日志是不会记录到这个表。

    • START_DATE:开始搜索的日期
    • REQUIRED_START_DATE:如果启用了DDL跟踪,则需要开始搜索的日期
    • END_DATE:结束搜索的日期
    • START_SCN:开始搜索的系统更改号
    • REQUIRED_START_SCN:如果启用了DDL跟踪,则开始搜索所需的系统更改号
    • END_SCN:系统更改编号以结束搜索
  3. v$logmnr_logs: 在LogMiner启动时显示分析的日志列表。

    • FILENAME:重做日志文件的名称
    • LOW_TIME:重做日志文件中任何记录的最早日期
    • HIGH_TIME:重做日志文件中任何记录的最近日期
    • LOW_SCN:重做日志切换到时分配的SCN
    • NEXT_SCN:重做日志后的SCN。下一个日志的低SCN。
  4. v$logmnr_contents: LogMiner启动后,可以使用该视图在SQL提示符下输入SQL语句来查询重做日志的内容。

    • SCN:特定数据变化的系统更改号
    • TIMESTAM:数据改变发生的时间
    • COMMIT_TIMESTAMP:数据改变提交的时间
    • SEG_OWNER:数据发生改变的段名称
    • SEG_NAME:段的所有者名称
    • SEG_TYPE:数据发生改变的段类型
    • SEG_TYPE_NAME:数据发生改变的段类型名称
    • TABLE_SPACE:变化段的表空间
    • ROW_ID:特定数据变化行的 ID
    • SESSION_INFO:数据发生变化时用户进程信息
    • OPERATION :重做记录中记录的操作(如 INSERT)
    • SQL_REDO:可以为重做记录重做指定行变化的SQL语句(正向操作)。既实际执行的sql。
    • SQL_UNDO:可以为重做记录回退或恢复指定行变化的 SQL语句(反向操作)。sql反转,如果是insert,就对应delete;如果是delete,对应insert;如果是update,就将set和where调换。

注意:视图v$logmnr_contents里分析的结果仅在运行dbms_logmrn.start_logmnr过程中的这个会话的生命期中存在。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。最后使用DBMS_LOGMNR.END_LOGMNR过程终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。

   

六、补充日志的作用(Supplemental Logging):模拟启用和未启用补充日志

    重做日志文件通常用于实例恢复和介质恢复。这些操作所需的数据会自动记录在重做日志文件中。但是基于重做的应用程序可能需要在重做日志文件中记录额外的列。记录这些附加列的过程称为补充日志记录。
    默认情况下,Oracle数据库不提供任何补充日志记录,这意味着默认情况下LogMiner不可用。因此在生成将由LogMiner分析的日志文件之前,必须至少启用最低限度的补充日志记录。也就是说如果误操作数据之前没有启用补充日志那么就不能使用logminer工具恢复误操作的数据。
    正常情况下,redo log只记录的进行恢复所必需的信息,但是这些信息对于我们使用redo log进行一些其他应用时是不够的。例如在redo log中使用rowid唯一标识一行而不是通过 Primary key,如果我们在另外的数据库分析这些日志并想重新执行某些dml时就可能会有问题,因为不同的数据库其rowid代表的内容是不同的。在这时候就需要一些额外的信息(columns)加入redo log,这就是supplemental logging。
    supplemental logging分为两个级别database_level and table_level,默认不开启,建议开启数据库级别。默认情况下,Oracle数据库没有提供任何补充日志,从而导致默认情况下logMiner无法支持以下特征:

  1. 索引簇、链行和迁移行;
  2. 直接路径插入;
  3. 摘取LogMiner字典到重做日志;
  4. 跟踪DDL;
  5. 生成键列的SQL_REDO和SQL_UNDO信息;
  6. LONG和LOB数据类型。
       

    因此为了充分利用LogMiner提供的特征,必须激活补充日志。激活不用重启数据库,数据库联机即可。打开补充日志(打开最小附加日志模式,日志的记录按照最小颗粒记录)

SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SQL> alter database add supplemental log data;   ---打开附加日志模式。删除 supplemental log的语句alter database drop supplemental log data;
SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;

在这里插入图片描述

   
   

补充日志的重要性:
1)没有启用补充日志通过logminer分析的结果:

create table liu_oracleoltp_test01 ( 
id number(10) primary key, 
name varchar(16) not null, 
sex varchar(16) not null, 
age number(10) not null 
); 
insert into liu_oracleoltp_test01(id,name,sex,age) values (1,'test1','w',21);
insert into liu_oracleoltp_test01(id,name,sex,age) values (2,'test2','m',22);
insert into liu_oracleoltp_test01(id,name,sex,age) values (3,'test3','w',23);
insert into liu_oracleoltp_test01(id,name,sex,age) values (4,'test4','m',24);
insert into liu_oracleoltp_test01(id,name,sex,age) values (5,'test5','w',25); 
commit;
delete from liu_oracleoltp_test01 where id=2;
update liu_oracleoltp_test01 set name='test04' where id=4;
commit;

建立日志分析列表、启动分析过程参考案例
查看日志分析结果(logminer分析的日志会输出到v$logmnr_contents视图里)

select FILENAME from v$logmnr_logs;    ---在LogMiner启动时显示分析的日志列表。
select username,scn,timestamp,sql_redo,sql_undo from v$logmnr_contents WHERE table_name in ('LIU_ORACLEOLTP_TEST01'); 

只有create table的相关操作
在这里插入图片描述

   
   

2)启用补充日志通过logminer分析的结果:

create table liu_oracleoltp_test02 ( 
id number(10) primary key, 
name varchar(16) not null, 
sex varchar(16) not null, 
age number(10) not null 
); 
insert into liu_oracleoltp_test02(id,name,sex,age) values (1,'test1','w',21);
insert into liu_oracleoltp_test02(id,name,sex,age) values (2,'test2','m',22);
insert into liu_oracleoltp_test02(id,name,sex,age) values (3,'test3','w',23);
insert into liu_oracleoltp_test02(id,name,sex,age) values (4,'test4','m',24);
insert into liu_oracleoltp_test02(id,name,sex,age) values (5,'test5','w',25); 
commit;
delete from liu_oracleoltp_test02 where id=2;
update liu_oracleoltp_test02 set name='test04' where id=4;
commit;

建立日志分析列表、启动分析过程参考案例
查看日志分析结果(logminer分析的日志会输出到v$logmnr_contents视图里)

select FILENAME from v$logmnr_logs;    ---在LogMiner启动时显示分析的日志列表。
select username,scn,timestamp,sql_redo,sql_undo from v$logmnr_contents WHERE table_name in ('LIU_ORACLEOLTP_TEST02');

总共输出8行,一行创建表的语句(create table);5行插入数据(insert);1行删除数据(delete);1行更新数据(update)
在这里插入图片描述

   

案例:模拟delete、drop、truncate表在在线/归档日志的记录(必须启用补充日志,不然通过logminer分析的日志不提供DML相关操作)

一、安装logminer和打开补充日志

(1)安装logminer(LogMiner分析工具实际上是由一组PL/SQL包和一些动态视图组成,11g需要安装,12c之后默认安装了logminer)

SQL> @$ORACLE_HOME/rdbms/admin/dbmslm.sql    ---创建DBMS_LOGMNR包,用于分析重做日志文件。
SQL> @$ORACLE_HOME/rdbms/admin/dbmslmd.sql   ---创建DBMS_LOGMNR_D包,用于创建数据字典文件。

   

(2)打开补充日志(打开最小附加日志模式,日志的记录按照最小颗粒记录。使用logminer必须启用补充日志,如果误操作数据之前没有启用补充日志那么就不能使用logminer工具恢复误操作的数据)

SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SQL> alter database add supplemental log data;   ---打开附加日志模式。删除 supplemental log的语句alter database drop supplemental log data;
SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;

二、对表进行drop操作,通过logminer进行分析

(1)连接实例,创建1张表

[oracle@12c ~]$ sqlplus test/123456
SQL> alter system switch logfile;   ---将日志进行归档,因为delete的操作在当前日志里,所以需要进行日志切换归档。下面会用到logminer工具对这个归档进行分析
SQL>
create table test01_drop( 
id number(10) not null, 
name varchar(16) not null, 
sex varchar(16) not null, 
age number(10) not null 
); 
insert into test01_drop(id,name,sex,age) values (1,'test1','w',21);
insert into test01_drop(id,name,sex,age) values (2,'test2','m',22);
insert into test01_drop(id,name,sex,age) values (3,'test3','w',23);
insert into test01_drop(id,name,sex,age) values (4,'test4','m',24);
insert into test01_drop(id,name,sex,age) values (5,'test5','w',25); 
commit;

   

(2)对test01_drop表进行drop操作:

SQL> drop table test01_drop;
SQL> alter system switch logfile;
SQL> select name from v$archived_log;

在这里插入图片描述
   

(3)建立日志分析列表(logminer分析的日志会输出到v$logmnr_contents视图里)
在这里插入图片描述

LogFileName指定要添加到此会话期间要分析的重做日志文件列表中的重做日志文件的名称。
options执行以下操作之一:
      启动新的LogMiner会话和新的重做日志文件列表进行分析(DBMS_LOGMNR.NEW)
      将文件添加到重做日志文件的现有列表中进行分析(DBMS_LOGMNR.ADDFILE)
sqlplus下执行
execute dbms_logmnr.add_logfile(logfilename=>'/oracle/app/oracle/product/11.2.0/db_1/dbs/arch/1_13_1158687305.arc',options=>dbms_logmnr.new);
execute dbms_logmnr.add_logfile(logfilename=>'/oracle/app/oracle/product/11.2.0/db_1/dbs/arch/1_14_1158687305.arc',options=>dbms_logmnr.addfile);
.......LogMiner可以分析在线和归档两种日志文件,加入分析日志文件使用dbms_logmnr.add_logfile过程,第一个文件使用dbms_logmnr.new参数,后面文件使用dbms_logmnr.addfile参数
pl/sql下执行
begin
dbms_logmnr.add_logfile(logfilename=>'/oracle/app/oracle/product/11.2.0/db_1/dbs/arch/1_13_1158687305.arc',options=>dbms_logmnr.new);
end;
/
begin
dbms_logmnr.add_logfile(logfilename=>'/oracle/app/oracle/product/11.2.0/db_1/dbs/arch/1_14_1158687305.arc',options=>dbms_logmnr.addfile);
end;
/
.......LogMiner可以分析在线和归档两种日志文件,加入分析日志文件使用dbms_logmnr.add_logfile过程,第一个文件使用dbms_logmnr.new参数,后面文件使用dbms_logmnr.addfile参数

   

(4)启动分析
在这里插入图片描述

sqlplus下执行
  • 启动分析dbms_logmnr.add_logfile添加的所有日志:
execute dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog);
  • 启动分析dbms_logmnr.add_logfile添加日志的时间范围:
execute dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog,STARTTIME => TO_DATE('2022-07-13 19:48:54','YYYY-MM-DD HH24:MI:SS'),ENDTIME => TO_DATE('2022-07-13 22:48:54','YYYY-MM-DD HH24:MI:SS'));
  • 启动分析dbms_logmnr.add_logfile添加日志的scn范围:
execute dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog,StartScn=>1839427,EndScn=>1874719);
pl/sql下执行
  • 启动分析dbms_logmnr.add_logfile添加的所有日志:
begin
dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog);
end;
/
  • 启动分析dbms_logmnr.add_logfile添加日志的时间范围:
begin
dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog,
                     STARTTIME => TO_DATE('2022-07-13 19:48:54','YYYY-MM-DD HH24:MI:SS'),
                     ENDTIME => TO_DATE('2022-07-13 22:48:54','YYYY-MM-DD HH24:MI:SS'));
end;
/
  • 启动分析dbms_logmnr.add_logfile添加日志的scn范围:
begin
dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog,
                          StartScn=>1839427,
                          EndScn=>1874719);
end;
/

   

(5)查看日志分析结果(logminer分析的日志会输出到v$logmnr_contents视图里)

select FILENAME from v$logmnr_logs;    ---在LogMiner启动时显示分析的日志列表。
select username,scn,timestamp,sql_redo,sql_undo from v$logmnr_contents WHERE table_name='TEST01_DROP';

总共输出7行:一行创建表的语句(create table);五行alter table操作(这里很奇怪,正常应该是五行insert,但变成了alter table,以后有空研究),一行drop表语句(drop)

只记录drop的SQL操作

在这里插入图片描述
   

(6)结束分析
    结束分析后v l o g m n r c o n t e n t s 输出的内容消失,如果在看 v logmnr_contents输出的内容消失,如果在看v logmnrcontents输出的内容消失,如果在看vlogmnr_contents视图就会报错:ORA-01306: 在从 v$logmnr_contents 中选择之前必须调用 dbms_logmnr.start_logmnr()

    视图v$logmnr_contents里分析的结果仅在运行dbms_logmrn.start_logmnr过程中的这个会话的生命期中存在。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。最后使用DBMS_LOGMNR.END_LOGMNR过程终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。
在这里插入图片描述

sqlplus下执行
execute dbms_logmnr.end_logmnr;
pl/sql下执行
begin
dbms_logmnr.end_logmnr;
end;
/

三、对表进行truncate操作,通过logminer进行分析

(1)连接实例,创建1张表

[oracle@12c ~]$ sqlplus test/123456
SQL> alter system switch logfile;  ---将日志进行归档,因为delete的操作在当前日志里,所以需要进行日志切换归档。下面会用到logminer工具对这个归档进行分析
SQL>
create table test02_truncate( 
id number(10) not null, 
name varchar(16) not null, 
sex varchar(16) not null, 
age number(10) not null 
); 
insert into test02_truncate(id,name,sex,age) values (1,'test1','w',21);
insert into test02_truncate(id,name,sex,age) values (2,'test2','m',22);
insert into test02_truncate(id,name,sex,age) values (3,'test3','w',23);
insert into test02_truncate(id,name,sex,age) values (4,'test4','m',24);
insert into test02_truncate(id,name,sex,age) values (5,'test5','w',25); 
commit;

   

(2)对test02_truncate表进行truncate操作:

SQL> truncate table test02_truncate;
SQL> alter system switch logfile;
SQL> select name from v$archived_log;

在这里插入图片描述
   

(3)建立日志分析列表(logminer分析的日志会输出到v$logmnr_contents视图里)
在这里插入图片描述

LogFileName指定要添加到此会话期间要分析的重做日志文件列表中的重做日志文件的名称。
options执行以下操作之一:
      启动新的LogMiner会话和新的重做日志文件列表进行分析(DBMS_LOGMNR.NEW)
      将文件添加到重做日志文件的现有列表中进行分析(DBMS_LOGMNR.ADDFILE)
sqlplus下执行
execute dbms_logmnr.add_logfile(logfilename=>'/oracle/app/oracle/product/11.2.0/db_1/dbs/arch/1_13_1158687305.arc',options=>dbms_logmnr.new);
execute dbms_logmnr.add_logfile(logfilename=>'/oracle/app/oracle/product/11.2.0/db_1/dbs/arch/1_14_1158687305.arc',options=>dbms_logmnr.addfile);
.......LogMiner可以分析在线和归档两种日志文件,加入分析日志文件使用dbms_logmnr.add_logfile过程,第一个文件使用dbms_logmnr.new参数,后面文件使用dbms_logmnr.addfile参数
pl/sql下执行
begin
dbms_logmnr.add_logfile(logfilename=>'/oracle/app/oracle/product/11.2.0/db_1/dbs/arch/1_13_1158687305.arc',options=>dbms_logmnr.new);
end;
/
begin
dbms_logmnr.add_logfile(logfilename=>'/oracle/app/oracle/product/11.2.0/db_1/dbs/arch/1_14_1158687305.arc',options=>dbms_logmnr.addfile);
end;
/
.......LogMiner可以分析在线和归档两种日志文件,加入分析日志文件使用dbms_logmnr.add_logfile过程,第一个文件使用dbms_logmnr.new参数,后面文件使用dbms_logmnr.addfile参数

   

(4)启动分析
在这里插入图片描述

sqlplus下执行
  • 启动分析dbms_logmnr.add_logfile添加的所有日志:
execute dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog);
  • 启动分析dbms_logmnr.add_logfile添加日志的时间范围:
execute dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog,STARTTIME => TO_DATE('2022-07-13 19:48:54','YYYY-MM-DD HH24:MI:SS'),ENDTIME => TO_DATE('2022-07-13 22:48:54','YYYY-MM-DD HH24:MI:SS'));
  • 启动分析dbms_logmnr.add_logfile添加日志的scn范围:
execute dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog,StartScn=>1839427,EndScn=>1874719);
pl/sql下执行
  • 启动分析dbms_logmnr.add_logfile添加的所有日志:
begin
dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog);
end;
/
  • 启动分析dbms_logmnr.add_logfile添加日志的时间范围:
begin
dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog,
                     STARTTIME => TO_DATE('2022-07-13 19:48:54','YYYY-MM-DD HH24:MI:SS'),
                     ENDTIME => TO_DATE('2022-07-13 22:48:54','YYYY-MM-DD HH24:MI:SS'));
end;
/
  • 启动分析dbms_logmnr.add_logfile添加日志的scn范围:
begin
dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog,
                          StartScn=>1839427,
                          EndScn=>1874719);
end;
/

   

(5)查看日志分析结果(logminer分析的日志会输出到v$logmnr_contents视图里)

select FILENAME from v$logmnr_logs;    ---在LogMiner启动时显示分析的日志列表。
select username,scn,timestamp,sql_redo,sql_undo from v$logmnr_contents WHERE table_name='TEST02_TRUNCATE';

总共输出7行:一行创建表的语句(create table);五行数据插入语句(insert),一行truncate表语句(truncate)

只记录truncate的SQL操作

在这里插入图片描述
   

(6)结束分析
    结束分析后v l o g m n r c o n t e n t s 输出的内容消失,如果在看 v logmnr_contents输出的内容消失,如果在看v logmnrcontents输出的内容消失,如果在看vlogmnr_contents视图就会报错:ORA-01306: 在从 v$logmnr_contents 中选择之前必须调用 dbms_logmnr.start_logmnr()

    视图v$logmnr_contents里分析的结果仅在运行dbms_logmrn.start_logmnr过程中的这个会话的生命期中存在。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。最后使用DBMS_LOGMNR.END_LOGMNR过程终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。
在这里插入图片描述

sqlplus下执行
execute dbms_logmnr.end_logmnr;
pl/sql下执行
begin
dbms_logmnr.end_logmnr;
end;
/

四、对表进行delete操作,通过logminer进行分析

(1)连接实例,创建1张表

[oracle@12c ~]$ sqlplus test/123456
SQL> alter system switch logfile;  ---将日志进行归档,因为delete的操作在当前日志里,所以需要进行日志切换归档。下面会用到logminer工具对这个归档进行分析
SQL>
create table test03_delete( 
id number(10) not null, 
name varchar(16) not null, 
sex varchar(16) not null, 
age number(10) not null 
); 
insert into test03_delete(id,name,sex,age) values (1,'test1','w',21);
insert into test03_delete(id,name,sex,age) values (2,'test2','m',22);
insert into test03_delete(id,name,sex,age) values (3,'test3','w',23);
insert into test03_delete(id,name,sex,age) values (4,'test4','m',24);
insert into test03_delete(id,name,sex,age) values (5,'test5','w',25); 
commit;

   

(2)对test03_delete表进行drop操作:

SQL> delete from test03_delete;
SQL> alter system switch logfile;
SQL> select name from v$archived_log;

在这里插入图片描述
   

(3)建立日志分析列表(logminer分析的日志会输出到v$logmnr_contents视图里)
在这里插入图片描述

LogFileName指定要添加到此会话期间要分析的重做日志文件列表中的重做日志文件的名称。
options执行以下操作之一:
      启动新的LogMiner会话和新的重做日志文件列表进行分析(DBMS_LOGMNR.NEW)
      将文件添加到重做日志文件的现有列表中进行分析(DBMS_LOGMNR.ADDFILE)
sqlplus下执行
execute dbms_logmnr.add_logfile(logfilename=>'/oracle/app/oracle/product/11.2.0/db_1/dbs/arch/1_13_1158687305.arc',options=>dbms_logmnr.new);
execute dbms_logmnr.add_logfile(logfilename=>'/oracle/app/oracle/product/11.2.0/db_1/dbs/arch/1_14_1158687305.arc',options=>dbms_logmnr.addfile);
.......LogMiner可以分析在线和归档两种日志文件,加入分析日志文件使用dbms_logmnr.add_logfile过程,第一个文件使用dbms_logmnr.new参数,后面文件使用dbms_logmnr.addfile参数
pl/sql下执行
begin
dbms_logmnr.add_logfile(logfilename=>'/oracle/app/oracle/product/11.2.0/db_1/dbs/arch/1_13_1158687305.arc',options=>dbms_logmnr.new);
end;
/
begin
dbms_logmnr.add_logfile(logfilename=>'/oracle/app/oracle/product/11.2.0/db_1/dbs/arch/1_14_1158687305.arc',options=>dbms_logmnr.addfile);
end;
/
.......LogMiner可以分析在线和归档两种日志文件,加入分析日志文件使用dbms_logmnr.add_logfile过程,第一个文件使用dbms_logmnr.new参数,后面文件使用dbms_logmnr.addfile参数

   

(4)启动分析
在这里插入图片描述

sqlplus下执行
  • 启动分析dbms_logmnr.add_logfile添加的所有日志:
execute dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog);
  • 启动分析dbms_logmnr.add_logfile添加日志的时间范围:
execute dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog,STARTTIME => TO_DATE('2022-07-13 19:48:54','YYYY-MM-DD HH24:MI:SS'),ENDTIME => TO_DATE('2022-07-13 22:48:54','YYYY-MM-DD HH24:MI:SS'));
  • 启动分析dbms_logmnr.add_logfile添加日志的scn范围:
execute dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog,StartScn=>1839427,EndScn=>1874719);
pl/sql下执行
  • 启动分析dbms_logmnr.add_logfile添加的所有日志:
begin
dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog);
end;
/
  • 启动分析dbms_logmnr.add_logfile添加日志的时间范围:
begin
dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog,
                     STARTTIME => TO_DATE('2022-07-13 19:48:54','YYYY-MM-DD HH24:MI:SS'),
                     ENDTIME => TO_DATE('2022-07-13 22:48:54','YYYY-MM-DD HH24:MI:SS'));
end;
/
  • 启动分析dbms_logmnr.add_logfile添加日志的scn范围:
begin
dbms_logmnr.start_logmnr(Options => dbms_logmnr.dict_from_online_catalog,
                          StartScn=>1839427,
                          EndScn=>1874719);
end;
/

   

(5)查看日志分析结果(logminer分析的日志会输出到v$logmnr_contents视图里)

select FILENAME from v$logmnr_logs;    ---在LogMiner启动时显示分析的日志列表。
select username,scn,timestamp,sql_redo,sql_undo from v$logmnr_contents WHERE table_name='TEST03_DELETE';

总共输出11行:一行创建表的语句(create table);五行数据插入语句(insert),五行被delete的语句(delete),因为整个表只有5行
  重做日志中列出delete删除的全部数据,非常严谨。这就是为什么delete可以通过logminer日志挖掘恢复,而drop、truncate只能通过其他手段,手段参考文章中最上面的《DELETE/TRUNCATE/DROP操作恢复方法表》

在这里插入图片描述
   

(6)结束分析
    结束分析后v l o g m n r c o n t e n t s 输出的内容消失,如果在看 v logmnr_contents输出的内容消失,如果在看v logmnrcontents输出的内容消失,如果在看vlogmnr_contents视图就会报错:ORA-01306: 在从 v$logmnr_contents 中选择之前必须调用 dbms_logmnr.start_logmnr()

    视图v$logmnr_contents里分析的结果仅在运行dbms_logmrn.start_logmnr过程中的这个会话的生命期中存在。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。最后使用DBMS_LOGMNR.END_LOGMNR过程终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。
在这里插入图片描述

sqlplus下执行
execute dbms_logmnr.end_logmnr;
pl/sql下执行
begin
dbms_logmnr.end_logmnr;
end;
/

在这里插入图片描述

   

完结,撒花!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奈斯DB

打赏到账,我飘啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值