LogMiner学习笔记
本文是个实战,没有讲太多理论的东西,如需详细理解Oracle LogMiner,请移步:LogMiner详细讲解
首先介绍一下我的oracle环境:

第一步:
确定LogMiner已经安装。
安装LogMiner需要用SYS用户执行两个sql脚本:
1.$ORACLE_HOME/rdbms/admin/dbmslm.sql
2.$ORACLE_HOME/rdbms/admin/dbmslmd.sql
相应的,我的环境中执行的语句为:
1.@/u01/oracle/rdbms/admin/dbmslm.sql
2.@/u01/oracle/rdbms/admin/dbmslmd.sql
执行效果图:

第二步:
查看是否设置了初始化参数:UTL_FILE_DIR
执行语句:show parameterutl;

可以看到,我的日志分析目录已经指定为/u01/dataoracle/oracle/logminer
如果没有指定目录,可以修改数据库的initsid.ora文件(此文件在:$ORACLE_HOME/dbs/initSID.ora对应的,我本机的目录就是:/u01/oracle/dbs/
),或者可以使用如下命令进行修改:
alter system setutl_file_dir='/u01/dataoracle/oracle/logminer' scope=spifle;
重新启动数据库,是新加的参数生效。
注意:这个目录可以随意指定,但是这个目录必须存在,并且oracle用户拥有权限操作,否则会报错。
第三步:
首先执行一条insert语句,方便一会儿分析。执行用户是scott,执行时间是2013-06-29 11:46:35

第四步:
创建字典文件
执行语句:
exec sys.dbms_logmnr_d.build(dictionary_filename=>'dictionary.ora',dictionary_location =>'/u01/dataoracle/oracle/logminer');
这里的dictionary.ora可以随便取。

第五步:
创建要分析的日志文件列表
我这里分析在线日志(online log)
首先你要知道当前正在使用的日志是哪个日志,查看试图v$logfile就能看到:

GROUP为1的就是当前在线日志。flas_recovery_area是闪回区,我们不用分析它。
1、创建列表:
EXECUTE dbms_logmnr.add_logfile(LogFileName=>'/u01/oradata/HDWKXT/onlinelog/o1_mf_1_8w30j2dn_.log',Options=>dbms_logmnr.new);

我的目录结构:

2、添加其他日志文件到日志列表:
我将三个日志都加入了分析,防止分析不到。
EXECUTE dbms_logmnr.add_logfile(LogFileName=>'/u01/oradata/HDWKXT/onlinelog/o1_mf_3_8w30jdyx_.log',Options=>dbms_logmnr.addfile); EXECUTE dbms_logmnr.add_logfile(LogFileName=>'/u01/oradata/HDWKXT/onlinelog/o1_mf_2_8w30j6lb_.log',Options=>dbms_logmnr.addfile);
………………………………离线日志文件分析:略…………………………………………
第六步:
使用LogMiner分析日志
执行语句:
EXECUTE dbms_logmnr.start_logmnr(DictFileName=>'/u01/dataoracle/oracle/logminer/dictionary.ora');
这里的dictionary.ora就是之前建立的数据字典。

上边是分析全部日志,数据量大的话,不方便分析,我们可以进行有限条件的分析
EXECUTE dbms_logmnr.start_logmnr(DictFileName=>'/u01/dataoracle/oracle/logminer/dictionary.ora',StartTime => to_date('2013-06-29 11:00:00','YYYY-MM-DD HH24:MI:SS'),EndTime=> to_date('2013-06-29 12:00:00','YYYY-MM-DDHH24:MI:SS '));
第七步:
查询V$logmnr_contents视图
格式调整:
col sql_redu for a50 col sql_undu for a50 col table_name for a10 set linesize SELECT sql_redo,sql_undo,table_name,username FROM v$logmnr_contents WHERE table_name like '%TEST%';

这里就查到了建立表和插入表的语句。我查询了四个字段,其中最重要的就是SQL_REDO和SQL_UNDO, SQL_REDO是我们执行的语句,如果我们需要逆转这个数据,只要执行对应的SQL_UNDO里边的语句即可。
注意:如果你只查询到了DDL语句,而没有查到DML语句,请执行以下语句再进行分析
alter database add supplemental log data
第八步:
分析结束
execute dbms_logmnr.end_logmnr();
另附V$LOGMNR_CONTENTS的视图结构和使用
|
列名 |
数据类型 |
说明 |
|
SCN |
NUMBER |
系统更改号 |
|
CSCN |
NUMBER |
System change number (SCN) when the transaction committed; only meaningful if the COMMITTED_DATA_ONLY option was chosen in aDBMS_LOGMNR.START_LOGMNR() invocation |
|
TIMESTAMP |
DATE |
时间戳 |
|
COMMIT_TIMESTAMP |
DATE |
Timestamp when the transaction committed; only meaningful if the COMMITTED_DATA_ONLY option was chosen in a DBMS_LOGMNR.START_LOGMNR()invocation |
|
THREAD# |
NUMBER |
线程号 |
|
LOG_ID |
NUMBER |
日志ID |
|
XIDUSN |
NUMBER |
事务处理ID撤消段号 |
|
XIDSLT |
NUMBER |
事务处理ID位置号 |
|
XIDSQN |
NUMBER |
事务处理ID日志序列号 |
|
PXIDUSN |
NUMBER |
Parent transaction ID undo segment number of a parallel transaction |
|
PXIDSLT |
NUMBER |
Parent transaction ID slot number of a parallel transaction |
|
PXIDSQN |
NUMBER |
Parent transaction ID sequence number of a parallel transaction |
|
RBASQN |
NUMBER |
RBA日志序列号 |
|
RBABLK |
NUMBER |
RBA块号 |
|
RBABYTE |
NUMBER |
RBA字节偏移量 |
|
UBAFIL |
NUMBER |
UBA文件号 |
|
UBABLK |
NUMBER |
UBA块号 |
|
UBAREC |
NUMBER |
UBA记录索引 |
|
UBASQN |
NUMBER |
UBA撤消块序列号 |
|
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) |
Name of the modified table (in case the redo pertains to a table modification) |
|
SEG_TYPE |
NUMBER |
段类型。可能的值有: · 0 = UNKNOWN · 1 = INDEX · 2 = TABLE · 19 = TABLE PARTITION · 20 = INDEX PARTITION · 34 = TABLE SUBPARTITION · All other values = UNSUPPORTED |
|
SEG_TYPE_NAME |
VARCHAR2(32) |
Segment type name. Possible values are: · UNKNOWN · INDEX · TABLE · TABLE PARTITION · UNSUPPORTED · TABLE_SPACE |
|
TABLE_SPACE |
VARCHAR2(32) |
段的表空间名 |
|
ROW_ID |
VARCHAR2(18) |
行ID |
|
SESSION# |
NUMBER |
会话号 |
|
SERIAL# |
NUMBER |
系列号 |
|
USERNAME |
VARCHAR2(30) |
用户名 |
|
SESSION_INFO |
VARCHAR2(4000) |
会话信息。可能的: · login_username = HR · client_info = · OS_username = jkundu · Machine_name = nirvan · OS_terminal = pts/31 · OS_program_name = sqlplus@nirvan (TNS V1-V3) |
|
TX_NAME |
VARCHAR2(256) |
Name of the transaction that made the change. This is only meaningful if the transaction is a named transaction. |
|
ROLLBACK |
NUMBER |
回退请求 |
|
OPERATION |
VARCHAR2(32) |
操作。可能的值: · INSERT = change was caused by an insert statement · UPDATE = change was caused by an update statement · DELETE = change was caused by a delete statement · DDL = change was caused by a DDL statement · START = change was caused by the start of a transaction · COMMIT = change was caused by the commit of a transaction · ROLLBACK = change was caused by a full rollback of a transaction · LOB_WRITE = change was caused by an invocation of DBMS_LOB.WRITE · LOB_TRIM = change was caused by an invocation of DBMS_LOB.TRIM · LOB_ERASE = change was caused by an invocation of DBMS_LOB.ERASE · SELECT_FOR_UPDATE = operation was a SELECT FOR UPDATE statement · SEL_LOB_LOCATOR = operation was a SELECT statement that returns a LOB locator · MISSING_SCN = LogMiner encountered a gap in the redo records. This is most likely because not all redo logs were registered with LogMiner. · INTERNAL = change was caused by internal operations initiated by the database · UNSUPPORTED = change was caused by operations not currently supported by LogMiner (for example, changes made to tables with ADT columns) |
|
OPERATION_CODE |
NUMBER |
Number of the operation code. Possible values are: · 0 = INTERNAL · 1 = INSERT · 2 = DELETE · 3 = UPDATE · 5 = DDL · 6 = START · 7 = COMMIT · 9 = SELECT_LOB_LOCATOR · 10 = LOB_WRITE · 11 = LOB_TRIM · 25 = SELECT_FOR_UPDATE · 28 = LOB_ERASE · 34 = MISSING_SCN · 36 = ROLLBACK · 255 = UNSUPPORTED |
|
SQL_REDO |
VARCHAR2(4000) |
SQL重做 |
|
SQL_UNDO |
VARCHAR2(4000) |
SQL撤消 |
|
RS_ID |
VARCHAR2(32) |
记录集ID |
|
SEQUENCE# |
NUMBER |
序列号 |
|
SSN |
NUMBER |
SQL序列号 |
|
CSF |
NUMBER |
连续SQL标志。可能的值: · 0 = indicates SQL_REDO and SQL_UNDO is contained within the same row · 1 = indicates that either SQL_REDO or SQL_UNDO is greater than 4000 bytes in size and is continued in the next row returned by the view |
|
INFO |
VARCHAR2(32) |
通知信息 |
|
STATUS |
NUMBER |
状态 |
|
REDO_VALUE |
NUMBER |
Used as input to the DBMS_LOGMNR.MINE_VALUE() and DBMS_LOGMNR.COLUMN_PRESENT() functions |
|
UNDO_VALUE |
NUMBER |
Used as input to the DBMS_LOGMNR.MINE_VALUE() and DBMS_LOGMNR.COLUMN_PRESENT() functions |
|
SQL_COLUMN_TYPE |
VARCHAR2(30) |
This column is deprecated. |
|
SQL_COLUMN_NAME |
VARCHAR2(30) |
This column is deprecated. |
|
REDO_LENGTH |
NUMBER |
This column is deprecated. |
|
REDO_OFFSET |
NUMBER |
This column is deprecated. |
|
UNDO_LENGTH |
NUMBER |
This column is deprecated. |
|
UNDO_OFFSET |
NUMBER |
This column is deprecated. |
|
DATA_OBJV# |
NUMBER |
Version number of the table being modified |
|
SAFE_RESUME_SCN |
NUMBER |
Reserved for future use |
|
XID |
RAW(8) |
Raw representation of the transaction identifier |
|
PXID |
RAW(8) |
Raw representation of the parent transaction identifier |
|
AUDIT_SESSIONID |
NUMBER |
Audit session ID associated with the user session making the change |
LogMiner学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- 如何解决在GDI画图中,多次修改画笔的颜色
首先创建个画笔对象: CPen gPen;gPen.CreatePen(PS_SOLID, 1, RGB(120,120,130));//一定灰度的画笔〈/br〉CPen* pOldPen = pDC ...
- php实现无限级树型菜单(函数递归算法)
首先到数据库取数据,放到一个数组,然后把数据转化为一个树型状的数组,最后把这个树型状的数组转为html代码.也可以将第二步和第三步合为一步. 详细如下:1.数据库设计:脚本如下:CREATE TABL ...
- [Machine Learning] Probabilistic Graphical Models:一、Introduction and Overview(1、Overview and Motivation)
一.PGM用来做什么 1. 医学诊断:从各种病症分析病人得了什么病,该用什么手段治疗 2. 图像分割:从一张百万像素级的图片中分析每个像素点对应的是什么东西 两个共同点:(1)有非常多不同的输入变 ...
- HTML5 自适应rem布局
(function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? ' ...
- js 中对象--对象结构(原型链基础解析)
对于本篇对于如何自定义对象.和对象相关的属性操作不了解的话,可以查我对这两篇博客.了解这两篇可以更容易理解本篇文章 用构造函数创建了一个对象 obj对象的本身创建了两个属性 x=1 ,y=2 ...
- js常用字符串函数
// JS字符串 //1.replace字符串替换,只能换第一部分,就是说多个字符相同,只能换下最先的 var str='helloworld!'; alert(str.replace('llo',' ...
- DJANGO不同应用之间的用户迁移
因为重新规划新的项目,数据库表结构和以前不一定了,但是想保存以前的很多用户认证方面的东东. 于是看了一下DJANGO的导入导出功能. ~~~~~~~~~~~~~~~~~~~ 数据导入: python ...
- 在线CSS圆角生成器
http://www.paibaidu.com/demo/CSSBorder/CSSBorder.html
- Spring MVC 中的REST支持
本部分提供了支持 RESTful web 服务的主要 Spring 功能(或注释)的概述. @Controller 使用 @Controller 注释对将成为 MVC 中控制器的类进行注释并处理 HT ...
- ssh 认证指定端口
[root@database2 ~]# cat ssh.sh if [ ! $# -eq 2 ] ;then echo "请输入用户密码以空格分开" exit else ssh-k ...