1、oracle中有recyclebin表,用來保存用戶刪除的表的相關信息,相當於回收站。在recyclebin打開的情況下,用戶drop掉的對象並沒有被數據庫刪除,仍然會占用空間,除非用戶手工進行purge或因為存儲空間不夠而被數據庫清掉。
show parameter recyclebin;
--運行該SQL可以知道recyclebin這個表是否是開啟的
a、recycle bin有dba_recyclebin和user_recyclebin兩種視圖
dba_recyclebin放置所有用戶drop掉的對象,不含system表空間,包含以下字段
OWNER --drop掉的對象所屬的用戶 OBJECT_NAME --對象名,命名規范是BIN$unique_id$version,BIN代表RecycleBin,unique_id是數據庫中該對象的唯一標志,24個字符長度,version表示該對象的版本號 ORIGINAL_NAME --原始表名 OPERATION --操作,有drop TYPE --類型,有index、table、lob、lob index TS_NAME --用戶類型,有TS_ODS、USERS CREATETIME --創建時間 DROPTIME --drop時間 DROPSCN --drop的scn號 PARTITION_NAME CAN_UNDROP CAN_PURGE RELATED BASE_OBJECT PURGE_OBJECT SPACE
user_recyclebin放置當前用戶drop掉的對象,字段比 dba_recyclebin少了一個OWNER
b、利用flashback還原回收站內容
語法:FLASHBACK TABLE [已刪除TABLE名|”RECYCLEBIN中的名字”] TO BEFORE DROP;
flashback table "BIN$KI5DFtx9TnyUTUiZIuC8YA==$0" to before drop;
--這里是OBJECT_NAME,也可以是ORIGINAL_NAME
--再把這個表刪除了通過ORIGINAL_NAME恢復也是一樣的
flashback table sell to before drop;
--這里是ORIGINAL_NAME
c、如果有幾個的ORIGINAL_NAME都是一樣的,通過ORIGINAL_NAME恢復,只能恢復最后被drop掉的對象;若想明確某個對象就通過OBJECT_NAME恢復。
如果在數據庫中存在和回收站相同對象名的表時,恢復回收站的對象時需要rename對選哪個名。如數據庫中存在一個表名為atest,回收站中也存在一個atest
flashback table atest to before drop; --flashback table "BIN$6b6dC4BIR9CZLSfGZWvrVQ==$0" to before drop; --使用object_name或origin_name都會出現錯誤
flashback table atest to before drop rename to atest_bak;
--atest是原始名,atest_bak是重新的命名
d、清空回收站,之后不可以通過回收站恢復清空的數據
purge table stest;
--清空某個特定對象,stest是表名
purge user_recyclebin;
--purge dba_recyclebin;需要改用戶擁有系統權限,否則不允許清空
參考文章https://blog.csdn.net/u010098331/article/details/50782395