Oracle管理 | 回收站

一、作用

  • 若開啓了回收站功能,被刪除的表會先進入回收站且可以被恢復;
  • 回收站若沒打開,想恢復誤刪的對象需要通過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

於是又去清理了半天的各種東西,清了表請分區。。。
最後!發現!是回收站沒有清理啊哭。
回收站還是會佔用原來的表空間,只是對原來的對象進行重命名而已!務必注意!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章