ITPub博客

首页 > 数据库 > Oracle > LogMiner工具使用学习

LogMiner工具使用学习

原创 Oracle 作者:FIGHT_ANGEL 时间:2016-04-08 16:04:48 0 删除 编辑
LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle 重做日志文件(归档日志文件)中的具体内容,LogMiner分析工具实际上是由一组PL/SQL包和一些动态视图组成,可以通过它分析在线日志和归档日 志获取数据库过往详细、具体的操作,非常有用。

使用LogMiner的原因:
1、当数据库发生了误操作,需要不完全恢复,为确认误操作准确的时间点或SCN号,此时需用到LogMiner。
2、传统恢复一个上TB或是恢复一个几百GB表空间中的一个小表,标准的操作是把整个表空间恢复到之前的状态,然后再应用归档日志,加上搭建恢复环境的时间,整个时间会很长。
通过LogMiner可以换一种恢复思维,能通过它解析到这个表上所有的DML操作,可以做反向修复。合理的使用会大幅降低此情况恢复的复 杂度和时间。

3、可以把LogMiner当成最强大的数据库审计工具。

4、在过去的某个时间数据库很忙或是产生了大量的归档日志,通过LogMiner可以知道是哪些操作,哪个表占比较大,主要矛盾在哪。

下面的范例环境是11G R2,数据库为归档模式。

准备工作:

1、设置数据库为追加日志模式 (默认是Minimal),否则无法跟踪到DML语句

  1. SQL> show user
  2. USER is "SYS"

  3. SQL> alter database add supplemental log data;
  4. Database altered.

  5. SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;  

    SUPPLEME
    --------
    YES
2、创建测试用户 U_LOG,并授予权限
  1. SQL> create user u_log identified by u_log default tablespace yjk_data;
  2. User created.

  3. SQL> grant connect,resource,create table to u_log;
  4. Grant succeeded.

  5. SQL> grant select_catalog_role,execute_catalog_role to u_log;
  6. Grant succeeded.

  7. SQL> grant select any transaction to u_log;
  8. Grant succeeded.

  9. SQL> grant execute on dbms_flashback to u_log;
  10. Grant succeeded.
3、使用 U_LOG 用户登录,创建测试表 TT,并初始化数据
  1. SQL> conn u_log/u_log
  2. Connected.

  3. SQL> create table tt(tt_id int,tt_name varchar2(200));
  4. Table created.

  5. SQL> insert into tt select rownum,'ttname'||rownum from dual connect by rownum<11;
  6. 10 rows created.

  7. SQL> commit;

  8. SQL> select * from tt;

         TT_ID TT_NAME
    ---------- --------------------
             1 ttname1
             2 ttname2
             3 ttname3
             4 ttname4
             5 ttname5
             6 ttname6
             7 ttname7
             8 ttname8
             9 ttname9
            10 ttname10

    10 rows selected.
4、查询当前redo log file,和当前SCN号
  1. SQL> select MEMBER from v$logfile where group# in (select group# from v$log where status ='CURRENT');

    MEMBER
    ----------------------------------------
    /u01/oradata/orcl/redo03.log
  2. SQL> select dbms_flashback.get_system_change_number from dual;

    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
                     7841296
5、模拟用户误操作,删除tt_id为 7 的数据
  1. SQL> delete from tt where tt_id=7;
  2. 1 row deleted.

  3. SQL> commit;
  4. Commit complete.
6、查询操作之后的SCN号
  1. SQL> select dbms_flashback.get_system_change_number from dual;

    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
                     7841309

使用
logminer尝试找到误操作的数据,并恢复。

7、添加联机重做日志文件(可以添加多个归档日志文件)
  1. SQL> exec dbms_logmnr.add_logfile(logfilename => '/u01/oradata/orcl/redo03.log', options => dbms_logmnr.new);

  2. PL/SQL procedure successfully completed.

8、开始LogMiner,这里使用了SCN的区间,不指定的话就是整个redo log file的内容
  1. SQL> exec dbms_logmnr.start_logmnr(options => dbms_logmnr.dict_from_online_catalog,startscn => 7841296,endscn => 7841309);

  2. PL/SQL procedure successfully completed.

9、logminer提取的日志信息会格式化后存放在视图v$logmnr中,此视图只对当前会话有效,所以转存到表tt_logminer中
  1. SQL> create table tt_logminer nologging  as select * from v$logmnr_contents;

  2. Table created.
10、结束LogMiner
  1. SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();

  2. PL/SQL procedure successfully completed.
11、查询结果表 tt_logminer,查看误操作的用户,登录机器等信息
  1. SQL> select scn,USERNAME,os_username,machine_name, SQL_REDO, SQL_UNDO   from tt_logminer where seg_owner='U_LOG' and seg_name='TT';

           SCN USERNAME   OS_USERNAM MACHINE_NA SQL_REDO                                                       SQL_UNDO
    ---------- ---------- ---------- ---------- ------------------------------------------------------------   ----------------------------------------
       7841306 U_LOG      oracle     silent     delete from "U_LOG"."TT" where "TT_ID" = '7' and "TT_NAME" =   insert into "U_LOG"."TT"("TT_ID","TT_NAM
                                                 'ttname7' and ROWID = 'AAAWBIAAHAAAACUAAG';                   E") values ('7','ttname7');

至此:可以例如 SQL_UNDO 的脚本恢复数据


有用的选项:

1、COMMITTED_DATA_ONLY
顾名思义就是只显示已经提交了的,那些正在进行中的及Oracle内部操作都忽略掉了,5的举例里使用的就是这个选项。

  1. SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.COMMITTED_DATA_ONLY); 
2、NO_ROWID_IN_STMT
在SQL_REDO和SQL_UNDO列语句中去掉ROWID。

  1. SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.NO_ROWID_IN_STMT + DBMS_LOGMNR.DICT_FROM_REDO_LOGS);


动态性能视图

  1. V$LOGMNR_LOGS 添加的需解析的日志列表
  2. V$LOGMNR_CONTENTS 解析结果





来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28909249/viewspace-2077507/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-10-26

  • 博文量
    4
  • 访问量
    10574