日誌序列號在每次線上重做日誌切換時遞增。基於序列號的恢復適合「恢復至某次日誌切換之前」的場景,操作直觀且不需換算時間或 SCN。
SQL> SELECT SEQUENCE#, NAME, FIRST_CHANGE# FROM V$ARCHIVED_LOG WHERE STATUS='A' ORDER BY SEQUENCE#;
透過多次 INSERT、COMMIT、SWITCH LOGFILE、CHECKPOINT 觀察序列號 1→2→3 的生成過程,確認誤操作發生在序列號 3 生成後。
RMAN> RUN {
STARTUP FORCE MOUNT;
SET UNTIL SEQUENCE 3;
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
}
關鍵語義: SET UNTIL SEQUENCE 3 表示「恢復至序列號 3 開始之前」,因此序列號 3 所含交易(Oracle_seq3_act)不會被應用。
SQL> SELECT * FROM t_user;
TEXT
--------------------
Java_
spring_
Oracle_
Oracle_seq3
spring mvc_
資料包含序列號 2 結束前的所有交易,序列號 3 的交易(Oracle_seq3_act)已被排除,驗證成功。
| 方式 | 精度 | 適用場景 | 取得目標值難度 |
|---|---|---|---|
| 時間點 | 秒級 | 已知大約錯誤時間 | 低(人工記錄) |
| SCN | 交易級 | 需精確排除特定交易 | 中(需 LogMiner) |
| 日誌序列號 | 日誌檔級 | 已知誤操作在某次日誌切換後 | 低(查詢 V$ARCHIVED_LOG) |
SET UNTIL SEQUENCE n 恢復至序列號 n 開始前,若需包含序列號 n,請使用 SET UNTIL SEQUENCE n+1。基於日誌序列號的恢復操作最直觀,適合 DBA 在壓力下快速決策。熟練掌握 V$ARCHIVED_LOG 查詢與 SET UNTIL SEQUENCE 語法,配合 SCN/時間點恢復,構建完整的 RMAN 恢復工具箱。