11g 回收站核心參數變化:DEFERRED vs IMMEDIATE
| 版本 | 參數名 | 資料型別 | Session 可修改 | System 修改生效 |
| 10.2.0 | recyclebin | String | TRUE | IMMEDIATE (立即影響所有 Session) |
| 11.1.0 | recyclebin | String | TRUE | DEFERRED (僅影響新連接 Session) |
實務影響:11g 中 ALTER SYSTEM SET RECYCLEBIN=OFF **不會關閉當前已連接 Session 的回收站功能**,需重新連接生效。這避免了生產環境動態關閉導致正在執行的 DROP 操作行為不一致。
閃回資料庫架構演進:Undo vs Flashback Data Archive (FDA)
| 特性 | 傳統閃回 | Oracle 11g FDA |
| 儲存基礎 | Undo Segment (Undo 表空間) | 獨立 **Flashback Archive 表空間** |
| 保留期限制 | 受 UNDO_RETENTION 限制 (通常小時級) | **獨立保留策略** (可設年級:RETENTION 1 YEAR) |
| 空間管理 | 共用 Undo 表空間,競爭激烈 | 專用空間,可設 QUOTA、自動清理 |
| 對主業務影響 | 長保留導致 Undo 膨脹、Snapshot Too Old | **零影響**,完全隔離 |
| 啟用對象 | 資料庫級 | **表級** (FLASHBACK ARCHIVE) |
FDA 建立與啟用流程
-- 1. 建立專用表空間 (建議大檔案、自動擴展)
CREATE BIGFILE TABLESPACE fba_ts
DATAFILE '/u01/oradata/ORCL/fba_ts01.dbf' SIZE 10G AUTOEXTEND ON NEXT 1G MAXSIZE 100G;
-- 2. 建立 Flashback Archive
CREATE FLASHBACK ARCHIVE fba_1yr
TABLESPACE fba_ts
RETENTION 1 YEAR -- 保留 1 年
QUOTA 50G; -- 空間配額
-- 3. 為表啟用 FDA
ALTER TABLE important_table FLASHBACK ARCHIVE fba_1yr;
-- 4. 查詢歷史版本 (AS OF TIMESTAMP/SCN)
SELECT * FROM important_table AS OF TIMESTAMP SYSDATE - 30; -- 30 天前版本
SELECT * FROM important_table VERSIONS BETWEEN TIMESTAMP SYSDATE-7 AND SYSDATE; -- 週內所有版本
回收站核心操作實戰
啟用閃回資料庫前置條件
-- 1. 歸檔模式 (必須)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
-- 2. 配置快速恢復區 (FRA)
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = '/u01/fra' SCOPE=BOTH;
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 50G SCOPE=BOTH;
-- 3. 設定閃回保留目標 (分鐘,預設 1440=1 天)
ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET = 2880 SCOPE=BOTH; -- 2 天
-- 4. 啟用閃回資料庫
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE FLASHBACK ON;
ALTER DATABASE OPEN;
執行閃回資料庫操作
-- 閃回到指定時間點
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
FLASHBACK DATABASE TO TIMESTAMP TO_DATE('2024-01-15 10:00','YYYY-MM-DD HH24:MI:SS');
-- 或閃回到 SCN
FLASHBACK DATABASE TO SCN 1234567890;
-- 唯讀驗證
ALTER DATABASE OPEN READ ONLY;
-- 確認資料正確後
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE OPEN RESETLOGS; -- 必須 RESETLOGS 重置 SCN
回收站查詢與表恢復
-- 查看當前用戶回收站
SHOW RECYCLEBIN;
-- 或
SELECT * FROM RECYCLEBIN;
-- 查看所有用戶回收站 (需 DBA 權限)
SELECT * FROM DBA_RECYCLEBIN;
-- 恢復被 DROP 的表 (原名)
FLASHBACK TABLE t_name TO BEFORE DROP;
-- 恢復並重命名 (避免名稱衝突)
FLASHBACK TABLE t_name TO BEFORE DROP RENAME TO t_name_restored;
-- 直接按回收站物件名恢復 (BIN$... 格式)
FLASHBACK TABLE "BIN$qrjyuHuVotHgQAB/AQAQ3w==$0" TO BEFORE DROP;
繞過回收站永久刪除
-- 表級
DROP TABLE t_name PURGE;
-- 用戶級 (含所有對象)
DROP USER username CASCADE;
-- 表空間級
DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;
清空回收站釋放空間
-- 清空特定索引
PURGE INDEX idx_name;
-- 清空當前用戶回收站
PURGE RECYCLEBIN;
-- 或
PURGE USER_RECYCLEBIN;
-- 清空所有用戶回收站 (需 SYSDBA)
PURGE DBA_RECYCLEBIN;
閃回恢復區 (FRA) 空間監控與管理
查看 FRA 使用情況
-- 檔案類型佔用
SELECT FILE_TYPE, PERCENT_SPACE_USED, PERCENT_SPACE_RECLAIMABLE, NUMBER_OF_FILES
FROM V$FLASH_RECOVERY_AREA_USAGE;
-- 計算總佔用百分比
SELECT SUM(PERCENT_SPACE_USED) * 3 / 100 AS TOTAL_PCT_USED -- 近似計算
FROM V$FLASH_RECOVERY_AREA_USAGE;
-- 詳細檔案清單
SELECT NAME, SPACE_USED, SPACE_RECLAIMABLE, NUMBER_OF_FILES
FROM V$RECOVERY_FILE_DEST;
FRA 空間不足導致資料庫 Hang/無法開啟的緊急處理
-- 緊急擴大 FRA 空間 (需實例運行)
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 100G SCOPE=BOTH; -- SPFILE 生效
-- 或臨時移動/刪除舊備份/歸檔 (RMAN)
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
RMAN> DELETE OBSOLETE;
關鍵視圖與監控指標
| 視圖 | 用途 | 關鍵欄位 |
V$FLASHBACK_DATABASE_LOG | 閃回日誌空間、最早可閃回 SCN/時間 | OLDEST_FLASHBACK_SCN, OLDEST_FLASHBACK_TIME, ESTIMATED_FLASHBACK_SIZE |
V$FLASH_RECOVERY_AREA_USAGE | FRA 各檔案類型空間佔用 | FILE_TYPE, PERCENT_SPACE_USED, PERCENT_SPACE_RECLAIMABLE |
V$DATABASE | 當前 SCN、閃回狀態 | CURRENT_SCN, FLASHBACK_ON |
RECYCLEBIN / DBA_RECYCLEBIN | 回收站物件清單 | OBJECT_NAME, ORIGINAL_NAME, TYPE, DROPTIME, CAN_UNDROP |
總結
Oracle 11g 將回收站參數修改改為 **DEFERRED** 生效,保護現有 Session 一致性。**FDA (Flashback Data Archive) 徹底解決了長期歷史版本查詢與 Undo 空間衝突**,實現表級、年級保留。**回收站 + 閃回資料庫 + FDA** 構成三層防護:**誤 DROP 表 → 回收站秒級恢復;誤批次更新 → 閃回資料庫分鐘級恢複;合規審計/歷史分析 → FDA 年級查詢**。DBA 必須掌握 FRA 空間監控與緊急擴容,避免空間耗盡導致資料庫不可用。