ITPub博客

首页 > 数据库 > Oracle > Flashback Drop

Flashback Drop

原创 Oracle 作者:弥天心 时间:2018-02-14 11:16:21 0 删除 编辑
   Flashback Drop 功能从Oracle10g开始出现,用于恢复用户误删除的对象如表、索引等。这项技术依赖于Tablespace Recycle Bin(表空间回收站),其功能与Windows的回收站非常类似。
   从Oracle10g开始,每个表空间都会有一个叫做回收站的逻辑区域,当用户执行drop命令时,被删除的表和表的关联对象(如索引、约束、触发器、LOB段等)不会被物理删除,这些对象先转移到回收站中,给用户提供恢复的可能,当用户需要撤销时,使用Flashback Table命令可以恢复这个对象和所有的关联对象。初始化参数recyclebin用于控制是否启用回收站功能,缺省是ON,可以使用OFF关闭。

SYS@sundc>show parameter recyclebin

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      on

      不同用户可以使用同一个表空间,而不同用户又可以创建相同名称的对象,同一个对象可以被创建多次,Oracle用特殊的命名格式来区分Recycle Bin中的对象,格式为“BIN$globalUID$version”,globalUID是一个24字符的唯一号,version代表版本。

使用show recyclebin命令查看回收站的对象列表:
HR@sundc>show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
MTX1             BIN$ZSPbVwzJCO/gUwodqMDMRw==$0 TABLE        2018-02-14:10:27:46
MTX2             BIN$ZSPUbazjCOrgUwodqMAoug==$0 TABLE        2018-02-14:10:25:50
MTX3             BIN$ZSPbVwzLCO/gUwodqMDMRw==$0 TABLE        2018-02-14:10:27:50

也可以查看视图确定Recycle Bin对象:
HR@sundc>select object_name as recyce_name,original_name from recyclebin;

RECYCE_NAME                    ORIGINAL_NAME
------------------------------ --------------------------------
BIN$ZSPUbazjCOrgUwodqMAoug==$0 MTX2
BIN$ZSPbVwzJCO/gUwodqMDMRw==$0 MTX1
BIN$ZSPbVwzLCO/gUwodqMDMRw==$0 MTX3

也可以像查看普通表一样查看Recycle Bin中的对象内容:
HR@sundc>select count(*) from "BIN$ZSPUbazjCOrgUwodqMAoug==$0";

  COUNT(*)
----------
        27

Flashback Drop操作实验
可以恢复成删除前同名的表或者恢复成新的名称的表,下面将分别实验。
HR@sundc>flashback table mtx1 to before drop;

Flashback complete.

HR@sundc>select count(*) from mtx1;

  COUNT(*)
----------
       107

如果同名的表在Recycle Bin中有多个版本,可以指定要恢复的具体版本:
HR@sundc>show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
MTX1             BIN$ZSPbVwzSCO/gUwodqMDMRw==$0 TABLE        2018-02-14:10:36:10
MTX1             BIN$ZSPbVwzQCO/gUwodqMDMRw==$0 TABLE        2018-02-14:10:35:46
MTX2             BIN$ZSPUbazjCOrgUwodqMAoug==$0 TABLE        2018-02-14:10:25:50
MTX3             BIN$ZSPbVwzLCO/gUwodqMDMRw==$0 TABLE        2018-02-14:10:27:50

HR@sundc>select count(*) from "BIN$ZSPbVwzSCO/gUwodqMDMRw==$0";

  COUNT(*)
----------
         7

HR@sundc>select count(*) from "BIN$ZSPbVwzQCO/gUwodqMDMRw==$0"; 

  COUNT(*)
----------
       107
如果想恢复有107条数据记录的表,可以使用如下语句:
HR@sundc>flashback table "BIN$ZSPbVwzQCO/gUwodqMDMRw==$0" to before drop; 

Flashback complete.

确认恢复成功:
HR@sundc>select count(*) from mtx1;

  COUNT(*)
----------
       107

如果想把另一个mtx1也恢复出来,改成ymx1,可以使用如下语句:
HR@sundc>flashback table mtx1 to before drop rename to ymx1;

Flashback complete.

HR@sundc>select count(*) from ymx1;

  COUNT(*)
----------
         7

小节:
表空间的Recycle Bin只是一个逻辑区域,并不是从表空间上物理划分出一块区域固定用于回收站。因此,Recycle Bin是和普通对象共用表空间的存储区域,或者说Recycle Bin的对象要和普通对象抢夺存储空间。如果发生空间不够,Oracle会按照先入先出的顺序,也就是按照对象被删除的时间顺序覆盖Recycle Bin中的对象。也可以通过如下办法手动清除Recycle Bin占用的空间。
(1)purge tablespace tablespace_name 清空表空间的Recycle Bin。
(2)purge tablespace tablespace_name user user_name 清空指定表空间的Recycle Bin中指定用户的对象。
(3)purge recyclebin 删除当前用户的Recycle Bin中的对象。
(4)purge dba_recyclebin 删除所有用户的Recycle Bin对象(需要sysdba)权限。
(5)drop table ... purge 删除对象并且不放在Recycle Bin中,相当于永久删除对象,以后没法做Flashback Drop。
(6)purge index recycle_bin_object_name 如果希望释放Recycle Bin的空间,但是又想以后能够恢复表,就可以通过释放该对象的index锁占据的空间来缓解空间压力。因为对象的index可以快速重建。

需要注意的地方:
(1)只能用于非系统表空间和本地管理表空间;
(2)如果对象创建字本地管理表空间,而关联对象比如索引创建在字典管理表空间,则恢复时字典管理表空间上的关联对象不会被恢复;
(3)对象是否能够成功恢复,取决于对象空间是否被覆盖重用;
(4)不能对Recycle Bin中的对象执行DML、DDL操作,只支持查询;
(5)对象的参考约束不会被恢复,也就是说指向该对象的外键约束需要重建。

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

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2015-12-14

  • 博文量
    5
  • 访问量
    4058