从逻辑角度出发,重做日志本身就是对数据库变更最天然的备份,只要数据经历过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.结束日志挖掘