Oracle drop分区表单个分区无法通过闪回恢复

以前只知道分区表drop分区无法闪回,但是未注意过分区表删除之后是否还能在数据字典视图dba_tab_partitions中以及dba_objects查询,最近迁移之后比对对象数量时发现目标端比源端table partition数量少,经排查发现通过drop table 删除的分区表在打开回收站时还可以在数据字典中查询,做个记录。

1.创建测试表

-- 创建分区表
create table test_drop_part(id number primary key,name varchar2(20))
partition by range(id)
(
partition p1 values less than (1000),
partition p2 values less than (2000)
);
-- 插入数据
begin
for i in 1..1999
loop
insert into test_drop_part values(i,'czh');
end loop;
commit;
end;
/
-- 查询数据以及分区
HR@honor1 > select count(*) from test_drop_part;
                                COUNT(*)
----------------------------------------
                                    1999
HR@honor1 > select TABLE_NAME,PARTITION_NAME from user_tab_partitions;
TABLE_NAME                     PARTITION_NAME
------------------------------ ---------------
TEST_DROP_PART                 P1
TEST_DROP_PART                 P2

2. 删除分区表单个分区

2.1 删除分区表单个分区

HR@honor1 > alter table test_drop_part drop partition p2;
Table altered.

2.2 查询回收站以及数据字典视图

-- 查看分区
HR@honor1 > select TABLE_NAME,PARTITION_NAME from user_tab_partitions;
TABLE_NAME                     PARTITION_NAME
------------------------------ ---------------
TEST_DROP_PART                 P1
HR@honor1 > show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
-- 可以看到删除单个分区之后,查询数据字典视图只能查到剩余分区,回收站中无任何对象。

3. 删除分区表

3.1 删除分区表

HR@honor1 > drop table test_drop_part;
Table dropped.

3.2 查询回收站以及数据字典视图

HR@honor1 > show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST_DROP_PART   BIN$u+Z2BwPsKwzgU7XMqMD9hQ==$0 TABLE        2021-02-22:12:44:45
HR@honor1 > select TABLE_NAME,PARTITION_NAME from user_tab_partitions;
TABLE_NAME                     PARTITION_NAME
------------------------------ ---------------
BIN$u+Z2BwPsKwzgU7XMqMD9hQ==$0 P1
-- 可以看到在回收站打开状态下,drop table 未带purge删除整个分区表之后数据字典以及回收站均可以查询到被删除的分区表,只不过名称变成了BIN$开头命名。

4. 结论

1. 回收站开启,删除分区表单个分区,不会放入回收站,也就意味不可以通过flashback to before drop闪回单个分区,要慎重删除单个分区。
2. 回收站开启,删除整个分区表未使用purge,则分区表会放入回收站,由于放入回收站对象并未真正删除,可以通过flashback to before drop闪回,所以可以通过数据字典视图查询。
3. 建议迁移时关闭回收站,以防对迁移产生影响。

参考:

https://www.eygle.com/archives/2017/04/drop_partition_recyclebin.html

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