Sometimes, we should recover one or more rows data which is deleted carelessly by users, but it is not necessary to recover the whole db and the flashback does not recovery the data because it's timeout.

For this moment, we should mine the log file to find the redo or undo data to recover the loss data and  find who delete the data.
How to use the log miner?

After oracle 9i, oracle provides a tool to mine the log file, there is a package of oracle dbms for the logmnr named dbms_logmnr. 

Make sure the db is archive log mode

SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination +FAR/arch1
Oldest online log sequence 833
Next log sequence to archive 834
Current log sequence 834
SQL> Example of log miner analyze procedure:
SQL>
SQL> create table test(id number); Table created. SQL> insert into test values(1); 1 row created. SQL> / 1 row created. SQL> / 1 row created. SQL> commit; Commit complete. SQL> begin
2 for i in 1..100 loop
3 insert into test values(i);
4 commit;
5 end loop;
6 end;
7 / PL/SQL procedure successfully completed. Switch log file by user system SQL> alter system switch logfile; System altered. SQL> Engine the log miner. select name, thread#, sequence#, first_change#, next_change# from V$ARCHIVED_LOG;
NAME THREAD# SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
-------------------- ---------- ---------- ------------- ------------
1 831 4062556971 4064186822
2 634 4063922165 4064177226
2 635 4064177226 4064275220
2 636 4064275220 4064429426
1 832 4064186822 4066775319
+FAR/arch1/1_833_817 1 833 4066775319 4066914873
620325.dbf +FAR/arch1/1_834_817 1 834 4066914873 4071821640
620325.dbf NAME THREAD# SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
-------------------- ---------- ---------- ------------- ------------
+FAR/arch2/2_637_817 2 637 4064429426 4071821645
620325.dbf SQL> exec dbms_logmnr.add_logfile(logfilename=>'+FAR/arch1/1_834_817620325.dbf', options=>dbms_logmnr.new); PL/SQL procedure successfully completed. SQL> options: dbms_logmnr.new stand for the first log file to be analyzed. SQL> exec dbms_logmnr.start_logmnr(options => sys.dbms_logmnr.dict_from_online_catalog); PL/SQL procedure successfully completed. SQL> select scn, timestamp, seg_name, seg_owner, sql_redo, sql_undo from v$logmnr_contents where seg_name='TEST' and set_owner='RAY'; SCN TIMESTAMP SEG_NAME SEG_OWNER SQL_REDO SQL_UNDO
---------- --------- ---------- ---------- ---------------------------------------- ----------------------------------------
4071818078 11-SEP-13 TEST RAY create table test(id number);
4071818819 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '1
1'); ' and ROWID = 'AAAY8eAAFAAABbNAAA'; 4071818840 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '1
1'); ' and ROWID = 'AAAY8eAAFAAABbNAAB'; 4071818851 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '1
1'); ' and ROWID = 'AAAY8eAAFAAABbNAAC'; 4071819125 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '1 SCN TIMESTAMP SEG_NAME SEG_OWNER SQL_REDO SQL_UNDO
---------- --------- ---------- ---------- ---------------------------------------- ----------------------------------------
1'); ' and ROWID = 'AAAY8eAAFAAABbNAAD'; 4071819127 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '2
2'); ' and ROWID = 'AAAY8eAAFAAABbNAAE'; 4071819129 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '3
3'); ' and ROWID = 'AAAY8eAAFAAABbNAAF'; 4071819131 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '4
4'); ' and ROWID = 'AAAY8eAAFAAABbNAAG'; ............... SCN TIMESTAMP SEG_NAME SEG_OWNER SQL_REDO SQL_UNDO
---------- --------- ---------- ---------- ---------------------------------------- ---------------------------------------- 4071819228 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '5
53'); 3' and ROWID = 'AAAY8eAAFAAABbNAA3'; 4071819231 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '5
54'); 4' and ROWID = 'AAAY8eAAFAAABbNAA4'; 4071819233 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '5
55'); 5' and ROWID = 'AAAY8eAAFAAABbNAA5'; 4071819235 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '5 SCN TIMESTAMP SEG_NAME SEG_OWNER SQL_REDO SQL_UNDO
---------- --------- ---------- ---------- ---------------------------------------- ----------------------------------------
56'); 6' and ROWID = 'AAAY8eAAFAAABbNAA6'; 4071819237 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '5
57'); 7' and ROWID = 'AAAY8eAAFAAABbNAA7'; 4071819239 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '5
58'); 8' and ROWID = 'AAAY8eAAFAAABbNAA8'; 4071819241 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '5
59'); 9' and ROWID = 'AAAY8eAAFAAABbNAA9'; SCN TIMESTAMP SEG_NAME SEG_OWNER SQL_REDO SQL_UNDO
---------- --------- ---------- ---------- ---------------------------------------- ----------------------------------------
4071819243 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '6
60'); 0' and ROWID = 'AAAY8eAAFAAABbNAA+'; 4071819244 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '6
61'); 1' and ROWID = 'AAAY8eAAFAAABbNAA/'; 4071819247 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '6
62'); 2' and ROWID = 'AAAY8eAAFAAABbNABA'; 4071819249 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '6
63'); 3' and ROWID = 'AAAY8eAAFAAABbNABB'; ...........
SCN TIMESTAMP SEG_NAME SEG_OWNER SQL_REDO SQL_UNDO
---------- --------- ---------- ---------- ---------------------------------------- ----------------------------------------
78'); 8' and ROWID = 'AAAY8eAAFAAABbNABQ'; 4071819285 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '7
79'); 9' and ROWID = 'AAAY8eAAFAAABbNABR'; 4071819288 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '8
80'); 0' and ROWID = 'AAAY8eAAFAAABbNABS'; 4071819290 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '8
81'); 1' and ROWID = 'AAAY8eAAFAAABbNABT'; SCN TIMESTAMP SEG_NAME SEG_OWNER SQL_REDO SQL_UNDO
---------- --------- ---------- ---------- ---------------------------------------- ----------------------------------------
4071819292 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '8
82'); 2' and ROWID = 'AAAY8eAAFAAABbNABU'; 4071819294 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '8
83'); 3' and ROWID = 'AAAY8eAAFAAABbNABV'; 4071819296 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '8
84'); 4' and ROWID = 'AAAY8eAAFAAABbNABW'; 4071819298 11-SEP-13 TEST RAY insert into "RAY"."TEST"("ID") values (' delete from "RAY"."TEST" where "ID" = '8
85'); 5' and ROWID = 'AAAY8eAAFAAABbNABX'; SQL> exec dbms_logmnr.end_logmnr; PL/SQL procedure successfully completed.

For oracle log miner, we should pay attention to another main points.

A shallow summary of oracle log miner的更多相关文章

  1. oracle之二日志挖掘log miner

    日志挖掘 log miner 6.1 log miner的作用: 数据库恢复中有时会需要对Redo log进行分析, 要会使用log miner,以便确定要恢复的时间点或SCN 6.2 有两种日志挖掘 ...

  2. Oracle Log Block Size

    Although the size of redo entries is measured in bytes, LGWR writes the redo to the log files on dis ...

  3. ORACLE LOG的管理

    CREATE OR REPLACE PACKAGE PLOG IS /** * package name : PLOG *<br/> *<br/> *See : <a h ...

  4. oracle关闭监听log.xml文件生成步骤

    1.查看sqlnet.ora文件是否存在 cd $ORACLE_HOME/network/admin ls 如果不存在,copy一个过来 cp samples/sqlnet.ora . 2.修改sql ...

  5. Oracle【IT实验室】数据库备份与恢复之四:RMAN(备份与恢复管理器)

    RMAN是ORACLE提供的一个备份与恢复的工具,可以用来备份和还原数据库文件. 归档日志和控制文件.它也可以用来执行完全或不完全的数据库恢复. RMAN可以由命令行接口或者 OEM的 Backup ...

  6. oracle已知会导致错误结果的bug列表(Bug Issues Known to cause Wrong Results)

    LAST UPDATE:     1 Dec 15, 2016 APPLIES TO:     1 2 3 4 Oracle Database - Enterprise Edition - Versi ...

  7. oracle共享与专用模式的动态转换及区别(转载)

    一直没对专用于共享的互换搞清楚,找到了这篇文章 http://blog.csdn.net/tianlesoftware/archive/2010/06/26/5695784.aspx ,让我实践了一把 ...

  8. Oracle备份之RMAN

    1.备份:物理备份时文件层次的备份,逻辑备份时数据层次的备份,物理备份为主,逻辑备份作为补充.物理备份分为用户管理备份和RMAN备份,前者使用SQL命令和OS的cp命令进行文件备份,后者使用RMAN工 ...

  9. oracle rac理解和用途扩展

    Oracle RAC的优势在于利用多个节点(数据库实例)组成一个数据库,这样在保证了数据库高可用性的情况下更充分的利用了多个主机的性能,而且可以通过增加节点进行性能的扩展.实现Oracle RAC需要 ...

随机推荐

  1. discuz_style_default.xml修改

    首先我们需要在template/文件夹下新建一个yourstyle文件夹放置模板文件,然后复制default下的discuz_style_default.xml,重命名为discuz_style_你的 ...

  2. Node Node

    http://www.nodejs.org/ http://outofmemory.cn/code-snippet/1403/node-javascript-classic-introduction- ...

  3. Hibernate 知识提高

    主键生成策略有: UUID,increment.Hilo.assigned:对数据库无依赖 identity:依赖Mysql或sql server,主键值不由hibernate维护 sequence: ...

  4. Romantic(裸扩展欧几里德)

    Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. MySQL的字段设计

    1.尽量使用数字,因为文本占空间,不利于查询(针对有限种类文本)

  6. 【原】Spring和Dubbo整合案例和过程

    Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模 ...

  7. 关于PagedDataSource分页属性与DataSet和DataTable详解

    Asp.net提供了三个功能强大的列表控件:DataGrid.DataList和Repeater控件,但其中只有DataGrid控件提供分页功能.相对DataGrid,DataList和Repeate ...

  8. (IOS)签名Demo

    思路是将每一次按下屏幕的touch move时的点存到一个数组里,即一个数组相当于一个笔画:再将该代表笔画的数组保存到一个大数组中,每组每次touch的移动都历遍大数组和笔画数组,将点于点之间连接起来 ...

  9. Week13(12月5日):不怕错误,慢慢来 :)

    Part I:提问 =========================== 1.ASP.NET MVC的最新版本是(      ). A.2    B.3    C.4   D.5 2.本学期授课中使 ...

  10. android获取系统wifi状态等

    WIFI 获取WIFI状态 WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); ...