如何利用DBMS_LOGMNR包挖掘在线日志

今天实验内容是日志挖掘工具LOGMNR的使用,我的测试版本是10.2.0.1默认就自带了,无需另外安装。

如果未安装过提示无法使用这个dbms包,则可以用SYSDBA登陆,然后依次执行:

@$ORACLE_HOME\rdbms\admin\dbmslm.sql;

@$ORACLE_HOME\rdbms\admin\dbmslmd.sql;

第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。

第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。

--开始实验

[[email protected] ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on 26 09:33:33 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

SQL> set line 130

SQL> select * from v$log;

GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

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

1          1          8   52428800          1 YES INACTIVE               1402743 2014-12-24

2          1          9   52428800          1 NO  CURRENT                1402823 2014-12-24

3          1          7   52428800          1 YES INACTIVE               1401824 2014-12-24

SQL> col member for a45

SQL> select group#,member from v$logfile;

GROUP# MEMBER

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

3 /u01/app/oracle/oradata/ora10g/redo03.log

2 /u01/app/oracle/oradata/ora10g/redo02.log

1 /u01/app/oracle/oradata/ora10g/redo01.log

--启用日志挖掘

SQL> exec dbms_logmnr.add_logfile(‘/u01/app/oracle/oradata/ora10g/redo02.log‘);

PL/SQL procedure successfully completed.

SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);

PL/SQL procedure successfully completed.

来看一下LOGMNR工具用到的相关视图:

SQL> set pages 100

SQL> col comments for a40

SQL> select * from dict t where t.table_name like ‘%LOGMNR%‘;

TABLE_NAME                     COMMENTS

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

DBA_LOGMNR_LOG

DBA_LOGMNR_SESSION

DBA_LOGMNR_PURGED_LOG

V$LOGMNR_CONTENTS              Synonym for V_$LOGMNR_CONTENTS

V$LOGMNR_PARAMETERS            Synonym for V_$LOGMNR_PARAMETERS

V$LOGMNR_DICTIONARY            Synonym for V_$LOGMNR_DICTIONARY

V$LOGMNR_LOGS                  Synonym for V_$LOGMNR_LOGS

V$LOGMNR_STATS                 Synonym for V_$LOGMNR_STATS

V$LOGMNR_DICTIONARY_LOAD       Synonym for V_$LOGMNR_DICTIONARY_LOAD

GV$LOGMNR_CONTENTS             Synonym for GV_$LOGMNR_CONTENTS

GV$LOGMNR_PARAMETERS           Synonym for GV_$LOGMNR_PARAMETERS

GV$LOGMNR_DICTIONARY           Synonym for GV_$LOGMNR_DICTIONARY

GV$LOGMNR_LOGS                 Synonym for GV_$LOGMNR_LOGS

V$LOGMNR_LOGFILE               Synonym for V_$LOGMNR_LOGFILE

V$LOGMNR_PROCESS               Synonym for V_$LOGMNR_PROCESS

V$LOGMNR_LATCH                 Synonym for V_$LOGMNR_LATCH

V$LOGMNR_TRANSACTION           Synonym for V_$LOGMNR_TRANSACTION

V$LOGMNR_REGION                Synonym for V_$LOGMNR_REGION

V$LOGMNR_CALLBACK              Synonym for V_$LOGMNR_CALLBACK

V$LOGMNR_SESSION               Synonym for V_$LOGMNR_SESSION

GV$LOGMNR_LOGFILE              Synonym for GV_$LOGMNR_LOGFILE

GV$LOGMNR_PROCESS              Synonym for GV_$LOGMNR_PROCESS

GV$LOGMNR_LATCH                Synonym for GV_$LOGMNR_LATCH

GV$LOGMNR_TRANSACTION          Synonym for GV_$LOGMNR_TRANSACTION

GV$LOGMNR_REGION               Synonym for GV_$LOGMNR_REGION

GV$LOGMNR_CALLBACK             Synonym for GV_$LOGMNR_CALLBACK

GV$LOGMNR_SESSION              Synonym for GV_$LOGMNR_SESSION

GV$LOGMNR_STATS                Synonym for GV_$LOGMNR_STATS

GV$LOGMNR_DICTIONARY_LOAD      Synonym for GV_$LOGMNR_DICTIONARY_LOAD

29 rows selected.

这里主要用到的是v$logmnr_contents这个视图,里面存放里挖掘日志获得的内容,来看一下表结构:

SQL> desc v$logmnr_contents;

Name                                                                    Null?    Type

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

SCN                                                                              NUMBER

CSCN                                                                             NUMBER

TIMESTAMP                                                                        DATE

COMMIT_TIMESTAMP                                                                 DATE

THREAD#                                                                          NUMBER

LOG_ID                                                                           NUMBER

XIDUSN                                                                           NUMBER

XIDSLT                                                                           NUMBER

XIDSQN                                                                           NUMBER

PXIDUSN                                                                          NUMBER

PXIDSLT                                                                          NUMBER

PXIDSQN                                                                          NUMBER

RBASQN                                                                           NUMBER

RBABLK                                                                           NUMBER

RBABYTE                                                                          NUMBER

UBAFIL                                                                           NUMBER

UBABLK                                                                           NUMBER

UBAREC                                                                           NUMBER

UBASQN                                                                           NUMBER

ABS_FILE#                                                                        NUMBER

REL_FILE#                                                                        NUMBER

DATA_BLK#                                                                        NUMBER

DATA_OBJ#                                                                        NUMBER

DATA_OBJD#                                                                       NUMBER

SEG_OWNER                                                                        VARCHAR2(32)

SEG_NAME                                                                         VARCHAR2(256)

TABLE_NAME                                                                       VARCHAR2(32)

SEG_TYPE                                                                         NUMBER

SEG_TYPE_NAME                                                                    VARCHAR2(32)

TABLE_SPACE                                                                      VARCHAR2(32)

ROW_ID                                                                           VARCHAR2(18)

SESSION#                                                                         NUMBER

SERIAL#                                                                          NUMBER

USERNAME                                                                         VARCHAR2(30)

SESSION_INFO                                                                     VARCHAR2(4000)

TX_NAME                                                                          VARCHAR2(256)

ROLLBACK                                                                         NUMBER

OPERATION                                                                        VARCHAR2(32)

OPERATION_CODE                                                                   NUMBER

SQL_REDO                                                                         VARCHAR2(4000)

SQL_UNDO                                                                         VARCHAR2(4000)

RS_ID                                                                            VARCHAR2(32)

SEQUENCE#                                                                        NUMBER

SSN                                                                              NUMBER

CSF                                                                              NUMBER

INFO                                                                             VARCHAR2(32)

STATUS                                                                           NUMBER

REDO_VALUE                                                                       NUMBER

UNDO_VALUE                                                                       NUMBER

SQL_COLUMN_TYPE                                                                  VARCHAR2(30)

SQL_COLUMN_NAME                                                                  VARCHAR2(30)

REDO_LENGTH                                                                      NUMBER

REDO_OFFSET                                                                      NUMBER

UNDO_LENGTH                                                                      NUMBER

UNDO_OFFSET                                                                      NUMBER

DATA_OBJV#                                                                       NUMBER

SAFE_RESUME_SCN                                                                  NUMBER

XID                                                                              RAW(8)

PXID                                                                             RAW(8)

AUDIT_SESSIONID                                                                  NUMBER

--通过抓取关键字"create",来获得刚才的建表语句

SQL> select scn,timestamp,log_id,seg_owner,seg_type,table_space,data_blk#,data_obj#,data_objd#,session#,serial#,username,session_info,sql_redo,sql_undo

2 from v$logmnr_contents t

3 where t.sql_redo like ‘create%‘;

SCN TIMESTAMP      LOG_ID SEG_OWNER                          SEG_TYPE TABLE_SPACE                       DATA_BLK#

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

DATA_OBJ# DATA_OBJD#   SESSION#    SERIAL# USERNAME

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

SESSION_INFO

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

SQL_REDO

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

SQL_UNDO

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

1404138 2014-12-26          9 ZLM                                       2                                         0

53863          0          0          0

create table zlm.t1 as select * from dba_objects;

可以看到,刚才的DDL建表语句已经被记录到v$logmnr_contents表中了

--结束日志挖掘

SQL> exec dbms_logmnr.end_logmnr;

PL/SQL procedure successfully completed.

一旦结束日志挖掘后,就无法再对v$logmgr_contents视图进行查询,会报错:

SQL> select scn,timestamp,log_id,seg_owner,seg_type,table_space,data_blk#,data_obj#,data_objd#,session#,serial#,username,session_info,sql_redo,sql_undo

2  from v$logmnr_contents t

3  where t.sql_redo like ‘create%‘;

from v$logmnr_contents t

*

ERROR at line 2:

ORA-01306: dbms_logmnr.start_logmnr() must be invoked before selecting from v$logmnr_contents

并且要重新指定挖掘的日志对象,否则依然报错:

SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);

BEGIN dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog); END;

*

ERROR at line 1:

ORA-01292: no log file has been specified for the current LogMiner session

ORA-06512: at "SYS.DBMS_LOGMNR", line 58

ORA-06512: at line 1

SQL> create table zlm.t2 as select * from zlm.t1;

create table zlm.t2 as select * from zlm.t1

*

ERROR at line 1:

ORA-01652: unable to extend temp segment by 128 in tablespace WEB

由于之前zlm用户给的默认表空间WEB空间比较小,只有10M,因此报空间不足了

SQL> select d.file#,d.ts#,d.bytes/1024/1024 as "Size(M)",t.name from v$datafile d,v$tablespace t where d.ts#=t.ts#;

FILE#        TS#    Size(M) NAME

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

1          0        560 SYSTEM

2          1        165 UNDOTBS1

3          2        270 SYSAUX

4          4         40 USERS

5          6        100 EXAMPLE

6          7         50 ZLM

7         18         20 INDX2

8         19         10 WEB

8 rows selected.

--修改zlm缺省表空间为zlm

SQL> alter user zlm default tablespace zlm;

User altered.

SQL> create table zlm.t2 as select * from zlm.t1;

Table created.

SQL> select * from v$log;

GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

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

1          1         11   52428800          1 NO  CURRENT                1405472 2014-12-26

2          1          9   52428800          1 YES INACTIVE               1402823 2014-12-24

3          1         10   52428800          1 YES INACTIVE               1405357 2014-12-26

由于之前创建t1表的操作会产生一定的redo,并且是一个DDL操作,会自动commit,当前日志已经切换到group 1了

SQL> select scn,timestamp,log_id,seg_owner,seg_type,table_space,data_blk#,data_obj#,data_objd#,session#,serial#,username,session_info,sql_redo,sql_undo

2 from v$logmnr_contents t

3 where t.sql_redo like ‘create%‘;

SCN TIMESTAMP      LOG_ID SEG_OWNER                          SEG_TYPE TABLE_SPACE                       DATA_BLK#

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

DATA_OBJ# DATA_OBJD#   SESSION#    SERIAL# USERNAME

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

SESSION_INFO

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

SQL_REDO

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

SQL_UNDO

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

1404138 2014-12-26          9 ZLM                                       2                                         0

53863          0          0          0

create table zlm.t1 as select * from dba_objects;

既然当前日志是group 1的日志文件,而之前挖掘对象是group 2的日志文件,所以查询v$logmgr_contetns视图发现,第2条建表语句并没有被记录下来

--重新对group 1的redo01.log日志进行挖掘

SQL> exec dbms_logmnr.add_logfile(‘/u01/app/oracle/oradata/ora10g/redo01.log‘);

PL/SQL procedure successfully completed.

SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);

PL/SQL procedure successfully completed.

--查看LOGMNR内容表

SQL> select scn,timestamp,log_id,seg_owner,seg_type,table_space,data_blk#,data_obj#,data_objd#,session#,serial#,username,session_info,sql_redo,sql_undo

2 from v$logmnr_contents t

3  where t.sql_redo like ‘create%‘;

SCN TIMESTAMP      LOG_ID SEG_OWNER                          SEG_TYPE TABLE_SPACE                       DATA_BLK#

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

DATA_OBJ# DATA_OBJD#   SESSION#    SERIAL# USERNAME

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

SESSION_INFO

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

SQL_REDO

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

SQL_UNDO

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

1404138 2014-12-26          9 ZLM                                       2                                         0

53863          0          0          0

create table zlm.t1 as select * from dba_objects;

1406186 2014-12-26         11 ZLM                                       2                                         0

53864          0          0          0

create table zlm.t2 as select * from zlm.t1;

1406401 2014-12-26         11 ZLM                                       2                                         0

53865          0          0          0

create table zlm.t2 as select * from zlm.t1;

对redo01.log日志挖掘后,新的两条创建t2表的语句就被写入v$logmnr_contents中了,包括之前由于空间不足创建失败的那条语句,也做了记录,他们各自都有自己的scn号,不会互相冲突。注意,挖掘日志完毕以后,记得用exec dbms_logmnr.end_logmnr;关闭,否则会消耗数据库资源。

总结:

通过使用dbms_logmnr包,可以对在线日志进行挖掘,来获对数据库操作相关语句,对于审计也有一定的作用。高级用法还有很多,包括对归档日志的挖掘,对其他内容的挖掘等,这里只是做了一个简单的测试,觉得这个工具还是挺好用的。

时间: 2024-10-10 04:38:59

如何利用DBMS_LOGMNR包挖掘在线日志的相关文章

读书笔记-在线日志分析的常用命令

摘自<大型分布式网站架构设计与实践> 4.1在线日志分析 1.基础命令 操作 命令 说明 查看文件的内容 cat -n access.log -n显示行号 分页显示文件 more access.log Enter下一行,空格下一页,F下一屏,B上一屏 分页显示文件 less access.log 输入 /字符串 可查找并高亮 显示文件尾 tail -n2 -f access.log -n2显示最后2行,-f继续监听不退出 内容排序 sort -k 2 -t ' ' -n access.log

利用DBMS_STATS包修改统计信息,欺骗优化器,生成糟糕的执行计划

在使用基于成本的优化器的优化器时,优化器生产执行计划时要估算每条SQL的执行成本,选择最佳的执行计划来执行sql语句.通过操纵统计信息就可以简介操纵执行计划的生成. 当然 需要强调的一点是,这是非常危险的行为 1 创建测试表 SQL> create table test_stats  as   2  select * from dba_objects ; Table created. 2 收集统计信息 SQL> EXEC dbms_stats.gather_table_stats(ownnam

CentOS 6.5下利用Rsyslog+LogAnalyzer+MySQL部署日志服务器

一.简介 LogAnalyzer 是一款syslog日志和其他网络事件数据的Web前端.它提供了对日志的简单浏览.搜索.基本分析和一些图表报告的功能.数据可以从数据库或一般的syslog文本文件中获取,所以LogAnalyzer不需要改变现有的记录架构.基于当前的日志数据,它可以处理syslog日志消息,Windows事件日志记录,支持故障排除,使用户能够快速查找日志数据中看出问题的解决方案. LogAnalyzer 获取客户端日志会有两种保存模式,一种是直接读取客户端/var/log/目录下的

网络安全系列之五十五 利用抓包来上传webshell

在Web渗透的过程中,最为麻烦的一个环节就是上传WebShell,之前曾介绍过利用数据库备份来上传,这也属于最为简单和古老的一种方法.本文将介绍另外一种利用抓包来上传WebShell的方法,目标网站采用南方数据5.0,实验平台采用IIS搭建,如何利用IIS搭建ASP网站可参考博文http://yttitan.blog.51cto.com/70821/1579372. 首先登录网站后台,找到上传点. 点击浏览按钮,打开"选择文件"窗口,随意选择一张准备上传的图片. 注意,这里先不要点击&

【实例】正则表达式利用grep和sed处理日志内容,获取所需的内容

[实例]正则表达式利用grep和sed处理日志内容, 获取所需的内容 app.log文件内容: 2014-09-11 00:00:01,516 INFO [com.tt.bb.thread.Control] - Socket连接:/182.105.83.33:532172014-09-12 10:00:06,555 INFO [com.tt.bb.thread.Control] - Socket连接:/182.113.83.51:53249 2014-09-13 20:00:11,587 INF

Installation Oracle11gR2 RAC---修改在线日志

连接数据库服务器,查询现有在线日志组信息并添加在线日志组. Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 Connected as system SQL> select * from v$logfile; GROUP# STATUS  TYPE    MEMBER                                          IS_RECOVERY_DEST_FILE ------

java利用poi包 为excel生成超链接

转载自:http://www.blogjava.net/leekiang/archive/2008/10/21/235794.html 1,一个需求, 要求报表生成的Excel表格支持超链接.例如点击Excel内的公司名, 自动打开浏览器并连到该公司的网站上去.在Excel里面选中所需的单元格, 右键弹出属性, 选超链接就能输入相应的地址了,既然Excel支持超链接.那就没有什么借口说不能实现了.:). 翻了翻POI的文档, 很容易就找到了解决方案.在POI中让单元格实现超链接功能, 可以用Hy

adb logcat 通过包名过滤日志并输出到txt文件

最近学使用ADB命令抓包APP闪退的日志: 1)在cmd命令行中可以使用adb logcat 命令查看android系统的log,也可以使用adb shell进入到adb shell专用命令行 2)dos窗口可以直接输入log,或定向输出到txt文件: 3)按ctrl+c中断输入log记录: android输出的每一条日志都有一个标记和优先级与其关联. 优先级是下面的字符,顺序是从低到高: V - 明细 verbose(最低优先级) D - 调试 debug I - 信息 info W - 警告

【转载】 java利用snmp4j包来读取snmp协议数据(Manager端)

https://www.cnblogs.com/xdp-gacl/p/4187089.html http://doc.okbase.net/yuanfy008/archive/265663.html java利用snmp4j包来读取snmp协议数据(Manager端) 1 snmp简单介绍 java利用snmp4j包来读取snmp协议数据,很简单的一个流程,就是利用java来读取运行snmp协议的数据,例如服务器.PC机或者路由器等运行了snmp协议的设备. snmp协议是什么呢? 简单网络管理