Oracle Flashback之flashback drop

闪回删除表(dropped tables):
语法:FLASHBACK TABLE table_name TO BEFORE DROP [RENAME TO new_name];


在Oracle 10g中,Flash back家族分为以下成员:
Flashback Database
Flashback Drop
Flashback Table
Flashback Query(分Flashback Query,Flashback Version Query,Flashback Transaction Query)
下面介绍一下Flashback Drop

Flashback Drop 是从Oracle 10g 开始出现的, 用于恢复用户误删除的对象(包括表,索引等), 这个技术依赖于Tablespace Recycle Bin(表空间回收站),这个功能和windows的回收站非常类似。这个功能和数据库闪回没有关系,和flashback参数没有关系,表也不要求row movement.Flashback 不支持sys用户. system表空间下的对象,也不能从回收站里拿到。故使用SYS 或者SYSTEM用户登陆时,show recyclebin 为空。
1. Tablespace Recycle Bin
从Oracle 10g 开始, 每个表空间都会有一个叫作回收站的逻辑区域,当用户执行drop命令时, 被删除的表和表的关联对象( 包括索引, 约束,触发器,LOB段,LOB index 段) 不会被物理删除, 这些对象先转移到回收站中,这就给用户提供了一个恢复的可能。初始化参数recyclebin 用于控制是否启用recyclebin功能,缺省是ON, 可以使用OFF关闭。
SQL> show user
USER is "HR"

SQL> show parameter recyclebin

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      on
 
禁用该功能:
SQL> alter system set recyclebin=off;
SQL> alter system set recyclebin=on;
SQL> alter session set recyclebin=off;
SQL> alter session set recyclebin=on;
禁用后删除的对象将直接删除,不会写到recyclebin中,当然在删除时,指定purge 参数,表也将直接删除,不会写到recyclebin中。
 
表空间的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 table_name purge:  删除对象并且不放在Recycle Bin中,即永久的删除,不能用Flashback恢复。
6). Purge index recycle_bin_object_name: 当想释放Recycle bin的空间,又想能恢复表时,可以通过释放该对象的index所占用的空间来缓解空间压力。 因为索引是可以重建的。


下面是Flashback Drop 实例操作,我用的HR用户登陆的,注意我的hr是拥有DBA角色的权限的。

实验一:
此时我 SQL> show recyclebin里面空的,即没有被drop的表。

创建一个测试表
SQL> create table emp as select * from employees;

Table created.

 为测试表创建一个主键索引
SQL> alter table emp add constraint EMP_EMP_ID_PK_TEST primary key(employee_id);

Table altered.

查看一下该表的存储信息。
SQL> select file_id,block_id,blocks from dba_extents where segment_name='EMP' and owner='HR';

   FILE_ID   BLOCK_ID     BLOCKS
---------- ---------- ----------
         4        385          8

我drop了emp表,recyclebin里有EMP备删除的信息了。
SQL> drop table emp;

Table dropped.

SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP              BIN$0fkSqpkZFT/gQKjAyFwRDA==$0 TABLE        2012-12-29:15:00:01


SQL> select segment_name,blocks from user_segments where segment_name='BIN$0fkSqpkZFT/gQKjAyFwRDA==$0';

SEGMENT_NAME                                                                          BLOCKS
--------------------------------------------------------------------------------- ----------
BIN$0fkSqpkZFT/gQKjAyFwRDA==$0                                                             8

EMP表被drop后,从下面的信息可以看出他的空间是被释放了。
SQL> select * from dba_free_space where file_id=4 and block_id=385;

TABLESPACE_NAME                   FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO
------------------------------ ---------- ---------- ---------- ---------- ------------
USERS                                   4        385      65536          8            4

闪回删除表
SQL> flashback table emp to before drop;

Flashback complete.

recyclebin没有了信息
SQL> show recyclebin
EMP表成功闪回
SQL> select count(*) from emp;

  COUNT(*)
----------
       107
从下面可以看出主键所有页是被闪回了,只是名字没有更改
SQL> select index_name from user_indexes where table_name='EMP';

INDEX_NAME
------------------------------
BIN$0fkSqpkYFT/gQKjAyFwRDA==$0

SQL> alter index "BIN$0fkSqpkYFT/gQKjAyFwRDA==$0" rename to "EMP_EMP_ID_PK_TEST";

Index altered.
再次查看,名字改过来了,一切和一开始一样了。
SQL> select index_name from user_indexes where table_name='EMP';

INDEX_NAME
------------------------------
EMP_EMP_ID_PK_TEST

实验二:
下面在以T表为例子来演示:
如果一个表被drop后,有重新建立了一个同名的表,如果再想闪回被删除的表,此时就需要重命名。
SQL> create table T as select * from employees;

Table created.

SQL> drop table T;

Table dropped.

SQL> create table T as select * from employees;

Table created.

出错了,系统提示该表名已经存在,所以需要重新给个名字闪回即可
SQL> flashback table T to before drop;
flashback table T to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object


SQL> flashback table T to before drop rename to T2;

Flashback complete.

SQL> select count(*) from T2;

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


实验三:
如果一个表被drop掉了,而且还在recyclebin里,则我们可以直接对recyclebin里的表做如下操作:
SQL> drop table T;

Table dropped.


SQL> set linesize 180
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T                BIN$0fkSqpkqFT/gQKjAyFwRDA==$0 TABLE        2012-12-29:15:21:40

可以直接通过如下查询表信息
SQL> select count(*) from "BIN$0fkSqpkqFT/gQKjAyFwRDA==$0";

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

可以直接查看表的结构
SQL> desc "BIN$0fkSqpkqFT/gQKjAyFwRDA==$0"
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPLOYEE_ID                                        NUMBER(6)
 FIRST_NAME                                         VARCHAR2(20)
 LAST_NAME                                 NOT NULL VARCHAR2(25)
 EMAIL                                     NOT NULL VARCHAR2(25)
 PHONE_NUMBER                                       VARCHAR2(20)
 HIRE_DATE                                 NOT NULL DATE
 JOB_ID                                    NOT NULL VARCHAR2(10)
 SALARY                                             NUMBER(8,2)
 COMMISSION_PCT                                     NUMBER(2,2)
 MANAGER_ID                                         NUMBER(6)
 DEPARTMENT_ID                                      NUMBER(4)

可以通过recyclebin里的RECYCLEBIN NAME 来删除表
SQL> flashback table "BIN$0fkSqpkqFT/gQKjAyFwRDA==$0" to before drop;

Flashback complete.

附上一些常用的清空recyclebin的语句
SQL> purge index idx_t;  --清除某个索引所占用的空间
SQL> purge tablespace users; --清除回收站里属于users表空间的对象所占用的空间
SQL> purge user_recyclebin; --清除回收站里属于当前用户的所有对象所占用的空间
SQL> purge dba_recyclebin;  --清除回收站里所有的对象所占用的空间

SQL> drop table t purge;
SQL> select original_name,object_name,type,ts_name,droptime,related,space from user_recyclebin;
no rows selected

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值