DROP PARTITION為什麼不進回收站

yangtingkun發表於2012-07-07

前幾天在給公司的員工講一個案例的提到這個問題。

 

 

其實當時提到了這個特點,DROP TABLE會進入回收站,但是DROP PARTITION並不會,因此DROP PARTITION之後,資料無法簡單的回覆,只能透過邏輯或物理備份的方式來進行資料的回覆。

SQL> create table t_drop (id number);

Table created.

SQL> drop table t_drop;

Table dropped.

SQL> select object_name, original_name from recyclebin;

OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$xJhZqpmfWZXgRDzZK0pZWw==$0 T_DROP

SQL> create table t_part_drop (id number) partition by range (id)
2 (partition p1 values less than (10),
3 partition p2 values less than (20),
4 partition p3 values less than (30),
5 partition pmax values less than (maxvalue));

Table created.

SQL> insert into t_part_drop select rownum from user_objects;

176 rows created.

SQL> commit;

Commit complete.

SQL> alter table t_part_drop drop partition p1;

Table altered.

SQL> select object_name, original_name from recyclebin;

OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$xJhZqpmfWZXgRDzZK0pZWw==$0 T_DROP

本來只是普及一下這個常識,不過有人問我Oracle為什麼沒有實現將刪除分割槽放在回收站中。這個問題問的很好,因為如果這個功能很容易實現,那麼Oracle肯定早就實現了,而到了11.2Oracle仍然沒有實現這個功能,那麼一定說明這個功能不是無法實現,就是實現的困難太大。

回收站的實現並不複雜,當一張表被刪除的時候,Oracle沒有直接釋放表在表空間上的空間佔用,而是將表簡單的打了個標識,這樣在正常查詢資料字典時就不會看到這張被刪除的表,而如果需要恢復這張表時,只需要將標識位改回來既可。

那麼同樣是修改資料字典,為什麼不能將被刪除的分割槽透過標識的方法放到回收站中呢,這是因為,對於表而言,刪除操作是將一個整理完全刪除。而對於分割槽的刪除,是刪除整體中的一個部分。對於刪除這個動作其實並沒有太大的影響,但是回收站的功能不是為了刪除,而是為了可以快速的恢復。對錶而言,直接恢復整體不存在任何的問題,即使同名物件存在,也只需改個名字既可。而對於刪除分割槽的恢復而言,問題就不那麼簡單了。由於分割槽表並沒有刪除,因此這個表仍然可以繼續進行操作,雖然某個分割槽被刪除了,但是除非是範圍分割槽中的MAXVALUE分割槽和列表分割槽中的DEFAULT分割槽,否則再插入原分割槽對應的資料時,並不會報錯,而是會插入到其他分割槽中:

SQL> select * from t_part_drop partition (p2);

        ID
----------
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19

10 rows selected.

SQL> insert into t_part_drop values (5);

1 row created.

SQL> select * from t_part_drop partition (p2);

        ID
----------
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
         5

11 rows selected.

原表應該插入分割槽P1的資料,由於分割槽P1被刪除,因此現在滿足分割槽P2的條件,被插入到分割槽P2中,考慮這種情況下,如果直接恢復P1分割槽會怎樣。

顯然這不是一個簡單的資料字典的修改就能解決的問題,不但涉及到分割槽資料改變的問題,還必然會帶來全域性和本地索引失效的問題,更重要的是,可能帶來主鍵衝突的情況。

這還只是分割槽表進行了DML的情況,如果刪除分割槽後,分割槽表又進行了DDL,比如新SPLITP1分割槽,那麼刪除分割槽的恢復操作就更無法進行了。

如果一個功能覺得很簡單就可以實現,但是Oracle卻一直沒有實現,那麼很可能實現這個功能並不像想象的那麼簡單。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-735250/,如需轉載,請註明出處,否則將追究法律責任。

相關文章