資料庫空間告急 (使用率 > 90%),發現大量歷史備份表 (_BAK、日期後綴) 佔用近 100GB。清理後第三天業務反映財務報表少分錄,追查為誤刪關鍵表。本文記錄完整清理流程與閃回恢復實戰,供同類場景參考。
SELECT owner,
num_rows * avg_row_len AS est_bytes,
table_name
FROM dba_tables
WHERE table_name LIKE '%BAK%'
AND REGEXP_LIKE(table_name, '\d+') -- 含數字後綴 (如日期)
AND table_name NOT LIKE 'T_IM_INVENTORY%'
AND table_name NOT LIKE 'VT%'
AND table_name NOT LIKE 'NCM%'
AND table_name NOT LIKE 'T_HR_SCHM%'
AND table_name NOT LIKE 'SYS%'
AND owner = 'JINGYA';
排除業務核心表前綴,鎖定純備份表。統計預估佔用 ~100GB。
DROP TABLE。依變更單逐表 DROP TABLE ... PURGE (直接釋放空間,不進回收桶),操作間隔觀察告警。
SELECT object_name, original_name, partition_name, type,
ts_name, createtime, droptime
FROM recyclebin
WHERE original_name = 'T_CSL_ITEMDATAENTRY001';
記錄 object_name (系統產生名,如 BIN$AP6V8ohdAaLgU8CoZGEBog==$0)。
FLASHBACK TABLE "BIN$AP6V8ohdAaLgU8CoZGEBog==$0" TO BEFORE DROP;
表瞬間恢復至刪除前狀態 (含索引、約束、權限)。
SELECT COUNT(*) FROM t_csl_itemdataentry001;
確認筆數正確,業務驗證報表恢復正常。
| 知識點 | 說明 |
|---|---|
| RECYCLEBIN | 10g+ 預設開啟,DROP TABLE 不立即釋放空間,轉入回收桶 (命名 BIN$...) |
| PURGE 選項 | DROP TABLE t PURGE 直接永久刪除,不進回收桶;PURGE TABLESPACE ts 清空表空間回收桶 |
| FLASHBACK TABLE ... TO BEFORE DROP | 從回收桶還原表,DDL 操作,極快 (元資料更新) |
| 保留時間 | 受表空間壓力觸發自動清理;可用 PURGE RECYCLEBIN 手動清空 |
| 權限 | 需 FLASHBACK ANY TABLE 或為表擁有者 |
PURGE,預留閃回時間。SELECT SUM(space) FROM dba_recyclebin; 避免佔用過大。