首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 日常備份表清理與誤刪表閃回恢復實戰

     編輯:Oracle 資料庫相關知識

資料庫空間告急 (使用率 > 90%),發現大量歷史備份表 (_BAK、日期後綴) 佔用近 100GB。清理後第三天業務反映財務報表少分錄,追查為誤刪關鍵表。本文記錄完整清理流程與閃回恢復實戰,供同類場景參考。

一、清理日常備份表

1. 識別候選表

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。

2. 測試驗證

  • 測試環境同步執行 DROP TABLE。
  • 跑完整業務回歸測試 (批次、報表、介面)。
  • 無異常後提交變更單,走正式環境變更流程。

3. 正式執行

依變更單逐表 DROP TABLE ... PURGE (直接釋放空間,不進回收桶),操作間隔觀察告警。

二、誤刪表閃回恢復

1. 確認誤刪表在回收桶

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)。

2. 閃回恢復

FLASHBACK TABLE "BIN$AP6V8ohdAaLgU8CoZGEBog==$0" TO BEFORE DROP;

表瞬間恢復至刪除前狀態 (含索引、約束、權限)。

3. 驗證資料

SELECT COUNT(*) FROM t_csl_itemdataentry001;

確認筆數正確,業務驗證報表恢復正常。

三、關鍵知識點總結

知識點說明
RECYCLEBIN10g+ 預設開啟,DROP TABLE 不立即釋放空間,轉入回收桶 (命名 BIN$...)
PURGE 選項DROP TABLE t PURGE 直接永久刪除,不進回收桶;PURGE TABLESPACE ts 清空表空間回收桶
FLASHBACK TABLE ... TO BEFORE DROP從回收桶還原表,DDL 操作,極快 (元資料更新)
保留時間受表空間壓力觸發自動清理;可用 PURGE RECYCLEBIN 手動清空
權限需 FLASHBACK ANY TABLE 或為表擁有者

四、教訓與建議

  1. 清理前雙重確認:業務主管簽核表清單,標註「純備份/可刪除」。
  2. 分批執行:每批 5-10 表,觀察空間釋放、應用影響。
  3. 保留回收桶窗口:清理後至少保留 1-2 天再 PURGE,預留閃回時間。
  4. 監控回收桶大小:定期查詢 SELECT SUM(space) FROM dba_recyclebin; 避免佔用過大。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved