2008年9月17日星期三

使用Oracle的闪回技术恢复被删除的表

使用Oracle 10g版本的数据库时,查询数据库表,偶尔会出现一些以BIN$开头命名的表,这些表是ORACLE数据库中被DROP掉的表,保留在一个回收站中。如果万一错删了一个重要的表,则可以使用“闪回”的方法来恢复。
现在做一个测试:

SQL> create table aa(
2  col001 varchar2(20) primary key,
3 col002 varchar2(20),
4 col003 varchar2(100)
5 );

SQL> insert into aa values('001','China','Asia');

1 rows inserted

SQL> select * from aa;

COL001 COL002 COL003
-------------------- -------------------- -------------------
001 China Asia

SQL> drop table aa;

Table dropped

SQL> select * from user_recyclebin;

OBJECT_NAME ORIGINAL_NAME OPERATION
BIN$szLzmW8iSNe1cOL+pL3nDA==$0 AA DROP
BIN$uvwnj9g/TMOOZPxdVC9azg==$0 SYS_C0030540 DROP

如果我们要恢复表,可以在SQL*PLUS中使用如下命令:

SQL> flash back table TABLE_NAME to before drop

执行完毕后,查询用户表,可以发现表已经成功恢复,且数据完整。

由于被删除的表存在于回收站,并没有真正从硬盘删除,因此它还占用原有的存储空间。如果我们不想看到在查询表的时候出现回收站表的名称,是想释放存储空间,则可以清空回收表:

SQL> purge user_recyclebin;

这样做将删除回收站的所有表,有时候为了保险起见,我们只删除回收站中特定的表,可以使用带表名(也可以是回收站的特殊表名)的purge命令,如:

SQL> purge table TABLE_NAME;

SQL> purge table BIN$szLzmW8iSNe1cOL+pL3nDA==$0;

也可以在删除表的时候加上purge参数,直接删除而不保留在回收站,这样表就永久删除且不可恢复了。如:

SQL> drop table TABLE_NAME purge;

使用闪回技术还可以使表恢复到某个时间点,可以使用命令:
flashback table TABLE_NAME TO TIMESTAMP to_timestamp(string1, [ format_mask ],[ 'nlsparam' ] );

当表空间不足的时候,回收站也会由ORACLE自动管理,按照先进先出的原则删除回收站中的对象。

没有评论: