一、作用
- 若開啓了回收站功能,被刪除的表會先進入回收站且可以被恢復;
- 回收站若沒打開,想恢復誤刪的對象需要通過recovering from backup等方式進行恢復。
注意事項:關閉回收站不會Purge已經在回收站中的對象。
二、回收站操作
1.查看回收站內容
- 通過dba_recyclebin視圖可查看回收站內容;
- 回收站中的對象名爲BIN$打頭,可以單獨訪問:
SELECT * FROM "BIN$iB6Z3f+5QOGjw0iKVisLqg==$0"
2.開啓/關閉回收站
ALTER SESSION/SYSTEM SET recyclebin = OFF SCOPE = SPFILE;
ALTER SESSION/SYSTEM SET recyclebin = ON SCOPE = SPFILE;
SYSTEM級別修改的話記得重啓數據庫!
三、通過Purge刪除回收站的內容
- purge的用處:
1)將被刪除的表或者索引從回收站移除;
2)刪除整個回收站的內容;
3)某個表空間從回收站移除/將某個表空間中某個用戶的內容從回收站移除。
注意:其不可回退!!! - purge回收站的內容時候,對象名稱可以是原始對象名/對象被刪除時候分配的名字(即BIN$打頭)
1.purge table/index
1)purge+原始對象名
若回收站裏有多個該對象的記錄,系統會刪除存在時間最久的那條記錄。
eg.
① 新建表test12並刪除(重複兩次)
CREATE TABLE test12 (ID INT ,NAME VARCHAR(20));
DROP TABLE test12;
CREATE TABLE test12 (ID INT ,NAME VARCHAR(20));
DROP TABLE test12;
② 可以看到這張表在回收站裏有兩個版本的記錄:
③ 刪除回收站記錄:
PURGE TABLE TEST12;
④ 可以看到,時間更早的記錄被刪除,稍晚的一條還保留:
2)purge+系統生成對象名
可以直接刪除該對象($BIN打頭的對象名是唯一的)
purge table "BIN$45AAQxL7ToqPBYeUevning==$0" ;
---注意這裏是有雙引號的!!!
2.purge+表空間名
1)清除指定表空間:
PURGE TABLESPACE users
2)清除表空間中指定用戶的空間:
purge tablespace users user test;
3.purge+回收站名
1)清理當前用戶下的回收站:
PURGE recyclebin;
---這裏recyclebin就是user_recyclebin的同義詞,數據字典差不多都是這個套路
2)清理整個回收站:
PURGE dba_recyclebin;
四、通過recover恢復回收站的內容
1.通過對象名來恢復
FLASHBACK TABLE test12 TO BEFORE DROP RENAME TO xxx;
注意:若一張表被刪除多次,recover的是時間最新的一條記錄。
2.通過系統分配的BIN$名字來恢復
FLASHBACK TABLE "BIN$lDtXq9XET3uBQFMHEdQJag==$0" TO BEFORE DROP RENAME TO xxx;
注意:
這裏有個比較奇怪的情況。如果一張表上建有索引,將這張表recover後,索引名字恢復不了原來的名字,爲BIN$打頭,需要手動修改:
DROP TABLE test12;
FLASHBACK TABLE test12 TO BEFORE DROP;
SELECT * from Dba_Indexes WHERE TABLE_name='TEST12'
這裏看到dba_indexes表裏的INDEX_NAME還是舊的:
需要手動修改:
ALTER INDEX "BIN$vOK1sd8sS86Yvzbl4JVmTQ==$0" RENAME TO PK_TEST;
五、案例說明
該場景是爲了說明定期清理回收站釋放空間的必要性~
背景:數據庫中的users表空間數據文件佔用存儲太多,但是實際上利用率僅 0.06%,需要清理Users表空間大小。
PS:USERS表空間不要放用戶數據,我這個也是因爲本地測試環境之前手抖扔了數據進去,這個原理等我理解了再來補充~
1.查看錶空間使用率
可以看到users表空間的使用率才 0.06%,但是去服務器對應路徑查看USERS01.DBF數據文件發現大小達到了9GB。
2.收縮表空間
按以往習慣進行表空間收縮:
ALTER DATABASE DATAFILE 'H:\APPLICATIONS\ORACLE\PRODUCT\11.2.0\ORADATA\ORCL\USERS01.DBF' RESIZE 2000M
報錯ORA-03297:file contains used data beyond requested RESIZE value
於是又去清理了半天的各種東西,清了表請分區。。。
最後!發現!是回收站沒有清理啊哭。
回收站還是會佔用原來的表空間,只是對原來的對象進行重命名而已!務必注意!!!