現(xiàn)象
最近oracle數(shù)據(jù)庫空間告警,對(duì)表空間使用情況進(jìn)行查詢時(shí)菱鸥,發(fā)現(xiàn)有表名類似于<code>BIN$UPoITd+QCAPgTCqElzEbhg==$0</code>的表铆帽,這種類型的表是如何來的胞枕?能否進(jìn)行刪除压真?
講知識(shí)
執(zhí)行<code>DROP TABLE tableA</code>后會(huì)產(chǎn)生類似于<code>BIN$UPoITd+QCAPgTCqElzEbhg==$0</code>的文件名徘六,這部分已刪除的文件是能夠繼續(xù)進(jìn)行刪除的。
已刪除的文件為何會(huì)成為<code>BIN$UPoITd+QCAPgTCqElzEbhg==$0</code>這樣的文件呢榴都?是因?yàn)樵诂F(xiàn)在用的ORACLE中,存在回收站(Recycle Bin)這個(gè)玩意漠其。
回收站
回收站是Oracle10g開始引入的一個(gè)概念
- 表刪除后嘴高,該表所占用的空間不會(huì)立即清空,而是將表相關(guān)信息(不是表數(shù)據(jù))存入到回收站中和屎。
- 回收站不單獨(dú)劃分存儲(chǔ)區(qū)域拴驮,它以現(xiàn)有的表空間為基礎(chǔ),存放已經(jīng)drop的表的信息柴信。
- 回收站的存在套啤,有助于將誤drop的表進(jìn)行閃回(Flash Back)回退恢復(fù)
- 如果想要完全drop掉表并釋放表占用空間,使用<code>DROP TABLE tableA purge</code>
- 如果表空間足夠随常,不使用purge進(jìn)行DROP的表會(huì)一直存放在回收站中
- 當(dāng)表空間緊張時(shí)潜沦,數(shù)據(jù)庫會(huì)按照先進(jìn)先出原則萄涯,覆蓋回收站中數(shù)據(jù),被覆蓋的數(shù)據(jù)無法通過回收站閃回
查看回收站狀態(tài)
回收站開啟/關(guān)閉
查看回收站狀態(tài):VALUE為on表示開啟唆鸡,off為關(guān)閉
SELECT * FROM V$PARAMETER WHERE NAME='recyclebin';
關(guān)閉回收站
ALTER SESSION SET RECYCLEBIN=OFF;
打開回收站
ALTER SESSION SET RECYCLEBIN =ON;
查看回收站中表信息
SELECT * FROM USER_RECYCLEBIN;
RECYCLEBIN NAME的命名規(guī)則為BIN$GUID$Version其中GUID為GlobalUID涝影,是一個(gè)全局唯一、24個(gè)字符長(zhǎng)的標(biāo)識(shí)對(duì)象争占,它是ORACLE內(nèi)部使用的標(biāo)識(shí)燃逻。其中$version是ORACLE數(shù)據(jù)庫分配的版本號(hào)。
閃回DROP表數(shù)據(jù)
FLASHBACK TABLE tableA TO BEFORE DROP;
如果tableA刪除多次臂痕,使用只會(huì)閃回tableA最后一次刪除的數(shù)據(jù)(后進(jìn)先出原則)伯襟。
若多次執(zhí)行上述閃回命令,會(huì)報(bào)ORA-38312錯(cuò)誤握童。ORA-38312錯(cuò)誤原因在于已存在表名為tableA的表姆怪,解決該錯(cuò)誤方案為:閃回時(shí)將表改名
FLASHBACK TABLE tableA TO BEFORE DROP RENAME TO tableA_2;
如果想要將多次刪除的表,其中某次的數(shù)據(jù)恢復(fù)舆瘪,可以直接指定OBJECT_NAME進(jìn)行閃回
FLASHBACK TABLE "BIN$UPoITd+QCAPgTCqElzEbhg==$0" TO BEFORE DROP;
清除回收站
可以通過<code>DROP TABLE tableA purge</code>直接刪除表片效,不進(jìn)入回收站
對(duì)于已進(jìn)入回收站的,可以通過表名或刪除后在回收站中OBJECT_NAME名字進(jìn)行刪除
PURGE TABLE tableA;
PURGE TABLE "BIN$UPoITd+QCAPgTCqElzEbhg==$0";
執(zhí)行上述命令會(huì)將表上所有相關(guān)對(duì)象英古,如索引淀衣、約束等全部刪除。
如果只想刪除索引而將表數(shù)據(jù)保留召调,則可以使用
PURGE INDEX idx_tableA;
也可以根據(jù)表空間名稱膨桥,將回收站中該表空間記錄刪除
PURGE TABLESPACE tableA_SPACE;
也可以在上述命令中再加以限定,根據(jù)表空間名稱與該表空間中用戶進(jìn)行刪除
PURGE TABLESPACE tableA_SPACE USER userName;
要釋放當(dāng)前用戶所有回收站中信息
PURGE RECYCLEBIN;
上述命令只清除當(dāng)前用戶回收站信息唠叛,如果要將所有回收站清空只嚣,需要DBA權(quán)限執(zhí)行以下命令
PURGE DBA_RECYCLEBIN;
重點(diǎn)
- 表的參考約束不會(huì)被恢復(fù),指向該對(duì)象的外鍵約束需要重建
- 如果該DROP表所占空間已被覆蓋艺沼,則該表不可恢復(fù)
- 刪除表時(shí)册舞,該表上的視圖也會(huì)被刪除,但由于視圖不會(huì)放到回收站中障般,在執(zhí)行FLASHBACK時(shí)視圖不會(huì)恢復(fù)
- 對(duì)于回收站中表對(duì)象调鲸,只支持查詢,不支持其他DML挽荡、DDL操作