【RECYCLEBIN】Oracle回收站详解

Oracle 提供了很多保护数据的方法,其中回收站也是保护数据的一道防线, 本文以Oracle11.2.0.4 为例进行测试。

回收站功能默认开启的,可以通过以下方式查看:

SQL> show parameter recyclebin
NAME                     TYPE                  VALUE
------------------------------------ -------------------------------- ------------------------------
recyclebin                 string                  on

如果通过drop命令重复删除,回收站都会有记录,为了避免恢复错误,可通过重命名方式恢复到新表。但如果回收站所在表空间空间不足,在有新数据进入时,回收站按照先进先清的机制,清理回收站中对象,也建议定期清理回收站对象,避免因回收站占用空间太大,影响数据库的统计分析。再个需要注意的是,表所关联的索引会随着闪回表恢复,但名字依然是回收站命名方式。

回收站清理早期对象

示例,通过以下可以看出,当T6表数据量变大时,表空间只有500M,所以会清理掉回收站之前的对象,以保证新的数据插入。

SQL> select segment_name,bytes/1024/1024 from user_segments;
SEGMENT_NAME                              BYTES/1024/1024
------------------------                   ---------------
T3                                                   80
T4                                                .9375
BIN$x6xk2qFzBvXgU3RQqMBXiA==$0                   80
BIN$x6xk2qFxBvXgU3RQqMBXiA==$0                   80
BIN$x6xk2qFyBvXgU3RQqMBXiA==$0                   96
SQL> create table t6 as select * from t3;
Table created.
SQL> insert into t6 select * from t6;
703168 rows created.
SQL> commit;
Commit complete.
SQL>  insert into t6 select * from t6;
1406336 rows created.
SQL> commit;
Commit complete.
SQL>  select segment_name,bytes/1024/1024 from user_segments;
SEGMENT_NAME                                      BYTES/1024/1024
-------------------------------                   ---------------
T3                                                   80
T4                                                .9375
BIN$x6xk2qFzBvXgU3RQqMBXiA==$0                   80
T6                                                  317
SQL>

闪回表重命名

示例


SQL> select object_name,OPERATION,TS_NAME,CREATETIME,DROPTIME,BASE_OBJECT from recyclebin;
OBJECT_NAME               OPERATION TS_NAME            CREATETIME        DROPTIME        BASE_OBJECT
------------------------------ --------- ------------------------------ ------------------- ------------------- -----------
BIN$x6xk2qF3BvXgU3RQqMBXiA==$0 DROP     T2021                2021-07-22:08:31:04 2021-07-22:08:38:33      158883
BIN$x6xk2qFzBvXgU3RQqMBXiA==$0 DROP     T2021                2021-07-22:08:31:27 2021-07-22:08:32:00      158884
BIN$x6xk2qF0BvXgU3RQqMBXiA==$0 DROP     T2021                2021-07-22:08:30:17 2021-07-22:08:37:49      158882
SQL> select count(*) from "BIN$x6xk2qF3BvXgU3RQqMBXiA==$0";
  COUNT(*)
----------
      3107
SQL> flashback table "BIN$x6xk2qF3BvXgU3RQqMBXiA==$0" to before drop rename  to t3_new;
Flashback complete.
SQL> select segment_name,bytes/1024/1024 from user_segments;
SEGMENT_NAME               BYTES/1024/1024
------------------------------ ---------------
BIN$x6xk2qF0BvXgU3RQqMBXiA==$0            80
T3_NEW                     .9375
BIN$x6xk2qFzBvXgU3RQqMBXiA==$0            80
T1                        22
T2                        11
T5                        11
T3                     .0625
7 rows selected.

索引名字

示例

SQL> create table t9 as select * from dba_objects;
Table created.
SQL> create index t9_idx_id on t9(object_id);
Index created.
SQL> analyze table t9 compute statistics;
Table analyzed.
SQL> drop table t9;
Table dropped.
SQL> select object_name,type,OPERATION,TS_NAME,CREATETIME,DROPTIME,BASE_OBJECT from recyclebin order by droptime desc;
OBJECT_NAME               TYPE             OPERATION TS_NAME              CREATETIME          DROPTIME          BASE_OBJECT
------------------------------ ------------------------- --------- ------------------------------ ------------------- ------------------- -----------
BIN$x6xk2qF8BvXgU3RQqMBXiA==$0 INDEX             DROP       T2021              2021-07-22:08:54:01 2021-07-22:08:56:41      158892
BIN$x6xk2qF9BvXgU3RQqMBXiA==$0 TABLE             DROP       T2021              2021-07-22:08:53:22 2021-07-22:08:56:41      158892
BIN$x6xk2qF0BvXgU3RQqMBXiA==$0 TABLE             DROP       T2021              2021-07-22:08:30:17 2021-07-22:08:37:49      158882
BIN$x6xk2qFzBvXgU3RQqMBXiA==$0 TABLE             DROP       T2021              2021-07-22:08:31:27 2021-07-22:08:32:00      158884
SQL> flashback table "BIN$x6xk2qF9BvXgU3RQqMBXiA==$0" to before drop;
Flashback complete.
SQL> select index_name,table_name from user_indexes;
INDEX_NAME               TABLE_NAME
------------------------------ ------------------------------
BIN$x6xk2qF8BvXgU3RQqMBXiA==$0 T9
BIN$x6xk2qF6BvXgU3RQqMBXiA==$0 T1_NEW
SQL> show parameter recyclebin
NAME                     TYPE                  VALUE
------------------------------------ -------------------------------- ------------------------------
recyclebin                 string                  on
SQL> 
--可通过以下方式为索引重命名,建议闪回表后进行统计信息收集
SQL> alter index "BIN$x6xk2qF4BvXgU3RQqMBXiA==$0" rename to t1_new_ind;
--关闭回收站命令参考
SQL> ALTER SYSTEM SET RECYCLEBIN=OFF;
System altered.
SQL> ALTER SESSION SET RECYCLEBIN=OFF;
Session altered.

其他

进行drop table操作时,如果加入了purge,该对象是不会存在回收站中。

drop table t9 purge;
--清理回收站 某张表
SQL> purge table "BIN$x6xk2qF0BvXgU3RQqMBXiA==$0";
Table purged.
SQL> 
--清理回收站
SQL> purge recyclebin;
Recyclebin purged.
SQL> 
--清理所有
SQL> purge dba_recyclebin;
DBA Recyclebin purged.
SQL>

Flashback Drop限制

  • 仅适用于非系统、本地管理的表空间。
  • 回收站没有固定大小。对象保留在回收站中的时间可能会有所不同。如果表空间受到空间压力,回收站将被清空。回收站不会导致数据文件自动扩展,因此在某些情况下,可以很快清除对象。
  • 回收站中的对象仅限于查询操作(没有DDL或DML)。
  • 闪回查询操作必须引用回收站名称。
  • 表和所有相关对象将同时放入回收站、恢复并从中清除。
  • 具有细粒度访问策略的表不受回收站的保护。
  • 分区索引组织的表不受回收站保护。
  • 回收站不保留引用完整性。

参考:

请使用浏览器的分享功能分享到微信等