誤刪表資料時,切勿對該表進行任何 DML/DDL,立即採用下列方法將資料恢復至誤刪前的時間點。
-- 建立 3 小時前的資料備份表,排除特定條件 CREATE TABLE tabletest_2014bak NOLOGGING AS SELECT * FROM tabletest AS OF TIMESTAMP SYSDATE - 21/24 -- 21/24 = 3.5 小時 WHERE name != 'boat';
AS OF TIMESTAMP:閃回查詢語法,讀取指定 SCN/時間點的資料版本。NOLOGGING:減少 REDO 產生,加速大量建表。-- 1. 啟用列移動 (SHRINK/FLASHBACK 必備)
ALTER TABLE tabletest ENABLE ROW MOVEMENT;
-- 2. 閃回至精確時間點 (需早於當前時間)
FLASHBACK TABLE tabletest
TO TIMESTAMP TO_TIMESTAMP('2014-12-30 17:00:00', 'YYYY-MM-DD HH24:MI:SS');
ENABLE ROW MOVEMENT:允許行在區塊間移動,閃回過程中會重組 ROWID。TO SCN 12345678。UNDO_RETENTION 需涵蓋目標時間點;確認 V$UNDOSTAT 中 MAXQUERYLEN 足夠。FLASHBACK ON(表空間層級)或資料庫啟用 FLASHBACK DATABASE。FLASHBACK ANY TABLE 或表擁有者權限。SHUTDOWN IMMEDIATE; STARTUP MOUNT; FLASHBACK DATABASE TO TIMESTAMP SYSDATE - 1/24; -- 1 小時前 ALTER DATABASE OPEN RESETLOGS;
需預先啟用 DB_FLASHBACK_RETENTION_TARGET、快速復原區、ARCHIVELOG 模式。