暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle purge 简单说明

原创 不吃草的牛_Nick 2023-08-01
493

当在 Oracle 中删除(drop)一个表时,数据库不会立刻释放表的空间,而是重命名这个表然后将其放入回收站,可以通过以下方式查询:

conn nick/nick
drop table t purge;
create table t as select * from dba_objects where rownum<100;

drop table t;

show parameter recycle;
show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$AcR3F9rLCWjgYzQBqMAziA==$0 TABLE 2023-07-31:15:34:48
TEST BIN$+TQjUWy5WvHgUzQBqMBaiw==$0 TABLE 2023-04-13:16:01:54

set line 133
col object_name for a35
col original_name for a35
select object_name, original_name
from user_recyclebin
where original_name = 'T';

OBJECT_NAME ORIGINAL_NAME
----------------------------------- -----------------------------------
BIN$AcR3F9rLCWjgYzQBqMAziA==$0 T

- object_name:对象在回收站中的名称;
- original_name:对象的原始名称。

表放入回收站后,Oracle 不会将该表的空间给其它对象使用,表所占用的空间依然占用,除非用户手工进行 Purge 或者因为存储空间不够而被数据库清掉。
如果你发现错误的删除了表,可以通过 flashback table 将表恢复。

flashback table t to before drop;

show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST BIN$+TQjUWy5WvHgUzQBqMBaiw==$0 TABLE 2023-04-13:16:01:54


to before drop 表示恢复这个表及其所有依赖的对象。如果该表的名称已经被其它表使用,那么执行 flashback table 该表时则会报错:
ORA-38312:original name is used by an existing object, 这时,可以在执行 flashback table 时将表重命名:

flashback table temp to before drop rename to temp_old;

rename to 表示将该表恢复后重命名。如果该表已经被删除了多次,那么使用 flashback table 恢复该表将默认恢复最后一次删除的那个,如果想恢复之前的一个版本,需要在回收站中查询该表:
select object_name,original_name,droptime from user_recyclebin where original_name = 'TEMP';

OBJECT_NAME ORIGINAL_NAME DROPTIME
------------------------------------------------------------------------
BIN$C1LT5U0FaV7gVAAhKENZ5A==$0 TEMP 2014-12-29:10:59:41
BIN$C1LT5U0HaV7gVAAhKENZ5A==$0 TEMP 2014-12-29:10:59:54
BIN$C1LT5U0GaV7gVAAhKENZ5A==$0 TEMP 2014-12-29:10:59:47

然后可以使用那个恢复并重命名的方式依次恢复每一个。

使用 flashback table 需要注意:

1. 数据库将从回收站恢复该表的所有索引,注意bitmap join Index不能恢复,因为该索引在表删除后不会被放入回收站中,所以不能恢复;
2. 数据库将恢复该表的trigger和constraint,除了指向其它表的完整性约束;
3. 当删除一个表时,定义在该表上的所有物化视图日志也被删除,但不会放入回收站中,因此,物化视图日志不能随着表被恢复;
4. 当删除一个表时,该表相关的所有索引都将被放入回收站中,如果数据库空间不足,数据库将首先清除掉索引的空间,因此,在这种情况下,恢复表将无法恢复所有的索引;
5. 如果被删除的表已经被 purge 了,那么将无法恢复。

purge 可以将表彻底清除,并且释放表所占用的空间。
不能回滚一个带上 purge 的 drop table 操作,也不能恢复一个使用 purge 删除的表格。
purge table temp;
drop table table_name purge;

需要注意不能回滚一个 purge 操作,一旦对一个表执行了 purge 操作,该表将无法再恢复。
如果该表被删除了多次,purge 操作将清除最早删除的那个表,也可以清除整个回收站的内容:
purge recyclebin;
purge dba_recyclebin;

show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$AcR3F9rNCWjgYzQBqMAziA==$0 TABLE 2023-07-31:15:55:22
T BIN$AcR3F9rMCWjgYzQBqMAziA==$0 TABLE 2023-07-31:15:55:10

purge table t;

show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$AcR3F9rNCWjgYzQBqMAziA==$0 TABLE 2023-07-31:15:55:22



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论