Oracle 提供了很多保护数据的方法,其中回收站也是保护数据的一道防线, 本文以Oracle11.2.0.4 为例进行测试。
回收站功能默认开启的,可以通过以下方式查看:
SQL> show parameter recyclebinNAME TYPE VALUE------------------------------------ -------------------------------- ------------------------------recyclebin string on
如果通过drop命令重复删除,回收站都会有记录,为了避免恢复错误,可通过重命名方式恢复到新表。但如果回收站所在表空间空间不足,在有新数据进入时,回收站按照先进先清的机制,清理回收站中对象,也建议定期清理回收站对象,避免因回收站占用空间太大,影响数据库的统计分析。再个需要注意的是,表所关联的索引会随着闪回表恢复,但名字依然是回收站命名方式。
回收站清理早期对象
示例,通过以下可以看出,当T6表数据量变大时,表空间只有500M,所以会清理掉回收站之前的对象,以保证新的数据插入。
SQL> select segment_name,bytes/1024/1024 from user_segments;SEGMENT_NAME BYTES/1024/1024------------------------ ---------------T3 80T4 .9375BIN$x6xk2qFzBvXgU3RQqMBXiA==$0 80BIN$x6xk2qFxBvXgU3RQqMBXiA==$0 80BIN$x6xk2qFyBvXgU3RQqMBXiA==$0 96SQL> 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 80T4 .9375BIN$x6xk2qFzBvXgU3RQqMBXiA==$0 80T6 317SQL>
闪回表重命名
示例
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 158883BIN$x6xk2qFzBvXgU3RQqMBXiA==$0 DROP T2021 2021-07-22:08:31:27 2021-07-22:08:32:00 158884BIN$x6xk2qF0BvXgU3RQqMBXiA==$0 DROP T2021 2021-07-22:08:30:17 2021-07-22:08:37:49 158882SQL> select count(*) from "BIN$x6xk2qF3BvXgU3RQqMBXiA==$0"; COUNT(*)---------- 3107SQL> 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 80T3_NEW .9375BIN$x6xk2qFzBvXgU3RQqMBXiA==$0 80T1 22T2 11T5 11T3 .06257 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 158892BIN$x6xk2qF9BvXgU3RQqMBXiA==$0 TABLE DROP T2021 2021-07-22:08:53:22 2021-07-22:08:56:41 158892BIN$x6xk2qF0BvXgU3RQqMBXiA==$0 TABLE DROP T2021 2021-07-22:08:30:17 2021-07-22:08:37:49 158882BIN$x6xk2qFzBvXgU3RQqMBXiA==$0 TABLE DROP T2021 2021-07-22:08:31:27 2021-07-22:08:32:00 158884SQL> 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 T9BIN$x6xk2qF6BvXgU3RQqMBXiA==$0 T1_NEWSQL> show parameter recyclebinNAME TYPE VALUE------------------------------------ -------------------------------- ------------------------------recyclebin string onSQL> --可通过以下方式为索引重命名,建议闪回表后进行统计信息收集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限制
