`
streamsong
  • 浏览: 79595 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用闪回、logmnr找回误删除的数据

阅读更多

朋友遇到了非常经典的ORACLE事故——误删除,开发人员告诉他,昨天下午五点-六点不小心误删了几条数据,问是否可以恢复,朋友的环境是ORACLE 10gR2,没有备份,但有开归档和闪回,这个是可以找回数据的。
以下为找回误删除数据的实验。
SQL> create table t1(id number,name varchar2(20));
Table created
SQL> insert into t1 values(1,'zhangsan');
1 row inserted
SQL> insert into t1 values(2,'zhangsi');
1 row inserted
SQL> insert into t1 values(3,'zhangwu');
1 row inserted
SQL>  commit;
Commit complete
删除部分数据,并记录SCN。
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
    4354137
SQL> delete from t1 where id=3;
1 row deleted
SQL> commit;
Commit complete
创建一张大表,用于测试。
SQL> create table t2 as select * from dba_objects;
Table created
SQL> INSERT INTO T2 SELECT * FROM T2;
75068 rows inserted
SQL> /
150136 rows inserted
SQL> /
300272 rows inserted
SQL> /
600544 rows inserted
对T2表做大量的update操作,模拟回滚段被回收。
UPDATE T2 SET OWNER=OWNER,OBJECT_NAME=OBJECT_NAME,SUBOBJECT_NAME=SUBOBJECT_NAME,OBJECT_ID=OBJECT_ID,
DATA_OBJECT_ID=DATA_OBJECT_ID,OBJECT_TYPE=OBJECT_TYPE,CREATED=CREATED,LAST_DDL_TIME=LAST_DDL_TIME,
TIMESTAMP=TIMESTAMP,STATUS=STATUS,TEMPORARY=TEMPORARY,GENERATED=GENERATED,SECONDARY=SECONDARY,
NAMESPACE=NAMESPACE,EDITION_NAME=EDITION_NAME;
已更新1201104行。
SQL> /
已更新1201104行。
SQL> /
已更新1201104行。
SQL> /
已更新1201104行。
SQL> /
已更新1201104行。
SQL> /
已更新1201104行。
如果回滚段足够大,此时可以查询到SCN4354137之前的信息。
SQL> select * from t1 as of scn 4354137;
ID         NAME
---------- --------------------
         1 zhangsan
         2 zhangsi
         3 zhangwu
此时可以使用闪回表技术找回数据。
SQL> flashback table t1 to scn 4354137;
闪回完成。
SQL> select * from t1;
        ID NAME
---------- --------------------
         1 zhangsan
         2 zhangsi
         3 zhangwu
如果回滚段不够大,回滚段SCN4354137之前的空间将被回收,此时将无法查询SCN4354137之前的信息。
SQL> select * from t1 as of scn 4354137;
select * from t1 as of scn 4354137
ORA-01555: 快照过旧: 回退段号 8 (名称为 "_SYSSMU8_2456689326$") 过小
此时如果数据库开闪回,并且误删除的时间在db_flashback_retention_target参数范围内,可以利用闪回数据库技术,将整个数据库回退到之前的状态。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area  313860096 bytes
Fixed Size                  1374304 bytes
Variable Size             201328544 bytes
Database Buffers          104857600 bytes
Redo Buffers                6299648 bytes
数据库装载完毕。
SQL> flashback database to scn 4354137;
闪回完成。
SQL> alter database open resetlogs;
数据库已更改。
SQL> select * from t1;
        ID NAME
---------- --------------------
         1 zhangsan
         2 zhangsi
         3 zhangwu
如果误删除的时间超出了db_flashback_retention_target参数的范围,可能数据库无法闪回到scn 4354137状态,即使可以闪回到误删除之前的状态,无论是闪回表还是闪回数据库,必然对scn 4354137之后的操作有影响,闪回表到scn 4354137,scn 4354137之后对这个表所做的所有操作都将回退,如果是闪回数据库,整个数据库scn 4354137之后的操作都将被回退。误删除的数据重要,误删除之后的数据也重要,这时候如果选择闪回技术就要权衡哪个更重要的问题啦,还好ORACLE自8i开始,推出了LOGMNR日志分析工具,借用     LOGMNR工具,可以在不影响其他数据的同时找回误删除的数据。
初次使用,需要安装,很简单,只需要执行以下2个脚本即可。
SQL> conn / as sysdba
已连接。
SQL> @?/rdbms/admin/dbmslm
程序包已创建。
授权成功。
同义词已创建。
SQL> @?/rdbms/admin/dbmslmd
程序包已创建。
同义词已创建。
查看utl_file_dir设置
SQL> show parameter utl_file
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir                         string      D:\oracle\arch
可以通过命令行修改此参数,也可以通过修改pfile文件设置此参数。
SQL> alter system set utl_file_dir='D:\oracle\arch' scope=spfile;
系统已更改。
该参数为静态参数,需重启数据库后生效。
创建LOGMNR数据字典。
SQL> exec dbms_logmnr_d.build(dictionary_filename => 'dict.ora',dictionary_location => 'd:\oracle\arch');
PL/SQL 过程已成功完成。
添加需要分析的归档日志。
SQL> exec dbms_logmnr.add_logfile(LogFileName =>'D:\oracle\arch\O1_MF_1_117_79SR4KVR_.ARC',Options => dbms_logmnr.new);
PL/SQL 过程已成功完成。
开始日志挖掘,分析日志。
SQL> execute dbms_logmnr.start_logmnr (DictFileName => ’G:\oracle\logs\dict.ora’);
PL/SQL procedure successfully completed
查看日志信息
SQL> select SCN,OPERATION,SEG_OWNER, TABLE_NAME,SEG_TYPE_NAME, SQL_REDO,SQL_UNDO from v$logmnr_contents where scn>5533530 and scn<5533541 and sql_redo like'delete%';
SCN:4354137
OPERATION:DELETE
SEG_OWNER:STREAM
TABLE_NAME:T1
SEG_TYPE_NAME:TABLE
SQL_REDO:delete from "STREAM"."TEST01" where "ID" = '3' and "NAME" = 'zhangwu'
SQL_UNDO:insert into "STREAM"."TEST01"("ID","NAME") values ('3','zhangwu');
SQL_REDO即之前做的模拟误删除的操作,SQL_UNDO就是还原应该做的操作,ORACLE LOGMNR工具真的是很黄很暴力。

 

0
0
分享到:
评论

相关推荐

    oracle使用logmnr找回误删数据.rar

    oracle使用logmnr找回误删数据

    LOGMNR详解

    LOGMNR

    dbms_logmnr使用

    dbms_logmnr使用

    在oracle中Logmnr进行日志挖掘

    在oracle中Logmnr进行日志挖掘

    logmnr日志挖掘技术

    logmnr日志挖掘,分析redo里面做了哪些操作,可以显示出语句

    [保留] 日志分析logmnr使用方法_分享 - ChinaUnix_net

    oracle 日志

    DBMS_LOGMNR中的常量选项

    DBMS_LOGMNR包包含多种枚举常量。这些常量使用时必须以DBMS_LOGMNR为前缀。 NEW 隐式调用DBMS_LOGMNR.END_LOGMNR存储过程结束当前的logminer session然后创建一个新的session。新session从指定的redo日志文件开始...

    Oracle数据库中数据丢失的几种恢复方法

    根据oracle数据库的特点和提供的工具,主要方法有以下几种方法:利用逻辑备份使用import工具丢失数据的表利用物理备份来通过还原数据文件并进行不完全恢复利用dbms_logmnr包从redolog文件中恢复利用flashback特性...

    ORACLE日志丢失的恢复

    2.删除旧的日志组 alter database drop logfile group 1; alter database drop logfile group 2; alter database drop logfile group 3; 3.日志文件的丢失正常关闭. 方法一:使用alter database clear logfile ...

    logmnr来分析归档日志操作.txt

    数据库必须是归档模式,使用本地的在线数据字典分析归档日志

    Oracle数据库数据丢失恢复的几种方法总结

    利用dbms_logmnr包从redo log文件中恢复 利用flashback特性恢复数据 前提 为了方便使用方法的介绍,上述恢复方法都将基于以下场景进行:系统管理员在前一天晚上11点用export对数据库做了全库逻辑备份,然后对所有...

    oracle复习1

    1. 查明数据库的改变登记:能够用 Logmnr 来分析这些事务,看看究竟发生了些什么事情 2. 找回丢失的数据,当不能利用 flashback 时候,能够利用

    timeSelect.rar

    简单的单日时间段事件配置 vue组件,可以通过拖拉的方式去配置时间段。 css的事情就交给你们了, 代码很简单, 单纯的对数组进行操作。随便扩展吧。

    DB_monitor.rar

    EXECUTE dbms_logmnr.start_logmnr(DictFileName=&gt;'D:\temp\orcldict.ora', StartTime=&gt;to_date('2008-06-03 18:00:00','YYYY-MM-DD HH24:MI:SS'), EndTime=&gt;to_date('2008-06-03 19:59:59','YYYY-MM-DD HH24:MI:SS'...

    Oracle通过LogMiner实现数据同步迁移

    最近在研究如何实现Oracle数据库之间的数据同步,网上的资料确实比较少。最好用的Oracle数据库同步工具是:GoldenGate ,而GoldenGate是要收费的。那么还有什么好的办法来同步Oracle的数据吗?没错,就是使用...

    通过LogMiner包监控正在运行的sql

    如何跟踪某应用下发生的sql操作细节,可参考另一篇(看不到绑定变量的具体值但更简单)。 一、安装Oracle LogMiner包: .../rdbms/admin/dbmslmd.sql --用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。

    加强数据库oracle日志的记录

    Oracle数据库使用LOGMINER来分析日志。  一、安装LogMiner  要安装LogMiner工具,必须首先要运行下面这样两个脚本, ...第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。  二、使用LogMiner工具 ……

    ORACLE之常用FAQ V1.0(整理)

    [Q]怎么样利用游标更新数据 4 [Q]怎样自定义异常 4 [Q]十进制与十六进制的转换 4 [Q]怎么样抽取重复记录 5 [Q]怎么样设置自治事务 5 [Q]怎么样在过程中暂停指定时间 5 [Q]怎么样快速计算事务的时间与日志量 5 [Q]...

    Oracle Logminer

    Logminer是oracle从8i开始提供的用于分析重做日志信息的工具,它包括DBMS_LOGMNR和DBMS_LOGMNR_D两个package,后边的D是字典的意思。它既能分析redo log file,也能分析归档后的archive log file。在分析日志的过程...

    精通Oracle.10g.PLSQL编程

    使用SQL语句 4.1 使用基本查询 4.1.1 简单查询语句 4.1.2 使用WHERE子句 4.1.3 使用ORDERBY子句 4.2 使用DML语句 4.2.1 插入数据 4.2.2 更新数据 4.2.3 删除数据 4.3 ...

Global site tag (gtag.js) - Google Analytics