技术开发 频道

Oracle10g新特性——闪回表

【IT168技术文档】
删除表的恢复
    如果某个用户不小心删除了一个十分重要的表,后果将非常严重。在9i中提供的闪回特性只能恢复DML语句造成的影响,而无法恢复DDL语句的影响。DBA只能通过重建一张表,然后从备份数据中导入。

   利用Oracle 10G中的闪回表的特性,DBA可以轻松完成这项工作,并将影响降到最小。下面就举一个例子说明:

创建表:
SQL> create table abc (f number(9));
表已创建。

SQL> create index idx_test on abc(f);
索引已创建。

SQL> insert into abc values(1);
已创建 1 行。

SQL> insert into abc values(2);
已创建 1 行。

SQL> insert into abc values(3);
已创建 1 行。

删除表:
SQL> drop table abc;
表已删除。

SQL> select * from tab; TNAME TABTYPE CLUSTERID ------------------ -------------- ---------- BIN$XXUGsbYvSqa8Mrd6GstP+g==$0 TABLE
    请注意,在原表abc被删除后,abc没有了,却出现了一张新表BIN$XXUGsbYvSqa8Mrd6GstP+g==$0。这就是Oracle 10G中对删除表的处理,原表实际上并没有完全删除掉,而是被系统重新命名成了一个系统定的新表。它还存在于原先的表空间,并且保持了原有的结构。

依赖于原表的存储过程都失效了。而建在表上的索引和触发器也会被重新命名。

SQL> select index_name, index_type, table_name from ind; INDEX_NAME INDEX_TYPE TABLE_NAME ------------------- ------------------- ---------------------- BIN$1++ilvsQQ7mfPh2pvont5A==$0 NORMAL BIN$XXUGsbYvSqa8Mrd6GstP+g==$0
被删除的表及其相关对象都会被放置在一个称为recyclebin的逻辑容器中:

SQL> show recyclebin ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ---------------- ---------------------------- ------------ --------------- ABC BIN$XXUGsbYvSqa8Mrd6GstP+g==$0 TABLE 2005-08-29:18:03:10
显示了被删除对象的原有名字,删除后的名字,对象类型以及删除时间。

通过使用flashback table语句就可以恢复表!


闪回完成。

SQL> select * from tab; TNAME TABTYPE CLUSTERID ------------------ -------------- ---------- ABC TABLE
这样就轻松的将对象恢复了!

注意,对象被恢复后,它在recyclebin中占用的空间并不会被释放。必须使用PURGERECYCLEBIN来清空占用的空间。

SQL> PURGE RECYCLEBIN;
回收站已清空。

当然,如果想要彻底删除一个对象,让它不占用回收站的空间,可以用以下语句实现:

SQL> DROP TABLE ABC PURGE;
管理回收站
    一旦哪些没有被真正删除的对象占满了表空间将会怎样呢?其实答案很简单:如果表空间被回收站中的数据占满了,并且数据文件也无法再扩展了(即产生了表空间压力)。那么回收站中的对象将会以“先入先出”(FIFO)的原则被自动清除掉。并且,依赖表的对象(如索引)将会比表对象先清除。

    同样的,当存在用户配额时也会发生表空间压力的情况。当一个用户的配额空间被占满了,尽管此时表空间还可能有足够的空间,系统也会以FIFO的原子释放回收站中属于这个用户的对象。

    另外,还有多种途径来手工控制回收站。比如可以用对象的原有名字从回收站中清除指定对象:

PURGE TABLE ABC

   或者用对象被删除后系统自动重命名的名字来指定清除它:

PURGE TABLE “BIN$XXUGsbYvSqa8Mrd6GstP+g==$0

    清除表时,同时也会清除依赖这张表的约束,如索引。可以指定只清除表相应的约束,如:

PURGE INDEX IDX_TEST

    此外,还可以将整个表空间的回收站内容全部清除:

PURGE TABLESPACE RING

也可以清除某个表空间上的回收站中某个用户的对象:

PURGE TABLESPACE RING USER TEST


当用某个普通用户登录时,只会清除它自己的对象。

PURGE RECYCLEBIN

当以DBA身份登录时,可以清除所有表空间上回收站

PURGE DBA_RECYCLEBIN

表的版本和闪回

    一旦一张表被多次删除又重建,该如何恢复呢?

SQL> CREATE TABLE TEST (COL1 NUMBER);

表已创建。

SQL> INSERT INTO TEST VALUES (1);

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> DROP TABLE TEST;

表已删除。

SQL> CREATE TABLE TEST (COL1 NUMBER);

表已创建。

SQL> INSERT INTO TEST VALUES (2);

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> DROP TABLE TEST;

表已删除。

SQL> CREATE TABLE TEST (COL1 NUMBER);

表已创建。

SQL> INSERT INTO TEST VALUES (3);

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> DROP TABLE TEST;

表已删除。

这时,系统在每一次删除时都会在回收站中为这张表重命名一张表:

SQL> select * from tab; TNAME TABTYPE CLUSTERID ------------------ -------------- ---------- BIN$IE1x0mwfSe6p6yhLn8/mBw==$0 TABLE BIN$SUj0n3ghTaSQu0AFGheUYA==$0 TABLE BIN$khjCqP4fRqeOrE/Eg/XUWQ==$0 TABLE SQL> show recyclebin ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ---------------- ---------------------------- ------------ --------------- TEST BIN$IE1x0mwfSe6p6yhLn8/mBw==$0 TABLE 2005-08-29:20:44:47 TEST BIN$khjCqP4fRqeOrE/Eg/XUWQ==$0 TABLE 2005-08-29:20:44:47 TEST BIN$SUj0n3ghTaSQu0AFGheUYA==$0 TABLE 2005-08-29:20:44:46

   

0
相关文章