Oracle 9i R2 引入的 Flashback Query(閃回查詢)讓我們能以「時光機」模式查看歷史資料,無需傳統還原備份即可秒級恢復誤操作資料。本文以實戰步驟演示如何利用 SCN/時間點精準恢復表資料,並解釋關鍵限制與避坑指南。
FLASHBACK ON(預設開啟)。UNDO_RETENTION) 需覆蓋誤操作時間點。FLASHBACK ANY TABLE 或該表的 FLASHBACK 權限。-- 9i/10g 通用
SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;
-- 10g+ 專用視圖
SELECT CURRENT_SCN FROM V$DATABASE;
SELECT NAME, FIRST_CHANGE#, NEXT_CHANGE#, FIRST_TIME
FROM V$ARCHIVED_LOG
ORDER BY FIRST_TIME DESC;
此表每 5 分鐘刷新一次,保留 5 天(1440 筆),記錄 SCN 與時間的對應關係。注意:9i R2 中 Flashback 時間點與表屬性修改時間差至少需 5 分鐘,否則報 ORA-01466。
SELECT SCN, TIME_DP FROM SMON_SCN_TIME ORDER BY TIME_DP DESC;
CREATE TABLE student_recovery AS
SELECT * FROM student WHERE 1=0;
-- 方式 A:指定 SCN
SELECT COUNT(*) FROM student AS OF SCN 3154835;
-- 方式 B:指定時間點(需在 UNDO_RETENTION 內)
SELECT COUNT(*) FROM student AS OF TIMESTAMP TO_TIMESTAMP('2024-01-15 14:30:00', 'YYYY-MM-DD HH24:MI:SS');
-- 方式 C:查看具體資料內容
SELECT * FROM student AS OF SCN 3154835;
INSERT INTO student_recovery
SELECT * FROM student AS OF SCN 3154835;
COMMIT;
-- 對比筆數
SELECT COUNT(*) FROM student;
SELECT COUNT(*) FROM student_recovery;
-- 如需替換原表(謹慎操作,建議先備份)
-- RENAME student TO student_corrupt;
-- RENAME student_recovery TO student;
若需查看某筆資料在一段時間內的所有變更版本:
SELECT
VERSIONS_STARTSCN, VERSIONS_ENDSCN,
VERSIONS_OPERATION, -- I/U/D
VERSIONS_XID,
student.*
FROM student
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE id = 1001;
| 錯誤代碼 | 原因 | 解決方案 |
|---|---|---|
| ORA-01466 | 查詢 SCN 過舊,Undo 已被覆寫 | 增加 UNDO_RETENTION、擴大 Undo Tablespace、確保備份策略覆蓋 RPO |
| ORA-08180 | 指定 SCN 非有效閃回 SCN | 使用 V$FLASHBACK_DATABASE_STAT 確認最舊閃回 SCN |
| ORA-01555 | Snapshot too old(一致性讀失敗) | 同 ORA-01466 處理;長查詢考慮鎖定統計資訊 |
UNDO_RETENTION = 86400(1 天)以上,配合 RETENTION GUARANTEE。FLASHBACK TABLE student TO SCN 3154835; 無需中間表。FLASHBACK 權限。Flashback Query 是 Oracle 獨有的「後悔藥」,成本極低(僅消耗 Undo 空間)、速度極快(秒級)。掌握 SCN/時間點定位、Version Query 審計、Undo 容量規劃三大核心,即可從容應對 90% 的誤操作恢復場景。