logminer 工具的使用

Oracle LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle 重作日志文件(归档日志文件)中的具体内容,特别是,该工具可以分析出所有对于数据库操作的DML(insert、update、delete等)语句,另外还可分析得到一些必要的回滚SQL语句。该工具特别适用于调试、审计或者回退某个特定的事务。

LogMiner分析工具实际上是由一组PL/SQL包和一些动态视图(Oracle8i内置包的一部分)组成,它作为Oracle数据库的一部分来发布,是8i产品提供的一个完全免费的工具。但该工具和其他Oracle内建工具相比使用起来显得有些复杂,主要原因是该工具没有提供任何的图形用户界面(GUI)。本文将详细介绍如何安装以及使用该工具。

一、LogMiner的用途

日志文件中存放着所有进行数据库恢复的数据,记录了针对数据库结构的每一个变化,也就是对数据库操作的所有DML语句。

在Oracle
8i之前,Oracle没有提供任何协助数据库管理员来读取和解释重作日志文件内容的工具。系统出现问题,对于一个普通的数据管理员来讲,唯一可以作的工作就是将所有的log文件打包,然后发给Oracle公司的技术支持,然后静静地等待Oracle
公司技术支持给我们最后的答案。然而从8i以后,Oracle提供了这样一个强有力的工具-LogMiner。

LogMiner 工具即可以用来分析在线,也可以用来分析离线日志文件,即可以分析本身自己数据库的重作日志文件,也可以用来分析其他数据库的重作日志文件。

总的说来,LogMiner工具的主要用途有:

1. 跟踪数据库的变化:可以离线的跟踪数据库的变化,而不会影响在线系统的性能。

2. 回退数据库的变化:回退特定的变化数据,减少point-in-time recovery的执行。

3. 优化和扩容计划:可通过分析日志文件中的数据以分析数据增长模式。

二、安装LogMiner

如果未安装过提示无法使用这个dbms包,则可以用SYSDBA登陆,然后依次执行:
@$Oracle_HOME\rdbms\admin\dbmslm.sql;
@$ORACLE_HOME\rdbms\admin\dbmslmd.sql;
第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。
第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。

三、开始
3.1 环境介绍:

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

3.2 设置参数utl_file_dir

[oracle@Oracle11g ~]$  mkdir -p /u01/logmnr_more
 
SYS @ prod
> show parameter utl_file_dir ;                                                                                                       

 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir                         string
 
SYS @ prod > alter system set utl_file_dir='/u01/logmnr_more'  scope=spfile;
 
System altered.
 
SYS
@ prod >startup
force                                                                                                            
 
ORACLE instance started.
 
Total System Global Area  314572800 bytes
Fixed Size                  1219184 bytes
Variable Size              79693200 bytes
Database Buffers          230686720 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
 
SYS @ prod >show parameter utl_file_dir ;
 
NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
utl_file_dir                         string                            /u01/logmnr_more
 
——建立数据字典文件dict.ora
 
SYS @ prod >execute dbms_logmnr_d.build('dict.ora','/u01/logmnr_more',dbms_logmnr_d.store_in_flat_file);
 
PL/SQL procedure successfully completed.

3.3 对redo log 进行挖掘,找出在某个时间点所作的DDL 或DML 操作(包括:时间点、datablock scn 、sql语句)

1) 对DML 分析

SQL> delete from owner.emp;
 
3 rows deleted.
 
SQL> commit;
 
Commit complete.
 
SQL> insert into owner.emp select * from scot.emp;
 
SQL> commit;
 
Commit complete.
 
SYS @ prod > select * from owner.emp;

EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
 
——查看当前日志组

SYS @ prod > select * from v$log;

GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
         1          1          7   52428800        512          1 YES ACTIVE                 1038204 16-SEP-14      1049618 05-NOV-17
         2          1          8   52428800        512          1 NO  CURRENT                1049618 05-NOV-17   2.8147E+14
         3          1          6   52428800        512          1 YES INACTIVE               1016929 16-SEP-14      1038204 16-SEP-14

SQL> alter system archive log current;         ——使当前日志组归档
 
System altered.
 
SYS @ prod > select * from v$log;

GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
         1          1          7   52428800        512          1 YES ACTIVE                 1038204 16-SEP-14      1049618 05-NOV-17
         2          1          8   52428800        512          1 YES ACTIVE                 1049618 05-NOV-17      1050691 05-NOV-17
         3          1          9   52428800        512          1 NO  CURRENT                1050691 05-NOV-17   2.8147E+14
 
 
2) 启用logmnr
 
——添加database补充日志

SYS @ prod > alter database add supplemental log data;   ——不添加后面会出错

Database altered.
 
——查询日志(归档日志和当前日志)
 
SYS @ prod > select * from v$log;

GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
         1          1          7   52428800        512          1 YES ACTIVE                 1038204 16-SEP-14      1049618 05-NOV-17
         2          1          8   52428800        512          1 YES ACTIVE                 1049618 05-NOV-17      1050691 05-NOV-17
         3          1          9   52428800        512          1 NO  CURRENT                1050691 05-NOV-17   2.8147E+14

SQL> select member from v$logfile;——当前日志
 
MEMBER
--------------------------------------------------
/u01/app/oracle/oradata/prod/redo01.log
/u01/app/oracle/oradata/prod/redo02.log
/u01/app/oracle/oradata/prod/redo03.log

SQL> select name from v$archived_log;——查看归档日志信息

NAME
-------------------
/u01/arch_dir/prod/1_7_858439997.dbf
/u01/arch_dir/prod/1_8_858439997.dbf

——添加日志,分析【添加的日志应该是切换前的日志,归档日志是最后一个日志】

SYS @ prod > execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/prod/redo02.log',options=>dbms_logmnr.new);

PL/SQL procedure successfully completed.
 
SYS @ prod > execute dbms_logmnr.add_logfile(logfilename=>'/u01/arch_dir/prod/1_7_858439997.dbf',options=>dbms_logmnr.addfile);

PL/SQL procedure successfully completed.
 
——执行logmnr 分析
SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
 
PL/SQL procedure successfully completed.
 
——查询分析结果
 
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';                                                                 
 
Session altered.
     
SQL> col username  for a10
SQL> col timestamp   for a10
SQL> col sql_redo  for a100

SQL> select username,scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') time1 ,sql_redo from v$logmnr_contents where username ='OWNER' order by time1 desc
 
USERNAME               SCN TIMESTAMP           SQL_REDO
--------------- ---------- ------------------- --------------------------------------------------
OWNER         1043876 2017-11-04 22:03:40
insert into "OWNER"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7499','ALLEN','SALESMAN','7698',TO_DATE('1981-02-20 00:00:00', 'yyyy-mm-dd hh24:mi:ss'),'1600','300','30');

OWNER         1043876 2017-11-04 22:03:40
insert into "OWNER"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7521','WARD','SALESMAN','7698',TO_DATE('1981-02-22 00:00:00', 'yyyy-mm-dd hh24:mi:ss'),'1250','500','30');

OWNER         1043876 2017-11-04 22:03:40
insert into "OWNER"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7566','JONES','MANAGER','7839',TO_DATE('1981-04-02 00:00:00', 'yyyy-mm-dd hh24:mi:ss'),'2975',NULL,'20');

OWNER         1043876 2017-11-04 22:03:40
insert into "OWNER"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7654','MARTIN','SALESMAN','7698',TO_DATE('1981-09-28 00:00:00', 'yyyy-mm-dd hh24:mi:ss'),'1250','1400','30');

——结束日志分析
 
SQL> execute dbms_logmnr.end_logmnr;                                                                                            
 
PL/SQL procedure successfully completed.
 
 
2) 对DDL 操作分析
 
SCOTT @ prod > drop  table  tb01;

Table dropped.

SCOTT @ prod > create table tb01(id int) tablespace users;

Table created.

SCOTT @ prod > insert into tb01 values(1);

1 row created.
 
SCOTT @ prod > commit;

Commit complete.
 
——设置logmnr 参数,存放数据字典文件

——查看日志信息

SQL> select name,sequence# from v$archived_log;
 
/u01/app/oracle/flash_recovery_area/PROD/archivelog/2013_03_01/o1_mf_1_44_8lz8xwqz_.arc
        44

/u01/app/oracle/flash_recovery_area/PROD/archivelog/2013_03_01/o1_mf_1_45_8lz9fqxg_.arc
        45

/u01/app/oracle/flash_recovery_area/PROD/archivelog/2013_03_01/o1_mf_1_46_8lzb48og_.arc
        46
   
SYS @ prod > select * from v$log;

GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1          1         46   52428800          1 YES INACTIVE                873198 01-MAR-13
         2          1         47   52428800          1 NO  CURRENT                 893931 01-MAR-13
         3          1         45   52428800          1 YES INACTIVE                872875 01-MAR-13

SYS @ prod > select group#,member from v$logfile;

GROUP# MEMBER
---------- --------------------------------------------------
         1 /u01/app/oracle/oradata/prod/redo01.log
         2 /u01/app/oracle/oradata/prod/redo02.log
         3 /u01/app/oracle/oradata/prod/redo03.log

——添加日志分析

SYS @ prod > execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/prod/redo02.log',options=>dbms_logmnr.new);

PL/SQL procedure successfully completed.
 
 
SYS @ prod > execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/flash_recovery_area/PROD/archivelog/2013_03_01/o1_mf_1_46_8lzb48og_.arc',options=>dbms_logmnr.addfile);

PL/SQL procedure successfully completed.
 
 
——执行分析
 
SYS @ prod >execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora',options=>dbms_logmnr.ddl_dict_tracking);
 
PL/SQL procedure successfully completed.
 
——查看分析结果
 
SYS @ prod >alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';                                                                 
Session altered.

SYS @ prod >select username,scn,timestamp,sql_redo from v$logmnr_contents  where username='SCOTT' and lower(sql_redo) like '%table%';
 
USERNAME          SCN TIMESTAMP           SQL_REDO
---------- ---------- ------------------- --------------------------------------------------
SCOTT          851229 2012-03-23 15:45:22 drop table tb01 purge;
SCOTT          851264 2012-03-23 15:45:45 create table tb01(id int) tablespace test;
 
 
SQL> execute dbms_logmnr.end_logmnr;
 
PL/SQL procedure successfully completed.
 
***********************************以上接案例2*****************************

logmnr使用的更多相关文章

  1. Oracle logmnr工具分析日志脚本

    在oracle:对logmnr工具分析日志这个不陌生:对数据恢复应用场景经常用到:这里为了方便对归档日志进行分析: 当然网上有一个logmnr界面的工具:感觉很人性化:下载需要积分:为此写一个脚本. ...

  2. 日志挖掘Logmnr

    日志挖掘 9.1 日志中数据用途 所有对用户数据以及数据字典的改变全部被保存在联机日志中.当然nologging,insert/*+append+/情况比较特殊除外,因此归档日志可以用来做数据库的恢复 ...

  3. DBA手记(学习) - LOGMNR 简单而强大的工具

    LOGMNR首先执行一个ddl(或dml)操作,以记录重做信息: SYS@ ora11g>conn scott/tigerConnected.SCOTT@ ora11g>alter sys ...

  4. LOGMNR分析redo log和archive log教程

    自Oracle 11g起,无需设置UTL_FILE_DIR就可以使用LOGMNR对本地数据库的日志进行分析,以下是使用LOGMNR的DICT_FROM_ONLINE_CATALOG分析REDO和归档日 ...

  5. 【Oracle】使用logmnr挖掘日志

    使用Logmnr挖掘日志的详细步骤如下: 1. 查看日志状态及位置 col member for a45 select group#,status from v$log; select group#, ...

  6. 通过LOGMNR查找程式带入的实际值

    生产库中出现了大量的锁表,需要得到当时程式执行的SQL以及其带入的值 1.查看SQL SELECT SQL_ID FROM V$SESSION WHERE SID=(SELECT FINAL_BLOC ...

  7. 通过logmnr找到被修改前的存储过程

    1.找到存储过程被修改时的归档日志 SELECT NAME FROM V$ARCHIVED_LOG WHERE FIRST_TIME BETWEEN TO_DATE('20191118080000', ...

  8. 记一次使用logmnr查找操作人流程

    经常遇到开发的需求,帮我查一下是谁修改了表里面的记录,是谁对表进行了DDL操作,此类问题可以使用logmnr解决 1.根据操作时间定位归档日志 SELECT name FROM V$ARCHIVED_ ...

  9. 使用logmnr方法找回被误删除Oracle的数据的脚本

    俗话说,常在河边走,哪有不湿鞋的.作为一个经常与数据库打交道的程序员,偶尔不小心误删除或误操作的数据也是在所难免的.如果是Oracle数据库,这里给您介绍一种从日志中找回数据的办法,下面这个地址是我以 ...

随机推荐

  1. Component 组件props 属性设置

    props定义属性并获取属性值 html <div id="app"> <!-- 注册一个全局逐渐 --> <!-- 注意如果自定义的属性带-像下面这 ...

  2. 在mybatis中resultMap与resultType的区别

    MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMapresultType是直接表示返回类型的,而resultMap则是对外部ResultMa ...

  3. 以结算价交易TAS和以市价交易TAM

    CME Group的合约规格中提到TAS和TAM交易,如:Gold Futures Contract Specs Gold 期货 合约规格 Trading at Settlement (TAS) is ...

  4. 使用openlayers 3 在线加载天地图及GeoServer发布的地图

    使用openlayers3来加载天地图卫星图和标注图层,GeoServer发布地图,一并用openlayers测试加载出来,顺便实现了7种地图控件.下面直接贴代码: <!DOCTYPE html ...

  5. 简单Promise回顾

    1:传统的CallBack回调函数let ajax=function(callback){ //dosomething this.setTimeout(()=>{ callback&&a ...

  6. FreeCodeCamp----Intermediate Algorithm Scripting解法

    Finders Keepers 写一个 function,它浏览数组(第一个参数)并返回数组中第一个通过某种方法(第二个参数)验证的元素. 如果你被卡住了,记得开大招 Read-Search-Ask. ...

  7. IDEA @Autowired 出现红色下划线 报红

    例如: 解决方法:

  8. svn的使用教程

    引言:这里只讲解几个svn不常用但是非常有用的使用方法,对于经常使用的不做概述,因为很简单,而且网上都能找到. 1.1 svn历史版本对比已经恢复到指定版本(myeclipse) 在项目中的文件或者文 ...

  9. Ado.net之存储过程的使用【三】

    重点是红色标记区域的代码,设置本次执行的是存储过程,如果不设置,默认操作的是sql语句 private void LoadData() { string constr = @"databas ...

  10. linq to sql and linq to object 总结

    Enumable类型是linq to object   是一个很特殊的类型   这个类型的数据源都是在程序的内存中 Queryable类型是 Linq to sql   对数据库进行操作都是这个类型  ...