暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

logminer日志挖掘器

酒负盛名的笔记 2019-05-30
1178

     从逻辑角度出发,重做日志本身就是对数据库变更最天然的备份,只要数据经历过DML和DDL变更,数据变更前的值和变更后的值均保存在重做日志中。有时由于没有合适的备份而无法将数据恢复时,向重做日志索要数据就成了最后的手段,而实现该手段的工具就是日志挖掘器,logminer。


实验前知识

1.LogMiner的关键功能:

      1.1.精确定位数据库的逻辑损坏(例如在应用程序级别发生的错误)可能已经开始。

      1.2.确定在事务级别执行细粒度恢复时必须采取的操作。

      1.3.事后审计


2.LogMiner配置和要求

    配置:

LogMiner配置中有四个基本对象:源数据库,挖掘数据库,LogMiner字典以及包含感兴趣数据的重做日志文件:

      2.1 源数据库是生成您希望LogMiner分析的所有重做日志文件的数据库。

      2.2挖掘数据库是LogMiner在执行分析时使用的数据库。

      2.3LogMiner字典允许LogMiner在显示请求的重做日志数据时提供表名和列名,而不是内部对象ID。

       2.4需要挖掘的重做日志

    要求:

      2.5源库和挖掘库

源数据库和挖掘数据库都必须在同一硬件平台上运行。

挖掘数据库可以与源数据库相同或完全独立。

挖掘数据库必须作为源数据库运行相同版本或更高版本的Oracle数据库软件。

挖掘数据库必须使用源数据库使用的相同字符集(或字符集的超集)。

      2.6LogMiner字典

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

      2.7挖掘的重做日志文件

必须由相同的源数据库生成,必须与同一数据库关联RESETLOGS SCN。

      2.8在生成将由LogMiner分析的日志文件之前,必须启用补充日志记录。

     开启:ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

  查看:SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

      如果查询返回的值YES或IMPLICIT,最小补充日志记录已启用。


3.v$logmnr_contents视图

v$logmnr_contents视图是日志挖掘后的日志接口,字段查询内容是我们日志挖掘的目的。重要字段有如下:

   3.1sql_redo:重构的SQL命令,具备与真实语句同样的逻辑,不一定与真实执行的文本一模一样。

   3.2sql_undo:重构的撤销SQL命令

   3.3xid:变更的事务号

   3.4operation:变更操作的类型

   3.5seg_owner:被修改的段的拥有者

   3.6seg_name:被修改的段的名字

   3.7username:变更操作的数据库用户名

   3.8os_username:变更操作的操作系统用户名

   3.9machine_name:变更操作所在主机

   3.10scn:变更发生时的scn号

   3.11timestamp:变更发生的时间


4.logminer挖掘日志一般步骤

    4.1运行logminer前置包

    4.2生成LogMiner字典

    4.3注册需要挖掘的重做日志

    4.4启动LogMiner

    4.5查询V$LOGMNR_CONTENTS视图,请求感兴趣的重做数据。

    4.6结束LogMiner会话。



实验篇

1.安装logminer工具

SQL> @?/rdbms/admin/dbmslm.sql

SQL> @?/rdbms/admin/dbmslmd.sql


2.启用最小补充日志

  开启:ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

  查看:SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;


3.执行数据变更操作


4.切换归档,生成归档日志


5.生成LogMiner字典

select SEQUENCE#,NAME,DICTIONARY_BEGIN,DICTIONARY_END from v$archived_log where DICTIONARY_BEGIN='YES' or DICTIONARY_END='YES';


begin

dbms_logmnr_d.build(options=>dbms_logmnr_d.store_in_redo_logs);

end;

/

可见logminer字典已经生成至序列号为8的归档日志

6.注册需要挖掘的重做日志


7.开始挖掘注册的日志


8.查询挖掘的内容

8.1有关hr.employess表的所有变更

select '('||rownum||')' as sql#,sql_redo from v$logmnr_contents where seg_owner='HR' and seg_name='EMPLOYEES';


可见,更新前的值见于where子句,更新后的值见于update的set子句。挖掘出执行的update语句和当初执行的update语句完全不一致(原执行一个update语句,挖掘出来确是三个update语句),但逻辑却是一致的。

8.2审计追查

select '('||rownum||')' as sql#,session_info,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss')  from v$logmnr_contents where seg_owner='HR' and seg_name='EMPLOYEES';

可以审查出,语句执行的用户名,主机名,操作时间等审计信息。

9.结束日志挖掘


文章转载自酒负盛名的笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论