Flashback Drop

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)对象的参考约束不会被恢复,也就是说指向该对象的外键约束需要重建。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值