前幾天在給公司的員工講一個案例的提到這個問題。
其實當(dāng)時提到了這個特點,DROP TABLE會進入回收站,但是DROP PARTITION并不會,因此DROP PARTITION之后,數(shù)據(jù)無法簡單的回復(fù),只能通過邏輯或物理備份的方式來進行數(shù)據(jù)的回復(fù)。
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 tb 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為什么沒有實現(xiàn)將刪除分區(qū)放在回收站中。這個問題問的很好,因為如果這個功能很容易實現(xiàn),那么Oracle肯定早就實現(xiàn)了,而到了11.2中Oracle仍然沒有實現(xiàn)這個功能,那么一定說明這個功能不是無法實現(xiàn),就是實現(xiàn)的困難太大。
回收站的實現(xiàn)并不復(fù)雜,當(dāng)一張表被刪除的時候,Oracle沒有直接釋放表在表空間上的空間占用,而是將表簡單的打了個標(biāo)識,這樣在正常查詢數(shù)據(jù)字典時就不會看到這張被刪除的表,而如果需要恢復(fù)這張表時,只需要將標(biāo)識位改回來既可。
那么同樣是修改數(shù)據(jù)字典,為什么不能將被刪除的分區(qū)通過標(biāo)識的方法放到回收站中呢,這是因為,對于表而言,刪除操作是將一個整理完全刪除。而對于分區(qū)的刪除,是刪除整體中的一個部分。對于刪除這個動作其實并沒有太大的影響,但是回收站的功能不是為了刪除,而是為了可以快速的恢復(fù)。對表而言,直接恢復(fù)整體不存在任何的問題,即使同名對象存在,也只需改個名字既可。而對于刪除分區(qū)的恢復(fù)而言, tb 問題就不那么簡單了。由于分區(qū)表并沒有刪除,因此這個表仍然可以繼續(xù)進行操作,雖然某個分區(qū)被刪除了,但是除非是范圍分區(qū)中的MAXVALUE分區(qū)和列表分區(qū)中的DEFAULT分區(qū),否則再插入原分區(qū)對應(yīng)的數(shù)據(jù)時,并不會報錯,而是會插入到其他分區(qū)中:
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.
原表應(yīng)該插入分區(qū)P1的數(shù)據(jù),由于分區(qū)P1被刪除,因此現(xiàn)在滿足分區(qū)P2的條件,被插入到分區(qū)P2中,考慮這種情況下,如果直接恢復(fù)P1分區(qū)會怎樣。
顯然這不是一個簡單的數(shù)據(jù)字典的修改就能解決的問題,不但涉及到分區(qū)數(shù)據(jù)改變的問題,還必然會帶來全局和本地索引失效的問題,更重要的是,可能帶來主鍵沖突的情況。
這還只是分區(qū)表進行了DML的情況,如果刪除分區(qū)后,分區(qū)表又進行了DDL,比如新SPLIT了P1分區(qū),那么刪除分區(qū)的恢復(fù)操作就更無法進行了。
如果一個功能覺得很簡單就可以實現(xiàn),但是Oracle卻一直沒有實現(xiàn),那么很可能實現(xiàn)這個功能并不像想象的那么簡單。