oracle 日志挖掘

本文介绍了如何使用Oracle的LogMiner工具进行日志挖掘。首先,需要以DBA用户身份运行$ORACLE_HOME/rdbms/admin/dbmslm.sql和dbmslmd.sql脚本来创建必要的包。然后,创建字典文件并启动日志分析。LogMiner的分析结果仅在当前会话中可见,结束后数据将消失。通过查询v$logmnr_contents视图可以查看操作记录,例如删除和插入操作的详细信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

oracle 提供了一种技术,叫做LogMiner 可以对redo log和archive log进行挖掘,得到其中有用的信息。该工具特别适用于调试、审计或者回退某个特定的事务。
LogMiner的使用
  使用LogMiner数据库必须运行在归档模式下,查看数据归档的如下:

SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列     1607
下一个存档日志序列   1609
当前日志序列           1609

在开始学习LogMiner,我们做如下的例子:
SQL> create table t as select * from dba_objects;
得到当前scn
SQL> select dbms_flashback.get_system_change_number scn from dual;

       SCN
----------
   7240047
我们来做删除操作
SQL> delete from t where rownum=1;

SQL> commit;

再一次得到scn
SQL> select dbms_flashback.get_system_change_number scn from dual;

       SCN
----------
   7240098
得到当前日志
SQL> select group#,members,status from v$log;

    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          1 CURRENT
         2          1 INACTIVE
         3          1 INACTIVE
SQL> select member from v$logfile where group#=1;

MEMBER
--------------------------------------------------

D:\APP\ZHOUKAI\ORADATA\ORCL\REDO01.LOG
后面我们使用LogMiner来挖掘这部分日志
1.安装LogMiner
  在安装oracle的时候,一般都已经默认安装了LogMiner了,查看有没有LogMiner运行所需要的dbms_logmnrdbms_logmnr_d,如果没有则需要安装,在oracle 11g中使用dba权限执行以下脚本:

1、$ORACLE_HOME/rdbms/admin/dbmslm.sql

2、$ORACLE_HOME/rdbms/admin/dbmslmd.sql

这两个脚本必须均以DBA用户身份运行。其中第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。

2.创建字典文件

 CREATE DIRECTORY utlfile AS 'D:\app\zhoukai\oradata\LOGMNR';
 alter system set utl_file_dir='D:\app\zhoukai\oradata\LOGMNR' scope=spfile;

 执行以上语句后,重启数据库,查看是否设置成功

SQL> show parameter utl

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
create_stored_outlines               string
utl_file_dir                         string      D:\app\zhoukai\oradata\LOGMNR
EXECUTE dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location=>'D:\app\zhoukai\oradata\LOGMNR');

3.添加分析文件

 方法如下:

exec dbms_logmnr.add_logfile(logfilename=>'D:\APP\ZHOUKAI\ORADATA\ORCL\REDO01.LOG',options=>dbms_logmnr.NEW);

也可以添加多个文件,我们新增一个文件,方法如下:看出不同了吗,看看最后红色部分
dbms_logmnr.add_logfile(logfilename=>'D:\oracle\oradata\practice\ARCHIVE\ARC00002_0817639922.001',options=>dbms_logmnr.ADDFILE)

4.启动日志分析

  在分析日志之前我们要重建数据字典,因为我们刚才对表做了改动,所以在启动之前我们先要更新数据字典。
  
  启动日志可以制定一个范围,也可以不指定分析整个文件,具体的一些参数请查看oracle官方文档,在这边我们使用scn的范围限制。方法如下:
  
  EXECUTE dbms_logmnr.start_logmnr( DictFileName =>'D:\app\zhoukai\oradata\LOGMNR\dictionary.ora',StartScn =>7240047,EndScn =>7240098); 
 如果你不想创建字典可以使用以下方法
 EXECUTE dbms_logmnr.start_logmnr( options =>dbms_logmnr.DICT_FROM_ONLINE_CATALOG,StartScn =>7240047,EndScn =>7240098);  
 具体options有很多参数,可以参照oracle官方文档。

5.查看分析结果
 到现在为止,我们已经分析得到了重作日志文件中的内容。动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息。

SELECT sql_redo FROM v$logmnr_contents; 

如果我们仅仅想知道某个用户对于某张表的操作,可以通过下面的SQL查询得到,该查询可以得到用户LOGMINER对表EMP所作的一切工作。

SELECT sql_redo FROM v$logmnr_contents WHERE username='LOGMINER' AND tablename='EMP'; 

序号

名称

含义

1

SCN

特定数据变化的系统更改号

2

TIMESTAM

数据改变发生的时间

3

COMMIT_TIMESTAMP

数据改变提交的时间

4

SEG_OWNER

数据发生改变的段名称

5

SEG_NAME

段的所有者名称

6

SEG_TYPE

数据发生改变的段类型

7

SEG_TYPE_NAME

数据发生改变的段类型名称

8

TABLE_SPACE

变化段的表空间

9

ROW_ID

特定数据变化行的ID

10

SESSION_INFO

数据发生变化时用户进程信息

11

OPERATION

重做记录中记录的操作(如INSERT)

12

SQL_REDO

可以为重做记录重做指定行变化的SQL语句(正向操作)

13

SQL_UNDO

可以为重做记录回退或恢复指定行变化的SQL语句(反向操作)

需要强调一点的是,视图v$logmnr_contents中的分析结果仅在我们运行过程'dbms_logmrn.start_logmnr'这个会话的生命期中存在。这是因为所有的LogMiner存储都在PGA内存中,所有其他的进程是看不到它的,同时随着进程的结束,分析结果也随之消失。

最后,使用过程DBMS_LOGMNR.END_LOGMNR终止日志分析事务,此时PGA内存区域被清除,分析结果也随之不再存在。

那么我们来产看我们挖掘的数据。


SQL> SELECT operation,sql_redo,sql_undo FROM v$logmnr_contents WHERE  table_name

='T';


OPERATION       SQL_REDO                       SQL_UNDO

--------------- ------------------------------ ------------------------------

DELETE          delete from "SCOTT"."T" where  insert into "SCOTT"."T"("OWNER

                "OWNER" = 'SYS' and "OBJECT_NA ","OBJECT_NAME","SUBOBJECT_NAM

                ME" = 'ICOL$' and "SUBOBJECT_N E","OBJECT_ID","DATA_OBJECT_ID

                AME" IS NULL and "OBJECT_ID" = ","OBJECT_TYPE","CREATED","LAS

                 '20' and "DATA_OBJECT_ID" = ' T_DDL_TIME","TIMESTAMP","STATU

                2' and "OBJECT_TYPE" = 'TABLE' S","TEMPORARY","GENERATED","SE

                 and "CREATED" = TO_DATE('30-3 CONDARY","NAMESPACE","EDITION_

                月 -10', 'DD-MON-RR') and "LAS NAME") values ('SYS','ICOL$',N

                T_DDL_TIME" = TO_DATE('30-3月  ULL,'20','2','TABLE',TO_DATE('

                -10', 'DD-MON-RR') and "TIMEST 30-3月 -10', 'DD-MON-RR'),TO_D

                AMP" = '2010-03-30:10:07:48' a ATE('30-3月 -10', 'DD-MON-RR')


OPERATION       SQL_REDO                       SQL_UNDO

--------------- ------------------------------ ------------------------------

                nd "STATUS" = 'VALID' and "TEM ,'2010-03-30:10:07:48','VALID'

                PORARY" = 'N' and "GENERATED"  ,'N','N','N','1',NULL);

                = 'N' and "SECONDARY" = 'N' an

                d "NAMESPACE" = '1' and "EDITI

                ON_NAME" IS NULL and ROWID = '

                AAAUswAAEAABbujAAA';

我们可以使用undo恢复误删除的数据,其它作用前面已经描述了。

6.结束LogMiner
SQL> EXEC DBMS_LOGMNR.END_LOGMNR;

PL/SQL 过程已成功完成。

关于LogMiner学习如上

参照文档:oracle官方文档


   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值