在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; --清除回收站里所有的对象所占用的空间