zoukankan      html  css  js  c++  java
  • Using Logminer analyze redo log

            有时候,某个用户无意间drop了一张表,或者是truncate一张表,delete 忘加where,update 忘加 where, 这个时候们就可能执行不完全恢复,或者进行数据库的flashback.但是我们怎么能知道他干坏事的具体时间呢?只要redo log 存在,我们就能通过logminer这个工具找到干坏事的具体时间,然后执行不完全恢复,恢复数据库到干坏事之前的那一时刻。又或者公司领导提出要求,我要查看某个人在某个时间干了什么事情,只要redo log 存在,我们都能够通过logminer查看到某个人做的所有事情。

            使用Logminer的步骤(10gr2,数据库处于online,archive 状态,并且数据库对象不会被更改):

    这是一个很简单的实验,首先用户robinson有一个test表,表结构和数据如下

    SQL> show user;
    USER 为 "ROBINSON"

    SQL> select * from test;

    NAME       ADDRESS
    ---------- ----------
    luobingsen China
    robinson   ChongQing

    为了进行试验,我删除这个表中的数据

    SQL> delete from test;

    已删除2行。

    SQL> commit;

    提交完成。

    下面用logminer来查看robinson干坏事的准确时间

    1.查看是否给数据库添加了追加日志的功能

    SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

    SUPPLEME
    --------
    NO        ---默认为no,如果为no,使用如下语句添加日志追加功能

    SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;   -----如果不启用日志追加,就无法查看DML,只能查看DDL

    数据库已更改。

    2.以sys用户执行以下脚本

    SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( -
    > STARTTIME => to_date('2009-11月-5 17:00:00','YYYY-MON-DD HH24:MI:SS'), -
    > ENDTIME => sysdate, -
    > OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + -
    > DBMS_LOGMNR.PRINT_PRETTY_SQL + -
    > DBMS_LOGMNR.CONTINUOUS_MINE + -
    > DBMS_LOGMNR.NO_ROWID_IN_STMT);

    PL/SQL 过程已成功完成。

    3.查看v$logmnr_contents视图,得到robinson 干坏事的时间和干了什么坏事情

    SQL> select username ,operation,sql_redo,sql_undo,SCN from v$logmnr_contents where seg_owner='ROBINSON';

    USERNAME   OPERATION  SQL_REDO                                        SQL_UNDO                                     SCN
    ---------- ---------- ------------------------------                         ------------------------------                      -------
    ROBINSON   DELETE     delete from "ROBINSON"."TEST"          insert into "ROBINSON"."TEST"    625126
                           where                                                                           values
                              "NAME" = 'luobingsen' and                      "NAME" = 'luobingsen',
                                                                                                       "ADDRESS" = 'China';
                              "ADDRESS" = 'China';

    ROBINSON   DELETE     delete from "ROBINSON"."TEST"            insert into "ROBINSON"."TEST"   625126
                           where                                                                             values
                              "NAME" = 'robinson' and                                "NAME" = 'robinson',
                              "ADDRESS" = 'ChongQing';                          "ADDRESS" = 'ChongQing';
    可以看到干的坏事情是delete操作,干坏事情的具体SCN为625126,可以把scn转换为timestamp

    SQL> select scn_to_timestamp('625126') from dual;

    SCN_TO_TIMESTAMP('625126')
    ---------------------------------------------------------------------------
    05-11月-09 05.36.42.000000000 下午

    这个时候我们就可以利用备份,或者使用闪回功能,将数据库闪回到09年11月5日下午5点36分42秒之前,或者,我们可以执行

    sql_undo的语句,将数据还原回去。

    这里只是简单介绍Logminer,详细信息和用法请参考官方文档Utilities

  • 相关阅读:
    [java]java String.split()函数的用法分析
    [sql]java.sql.Types的具体对应值(jdbcType)
    [sql]join的5种方式:inner join、left(outer) join、right (outer) Join、full(outer) join、cross join
    [java]String和Date、Timestamp之间的转换
    [Eclipse]保存java文件时,自动删除不需要的包import
    [postgresql]ROWS is not applicable when function does not return a set问题解决
    [postgreSql]postgreSql数据库、模式、表、函数的删除与创建
    zbb20170816 oracle Oracle 查看表空间、数据文件的大小及使用情况sql语句
    zbb20170811 mysql远程连接报错: Host * is not allowed to connect to this MySQL server,解决方法
    zbb20170811 linux 给用户授予文件夹权限
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330686.html
Copyright © 2011-2022 走看看