COMMITUNDO_RETENTION) 覆蓋誤操作時間點AUTOMATIC UNDO MANAGEMENT 運行COL fscn FOR 9999999999999999999
COL nscn FOR 9999999999999999999
SELECT name, FIRST_CHANGE# fscn, NEXT_CHANGE# nscn, FIRST_TIME
FROM v$archived_log ORDER BY FIRST_TIME;
對照歸檔日誌的 FIRST_CHANGE# (起始 SCN) 與 FIRST_TIME,鎖定誤操作前的 SCN 區間。
SELECT dbms_flashback.get_system_change_number FROM dual;
-- 建立恢復表結構
CREATE TABLE hs_passport_recov AS SELECT * FROM hs_passport WHERE 1=0;
-- 測試不同 SCN 的資料量
SELECT COUNT(*) FROM hs_passport AS OF SCN 12929941968; -- 861684 行
SELECT COUNT(*) FROM hs_passport AS OF SCN 12929928784; -- 825110 行
關鍵技巧:若知悉確切誤操作時間,可用 AS OF TIMESTAMP 語法更直觀:
SELECT * FROM hs_passport
AS OF TIMESTAMP TO_TIMESTAMP('2024-06-22 14:38:00', 'YYYY-MM-DD HH24:MI:SS');
INSERT INTO hs_passport_recov
SELECT * FROM hs_passport AS OF SCN 12929941968;
COMMIT;
-- 啟用列追蹤 (需一次)
ALTER TABLE hs_passport ENABLE ROW MOVEMENT;
-- 一鍵恢復至指定 SCN/時間
FLASHBACK TABLE hs_passport TO SCN 12929941968;
-- 或
FLASHBACK TABLE hs_passport TO TIMESTAMP SYSDATE - 1/24; -- 1 小時前
| 錯誤 | 原因 | 對策 |
|---|---|---|
| ORA-01466: unable to read data | SCN 過舊,UNDO 已被覆寫 | 縮短恢復時間窗;增大 UNDO 表空間與 UNDO_RETENTION |
| ORA-08180: no snapshot found | 表結構在目標 SCN 後有 DDL 變更 | 使用較新 SCN;或配合 Flashback Database (需啟用) |
| 權限不足 | 缺乏 FLASHBACK ANY TABLE 或物件權限 | GRANT FLASHBACK ON hs_passport TO user; |
UNDO_RETENTION ≥ 業務容忍的最大恢復窗口(建議 ≥ 24 小時)ROW MOVEMENT 支援 Flashback TableFLASHBACK TRANSACTION QUERY 審計誤操作 SQL