当你删除一张表时,数据库不会立即删除与表现关联的空间。数据库重命名表,并将关联的对象放置在回收站。然而,在表被错误删除的情况下,可以在稍后的时间里进行恢复。这种结构叫做闪回删除, FLASHBACK
TABLE
语句是用来恢复表。在讨论使用FLASHBACKTABLE语句用于恢复表之前,重要的是理解回收站如何工作,以及如何管理其内容。
1.什么是回收站?
回收站实际上是一个包含有关删除对象信息的数据字典表。删除的表和关联的对象(例如索引,约束,嵌套表)并没有被移除,而是一直占用空间。它们继续占用着用户空间配额,直到明确指定从回收站中删除,或数据库表空间约束必须要删除。
每个用户都被认为有自己的回收站,除非这个用拥有SYSDBA权限,可以访问其他用户的回收站。用户可以使用下面的语句查看回收站中它自己的对象。
select * from recyclebin;
回收站的中对象名称
当删除的表转移到回收站时,该表以及关联的对象名称是系统生成。这是必要的,避免出现多个相同的名称冲突。这可能发生在以下情况:
- 用户删除一张表,在创建相同名称的表,然后再次删除。
- 两个用户具有相同名称的表,且都删除了自己表。
命名约定如下:
BIN$unique_id$version
其中:
- unique_id是一个26位字符的全局唯一标识符。
- version
2.启用和禁用回收站
通过recyclebin初始化参数可启用和禁用回收站。当回收站启用时,删除的表和其依赖的对象都放在回收站。当回收站禁用时,删除的表和他们依赖的对象都不放置在回收站,它们已经被删除,必须使用其他方式来恢复(例如从备份中恢复)。
回收站默认是启用的。
执行其中一个语句,禁用回收站:
ALTER SESSION SET recyclebin = OFF;
ALTER SYSTEM SET recyclebin = OFF;
执行其中一个语句,启用回收站:
ALTER SESSION SET recyclebin = ON;
ALTER SYSTEM SET recyclebin = ON;
启用和禁用回收站使用ALTER SYSTEM或ALTER SESSION语句立即生效,禁用回收站不会清除,否则会影响回收站中已经存在的对象。
像其他初始化参数一样,可以在初始化文本文件initSID.ora中设置recyclebin参数的初始值。
recyclebin=on
3.查看和查询回收站中的对象
Oracle数据库提供两个视图来获取回收站中的对象信息:
视图 | 描述 |
USER_RECYCLEBIN | 该视图可用于用户查看回收站中自己删除的对象。它有一个RECYCLEBIN同义词,为了便于使用。 |
DBA_RECYCLEBIN | 该视图使管理员能看见回收站中所有删除的对戏那个 |
select object_name,original_name from recyclebin;
select object_name,original_name from dba_recyclebin;
4.清除回收站中的对象
如果你决定永远不会从回收站中恢复项目,你可以使用PURGE语句从回收站中删除项目及其相关对象,并释放其存储空间。如果你要除项目,需要一些权限。
当你使用PURGE语句清除表时,你可以使用回收站中已知的名字或表的原始名字。回收站中的名字可以从USER_RECYCLEBIN或DBA_RECYCLEBIN中获取。
purge table emp;
purge recyclebin;
purge tablespace example user e1;
5.从回收站中恢复表
使用FLASHBACK TABLE ... TO BEFORE DROP语句从回收站中恢复对象。你可以指定回收站中表的名称或原始表名称。可选RENAME TO子句让你重命名恢复表。
FLASHBACK TABLE emp TO BEFORE DROP;
FLASHBACK TABLE "系统生成的名称" TO BEFORE DROP;
FLASHBACK TABLE emp TO BEFORE DROP RENAME TO emp_r;
注意!如果使用系统生成的名称进行恢复,需要使用双引号包围系统生成名称。
6.Examples
6.1查看回收站是否启用
SQL> show parameter recyclebin;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string on
如果value值为off,则需要启用回收站。
alter system set recyclebin = on;
6.2创建tst_example表
create table tst_example (
tst_id number,
tst_code varchar2(30),
tst_desc varchar2(250));insert into tst_example values (1,'a001','北京');
insert into tst_example values (2,'a002','上海');
insert into tst_example values (3,'a003','IT');6.3删除tst_example表
查看回收站
SQL> select object_name,original_name from recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------删除表
SQL> drop table tst_example;
Table dropped
再次查看回收站
SQL> select object_name,original_name from recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$65yacRBUzSrgQAB/AQAcPQ==$0 TST_EXAMPLE发现刚才删除的表,已经被放置到回收站中了。
查询表,提示表或视图不存在
SQL> select tst_id ,tst_code from tst_example;
select tst_id ,tst_code from tst_example
ORA-00942: 表或视图不存在
6.4从回收站中恢复表
SQL> flashback table TST_EXAMPLE to before drop;
Done
或者使用系统生成的名称进行恢复
flashback table "BIN$65yacRBUzSrgQAB/AQAcPQ==$0" to before drop;
查询表
SQL> select tst_id ,tst_code from tst_example;
TST_ID TST_CODE
---------- ------------------------------
1 a001
2 a002
3 a003