oracle分區表徹底刪除的辦法
當對一個不再使用的分區表進行drop后,查詢user_tab_partitions視圖發現出現如下不規則的分區表表名:
SQL> select distinct table_name from user_tab_partitions;
BIN$l+Pv5l1jCMXgQKjAyQFA0A==$0
這樣很容易導致自己寫的"自動增加表的分區"的存過發生錯誤,因此為了避免再修改存過,只能把這些不規則的表名刪除才行.現提供如下方法徹底刪除這些不規則的表名.
其實當我們執行drop table tablename的時候,不是直接把表刪除掉,而是放在了回收站里,可以通過查詢user_recyclebin查看被刪除的表信息.這樣,回收站里的表信息就可以被恢復或徹底清除。
通過查詢回收站user_recyclebin獲取被刪除的表信息,如果想恢復被drop掉的表,可以使用如下語句進行恢復
flashback table <user_recyclebin.object_name or user_recyclebin.original_name> to before drop;
上面的語句是將回收站里的表恢復為原表名稱
flashback table <user_recyclebin.object_name or user_recyclebin.original_name> to before drop rename to <new_table_name>;
將回收站里的表恢復為指定的新表名稱,表中數據不會丟失。
若要徹底刪除表,則使用語句:drop table <table_name> purge;這樣drop后的表就不被放入回收站
如果是清除回收站中指定的表,可以使用語句purge table <table_name>;
如果是清除當前用戶回收站所有的表,可以使用語句purge recyclebin;
如果是清除所有用戶的回收站:purge dba_recyclebin;
到此,按上面的方法清除回收站的數據后,再查詢user_tab_partitions視圖,發現不規則表名已經沒有了
SQL> select distinct table_name from user_tab_partitions;
no rows selected
在此順便再提一下truncate操作后不釋放空間的解決辦法
Truncate不支持回滾,并且不能truncate一個帶有外鍵的表,如果要刪除首先要取消外鍵,然后再刪除。
truncate table 后,有可能表空間仍沒有釋放,可以使用如下語句:
alter table 表名稱 deallocate UNUSED KEEP 0;
注意如果不加KEEP 0的話,表空間是不會釋放的。
例如:
alter table tablename deallocate UNUSED KEEP 0;
或者:
TRUNCATE TABLE tablename DROP STORAGE才能釋放表空間。
例如: truncate table tablename DROP STORAGE;