DROP PARTITION為什麼不進回收站
前幾天在給公司的員工講一個案例的提到這個問題。
其實當時提到了這個特點,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.2中Oracle仍然沒有實現這個功能,那麼一定說明這個功能不是無法實現,就是實現的困難太大。
回收站的實現並不複雜,當一張表被刪除的時候,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,比如新SPLIT了P1分割槽,那麼刪除分割槽的恢復操作就更無法進行了。
如果一個功能覺得很簡單就可以實現,但是Oracle卻一直沒有實現,那麼很可能實現這個功能並不像想象的那麼簡單。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-735250/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- audit drop table為什麼不行
- Http 檔案上傳進度為什麼不準HTTP
- Oracle回收站及flashback drop(上)Oracle
- Oracle回收站及flashback drop(下)Oracle
- win10這麼設定不進入回收站_win10檔案直接刪除不進入回收站如何操作Win10
- Oracle drop,truncate partition 索引失效 實驗Oracle索引
- oracle為什麼不走索引Oracle索引
- 聊聊分割槽Partition——我們為什麼要分割槽(下)
- 聊聊分割槽Partition——我們為什麼要分割槽(中)
- 聊聊分割槽Partition——我們為什麼要分割槽(上)
- 為什麼不建議在for迴圈中使用"+"進行字串拼接字串
- []==''返回?為什麼?運算子==進行了什麼操作?
- 你為什麼不愛遊戲了?遊戲
- 騰訊為什麼不投資技術?
- 我為什麼不喜歡框架框架
- 為什麼 useState 多次更新不生效?
- 為什麼不建議使用gotoGo
- 為什麼不建議使用eval和with?
- 為什麼有些公司不讓用 Lombok ?Lombok
- 網站為什麼會打不開網站
- 為什麼margin-right不生效
- 為什麼java不推薦使用vectorJava
- 為什麼新人不會程式設計程式設計
- ViewGroup為什麼不會呼叫onDrawView
- 為什麼前端開發這麼不穩定?前端
- AI畫家的「滑鐵盧」:為什麼冰可樂不願意住進茶杯裡?AI
- DNS解析為什麼不生效?DNS解析不生效原因分析DNS
- 我的遊戲這麼好玩,為什麼賣不動?遊戲
- win10回收站清不空怎麼辦 windows10回收站清空不了怎麼辦Win10Windows
- 日本玩家為什麼不喜歡PVP遊戲?遊戲
- 為什麼說Docker 不適合跑 MySQL?DockerMySql
- SQL語句為什麼不會共享(上)SQL
- SQL語句為什麼不會共享(中)SQL
- SQL語句為什麼不會共享(下)SQL
- 為什麼Facebook不會有“dislike”按鈕?
- 為什麼Joel不談軟體了?
- 我做的網頁為什麼不漂亮?網頁
- 為什麼我的mysql配不起來MySql