Oracle Flashback----flashback drop

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

       闪回删除表(dropped tables):
       语法:FLASHBACK TABLE table_name TO BEFORE DROP [RENAME TO new_name];
       Flashback Drop 是从Oracle 10g 开始出现的, 用于恢复用户误删除的对象(包括表,索引等), 这个技术依赖于Tablespace Recycle Bin(表空间回收站),这个功能和windows的回收站非常类似。这个功能和数据库闪回没有关系,和flashback参数没有关系,表也不要求row movement.Flashback 不支持sys用户. system表空间下的对象,也不能从回收站里拿到。故使用SYS 或者SYSTEM用户登陆时,show recyclebin 为空。


       Flashback Drop 是从Oracle 10g 开始出现的, 用于恢复用户误删除的对象(包括表,索引等), 这个技术依赖于Tablespace Recycle Bin(表空间回收站),这个功能和windows的回收站非常类似。这个功能和数据库闪回没有关系,和flashback参数没有关系,表也不要求row movement.Flashback 不支持sys用户. system表空间下的对象,也不能从回收站里拿到。故使用SYS 或者SYSTEM用户登陆时,show recyclebin 为空。


      Tablespace Recycle Bin
      从Oracle 10g 开始, 每个表空间都会有一个叫作回收站的逻辑区域,当用户执行drop命令时, 被删除的表和表的关联对象( 包括索引, 约束,触发器,LOB段,LOB index 段) 不会被物理删除, 这些对象先转移到回收站中,这就给用户提供了一个恢复的可能。初始化参数recyclebin 用于控制是否启用recyclebin功能,缺省是ON, 可以使用OFF关闭。

SQL> show user
USER is "SH"
SQL> 
SQL> set linesize 400
SQL> 
SQL> show parameter recyclebin

NAME                          TYPE                       VALUE
----------------------------- -------------------------- -----------------
recyclebin                    string                     on
SQL> 
     禁用与开始该功能可以使用下面SQL:

SQL> alter system set recyclebin=off;

System altered.

SQL> 
SQL> show parameter recyclebin

NAME                         TYPE                       VALUE
---------------------------- -------------------------- ------------------
recyclebin                   string                     OFF
SQL> 
SQL> 
SQL> alter system set recyclebin=on;                         

System altered.

SQL> 
           禁用后删除的对象将直接删除,不会写到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所占用的空间来缓解空间压力。 因为索引是可以重建的。

      实验开始:

     一:创建相关测试表

SQL> create table emp as select * from scott.emp;

Table created.

SQL> 
SQL> alter table emp add constraint EMP_PK primary key(empno);

Table altered.

SQL>  
SQL> select file_id,block_id,blocks from dba_extents where segment_name='EMP' and owner='SH'; 

   FILE_ID   BLOCK_ID     BLOCKS
---------- ---------- ----------
         4         57          8

SQL> 
      

      二:删除测试表,查看recyclebin内容

SQL> drop table emp;

Table dropped.

SQL> 
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP              BIN$ArIUf4D4N7ngUAoKiBsT3A==$0 TABLE        2014-09-10:15:34:19
SQL> 
SQL>
SQL> col segment_name format a50
SQL> col blocks format 99 
SQL> select segment_name,blocks from user_segments where segment_name='BIN$ArIUf4D4N7ngUAoKiBsT3A==$0';

SEGMENT_NAME                                       BLOCKS
-------------------------------------------------- ------
BIN$ArIUf4D4N7ngUAoKiBsT3A==$0                          8

SQL> 
           可以看到,“回收站”已经有表信息了。

      三:查看原来表占的数据文件

SQL> col TABLESPACE_NAME format a40
SQL> col FILE_ID format 99
SQL> col BLOCK_ID format 99
SQL> col BYTES format 999999
SQL> col BLOCKS format 99
SQL> col RELATIVE_FNO format 99
SQL> 
SQL> select * from dba_free_space where file_id=4 and block_id=57;

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

SQL> 
            通过dba_free_space视图,可以到原来的数据文件块已经清空数据了

       四:闪回删除表

SQL> flashback table emp to before drop;

Flashback complete.                                                                                                                      NUMBER(2)

SQL> select count(*) from emp;

  COUNT(*)
----------
        14

SQL> 
       表是回来,但是查询刚才的索引,发现索引也回来了,但是索引的名称改变了。

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

INDEX_NAME
------------------------------------------------------------------------------------------
BIN$ArIUf4D3N7ngUAoKiBsT3A==$0

SQL> 
SQL> alter index "BIN$ArIUf4D3N7ngUAoKiBsT3A==$0" rename to "EMP_PK_";

Index altered.

SQL> 
             追求完美的我们,还是把索引名称改回来吧!

        问题1:如果这个时候emp表,已经有其他表占用“emp”的表名了,怎么办?

flashback table T to before drop rename to T2;
        那只有改名了,在闪回的时候。附上一些常用语法给大家

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

       

     


             




       

发布了103 篇原创文章 · 获赞 8 · 访问量 24万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章