`

闪回删除(Flashback drop)

阅读更多

大家在平时开发中,有时意外的删除过表,可能就是直接重新创建该表。在oracle10g中,可以用Flashback drop恢复用一个被删除(drop)了的对象,oracle自动将该对象放入回收站。Flashback drop恢复的原理也是利用oracle的回收站来恢复被删除(drop)的对象。

回收站,是一个虚拟的容器,用于存放所有被删除的对象。其实,对于一个对象的删除,数据库仅仅是简单的重命名操作。

数据库参数recyclebin设置为on.(即默认设置)。参数recyclebin为on,则表示把Drop的对象放入回收站。为off,则表示直接删除对象而不放入回收站。

查看recyclebin值命令如:

SQL> show parameter bin;

NAME                         TYPE       VALUE

------------------------------------ ----------- ------------------------------

recyclebin                        string     on

在系统或会话级别中修改参数recyclebin值的命令为:

SQL>alter system set recyclebin = on|off;

SQL>alter session set recyclebin = on|off;

查看回收站的相关信息视图有:recyclebin/user_recyclebin/dba_recyclebin.

手动清除回收站的信息为:purge recyclebin(或purge table original_name);

删除一张表而不想放入回收站的命令为:drop table table_name purge;

示例1:

1.查看用户下回收站的信息,此时回收站为空

SQL>selectOBJECT_NAME,ORIGINAL_NAME,TYPEfromuser_recyclebin;
OBJECT_NAME                   ORIGINAL_NAME TYPE           
------------------------------ ------------- ------
2.
创建测试表tab_test,并为该表增加ind_test索引
SQL>createtabletab_testasselect*fromall_objects;
Tablecreated
SQL>createindexind_testontab_test(object_id);
Indexcreated

SQL> select count(*) from tab_test;

 COUNT(*)

----------

    40699
3
。用drop命令删除tab_test表
SQL>droptabletab_test;

Tabledropped
4。查看用户回收站信息,此时会记录删除后的对象在回收站中的相关信息,此时还能正常操作回收站中的对象,但不能操作DDL/DML语句
SQL>selectOBJECT_NAME,ORIGINAL_NAME,TYPEfromuser_recyclebin;

OBJECT_NAME                   ORIGINAL_NAME TYPE           
------------------------------ ------------- ------
BIN$a+iPOcq+QXiwUT8B3c3QoA==$0 IND_TEST      INDEX                    
BIN$zFJjV8zFSlqbLecXbDeANQ==$0 TAB_TEST      TABLE                   

SQL>selectcount(*)from"BIN$zFJjV8zFSlqbLecXbDeANQ==$0";

 COUNT(*)
----------
    
40699

SQL>deletefrom"BIN$zFJjV8zFSlqbLecXbDeANQ==$0";

deletefrom"BIN$zFJjV8zFSlqbLecXbDeANQ==$0"
ORA-
38301:无法对回收站中的对象执行DDL/DML

5.用flashback恢复表到删除之前的状态
SQL>flashbacktabletab_testtobeforedrop;
Done

SQL> select count(*) from tab_test;

 COUNT(*)

----------

    40699

6.恢复表的索引(此时表中的索引同时也被恢复了,只不过该索引还是保留回收站中的索引名称)

SQL> select index_name from user_indexes where table_name = 'TAB_TEST';

INDEX_NAME

------------------------------

BIN$a+iPOcq+QXiwUT8B3c3QoA==$0

SQL> alter index "BIN$a+iPOcq+QXiwUT8B3c3QoA==$0" rename to ind_test;

Index altered

SQL> select index_name from user_indexes where table_name = 'TAB_TEST';

INDEX_NAME

------------------------------

IND_TEST

示例2:

1.查看用户下回收站的信息,此时回收站为空

SQL>selectOBJECT_NAME,ORIGINAL_NAME,TYPEfromuser_recyclebin;
OBJECT_NAME                   ORIGINAL_NAME TYPE           
------------------------------ ------------- ------
2.
创建测试表test1,并输入数据
SQL> create table test1(id number);

Table created

SQL> insert into test1 values(1);

1 row inserted

SQL> insert into test1 values(2);

1 row inserted

SQL> insert into test1 values(3);

1 row inserted

SQL> insert into test1 values(4);

1 row inserted

SQL> commit;

Commit complete

SQL> select count(*) from test1;

 COUNT(*)

----------

        4

3.删除test1表,然后在重新创建test1表

SQL> drop table test1;

Table dropped

SQL> create table test1(id number);

Table created

SQL> insert into test1 values(1);

1 row inserted

SQL> commit;

Commit complete

SQL> select count(*) from test1;

 COUNT(*)

----------

        1

4.再次删除test1表

SQL> drop table test1;

Table dropped

5.查询回收站信息(此时回收站中有两条test1表的数据)

SQL>select*fromuser_recyclebin;

OBJECT_NAME                   ORIGINAL_NAME  TYPE                     
------------------------------ --------------------
BIN$Uk69X077TQWqQ0OQ3u1FdQ==$0 TEST1         TABLE                   
BIN$kpG5ZWdlRUi/jO6X0EYP+A==$0 TEST1         TABLE 

5.用flashback恢复表到删除之前的状态

SQL> flashback table test1 to before drop;

Done

SQL> select count(*) from test1;

 COUNT(*)

----------

        1

此时查看恢复后的test1,发现恢复到最近一次的信息,因此可说明多次删除后,在回收站中会存在多条与test1有关的数据,而用flashback table test1 to before drop命令恢复到的是test1表中最近一次删除的信息


分享到:
评论

相关推荐

    数据库闪回

    删除的数据库表可以通过数据库闪回找回来,但前提是要求数据开了归档模式哟。truncate,delete,drop.都可以

    关于oracle10供了类似操作系统中的回收站功能

    在Oracle10g中,引入了一个回收站(Recycle Bin)的概念。...常常看到开发人员误删除表,我们可以充分利用10g的闪回(FLASHBACK)功能来避免类似的人为操作。不能对已经放到回收站(Recycle Bin)中的对象执行DDL/DML语句。

    基于Oracle闪回详解(必看篇)

    Oracle 9i 开始支持闪回,Oracle10g开始全面支持闪回功能,Oracle11g有所完善,为大家快速的恢复数据,...闪回DROP 回收站(recyclebin) 是 表 更新、删除、插入记录 闪回TABLE 还原数据,undo 是 查询 当前数据和历

    oracle 12c 数据库 教程

    (九)闪回删除:Flashback Drop 95 (十)闪回事务查询:Flashback Transaction Query 96 (十一)闪回数据归档:Flashback Data Archive 98 三、用户管理的备份 101 (一)用户管理的备份简介 101 (二)第一个...

    FLAHBACK详解

    FLAHBACK举例和使用说明,比较详细,重点介绍了3中方法恢复数据库:1.Flashback ...3.flashback drop。 本人也误操作drop了oracle中的一张表,找了半天找到这个方法文档恢复成功了表和数据。很好用,希望大家支持下。

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

     ●oracle恢复管理器和oracle闪回技术  ●资源管理器  ●oracle自动存储管理  ●oracle调度程序  ●自动工作负荷知识库  ●性能调整 作译者  John Watson就职于BPLC Management Consultants,负责公司欧洲...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第1/2部分)

     ●oracle恢复管理器和oracle闪回技术  ●资源管理器  ●oracle自动存储管理  ●oracle调度程序  ●自动工作负荷知识库  ●性能调整 作译者  John Watson就职于BPLC Management Consultants,负责公司欧洲...

    Mysql误删数据解决方案及kill语句原理

    使用flashback工具闪回,把数据恢复回来。原理是修改binlog的内容,拿回原库重放,需要确保binlog_format=row和binlog_row_imsge=Full 具体恢复时 如果是insert,将binlog event类型是write_rows event改为delete...

Global site tag (gtag.js) - Google Analytics