操作 Oracle 时,经常会删除一个表,当删除错误后,希望能够恢复该表,有时也希望删除表之后能够立刻释放表的空间。
通过 purge
的使用可以在 Oracle 中删除表、恢复表和空间释放。
DROP TABLE
当在 Oracle 中删除drop
一个表时,数据库不会立刻释放表的空间,而是重命名这个表然后将其放入回收站,可以通过以下方式查询:
SQL> SELECT object_name ,original_name FROM user_recyclebin;
OBJECT_NAME ORIGINAL_NAME
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
BIN$rieTHetua27gVQAAAAAAAQ==$0 ACMG_T_PECUST_VALUE_INFO
BIN$rieTHetwa27gVQAAAAAAAQ==$0 ACMG_T_PECUST_VALUE_INFO
BIN$wuf3baau0MjgVQAAAAAAAQ==$0 LEE
object_name
:对象在回收站中的名称;
original_name
:对象的原始名称。
表放入回收站后,Oracle 不会将该表的空间给其它对象使用,表所占用的空间依然占用,除非用户手工进行 Purge
或者因为存储空间不够而被数据库清掉。如果你发现错误的删除了表,可以通过 flashback table
将表恢复。
FLASHBACK TABLE
可以使用 flashback table
恢复已删除的表。
SQL> flashback table lee to before drop;
Done
to before drop
表示恢复这个表及其所有依赖的对象。如果该表的名称已经被其它表使用,那么执行 flashback table
该表时则会报错:ORA-38312:original name is used by an existing object
, 这时,可以在执行 flashback table
时将表重命名:
SQL> flashback table lee to before drop rename to lee_old;
Done
rename to
表示将该表恢复后重命名。如果该表已经被删除了多次,那么使用 flashback table 恢复该表将默认恢复最后一次删除的那个,如果想恢复之前的一个版本,需要在回收站中查询该表:
SQL> select object_name,original_name,droptime from user_recyclebin where original_name = 'LEE';
OBJECT_NAME ORIGINAL_NAME DROPTIME
------------------------------------------------------------------------
BIN$C1LT5U0FaV7gVAAhKENZ5A==$0 LEE 2020-12-29:10:59:41
BIN$C1LT5U0HaV7gVAAhKENZ5A==$0 LEE 2020-12-29:10:59:54
BIN$C1LT5U0GaV7gVAAhKENZ5A==$0 LEE 2020-12-29:10:59:47
然后可以使用那个恢复并重命名的方式依次恢复每一个。
使用 flashback table
需要注意:
数据库将从回收站恢复该表的所有索引,注意bitmap join Index
不能恢复,因为该索引在表格删除后不会被放入回收站中,所以不能恢复;
数据库将恢复该表的trigger
和constraint
,除了指向其它表的完整性约束;
当删除一个表格时,定义在该表格上的所有物化视图日志也被删除,但不会放入回收站中,因此,物化视图日志不能随着表格被恢复;
当删除一个表格时,该表格相关的所有索引都将被放入回收站中,如果数据库空间不足,数据库将首先清除掉索引的空间,因此,在这种情况下,恢复表格将无法恢复所有的索引;
如果被删除的表格已经被 purge
了,那么将无法恢复。
如果用户在删除一个表后不会再恢复它,可以考虑使用 purge
将其彻底清除掉。
PURGE
purge
可以将表彻底清除,并且释放表所占用的空间。
SQL> purge table temp;
SQL> drop table LEE purge;
Done
需要注意不能回滚一个 purge
操作,一旦对一个表执行了 purge
操作,该表将无法再恢复。
如果该表被删除了多次,purge
操作将清除最早删除的那个表,也可以清除整个回收站的内容:
SQL> purge recyclebin;
Done
DROP TABLE … PURGE
也可以将删除表格和释放空间一步完成,例如:
SQL> drop table LEE purge;
Done
这种方式相当于先删除表格 table_name
,然后在对表格执行 purge
操作。
注意,在这种情况下,不能回滚一个带上 purge
的 drop table
操作,也不能恢复一个使用 purge
删除的表格。
如果确定要 drop
表,则最好加上 purge
,但是要慎用,因为无法回滚。
at last:
想建一个数据库技术的交流群,用于磨炼提升技术能力.群号: 130730832
,欢迎大佬前来教学。