設定 NOLOGGING 可大幅降低大量資料操作的 Redo 產生,但並非所有操作都受惠,且伴隨備份失效風險。本文整理實測結果。
| 操作類型 | 語法範例 | Redo 產生行為 |
|---|---|---|
| 索引建立/重建 | CREATE INDEX ... NOLOGGINGALTER INDEX ... REBUILD NOLOGGING | 極少 Redo (僅元數據) |
| 直接路徑插入 | INSERT /*+ APPEND */ INTO ... SELECT ...SQL*Loader DIRECT=TRUE | 表資料極少 Redo,**但索引維護仍產生大量 Redo** |
| LOB 操作 | UPDATE ... SET lob_col = ... (SecureFiles) | 可選擇不產生 Redo |
| CTAS 建表 | CREATE TABLE t2 NOLOGGING AS SELECT * FROM t1 | 極少 Redo |
| ALTER TABLE 移動/分割 | ALTER TABLE ... MOVE NOLOGGINGALTER TABLE ... SPLIT PARTITION ... NOLOGGING | 極少 Redo |
INSERT/UPDATE/DELETE 無 APPEND hint) → 永遠產生 RedoNOLOGGING,索引預設 LOGGING)TRUNCATE 仍產生少量 Redo)-- 歸檔模式 SQL> @redo.sql -- 查詢 session redo size SQL> CREATE TABLE t2 AS SELECT * FROM t1; -- redo +8.5M SQL> CREATE TABLE t3 NOLOGGING AS SELECT * FROM t1; -- redo +0.15M (顯著減少) -- 非歸檔模式 SQL> @redo.sql SQL> CREATE TABLE t4 AS SELECT * FROM t1; -- redo +0.19M SQL> CREATE TABLE t5 NOLOGGING AS SELECT * FROM t1; -- redo +0.10M (差異微小)
在 非歸檔模式 下,Oracle 已自動最小化上述操作的 Redo,
NOLOGGING關鍵字效果有限;歸檔模式 下效果顯著。
所有支援 NOLOGGING 的操作共同特徵:產生全新的資料區塊,或完整覆寫舊區塊。
INSERT APPEND:直接在 High Water Mark 以上寫入新區塊。CTAS/MOVE:分配新區塊,寫入完整資料。LOB 更新:永遠在新區塊寫入新版本。反之,一般 DML 可能只修改區塊內部分位元組,必須記錄前後映像以支援恢復。
| 風險 | 影響 | 緩解措施 |
|---|---|---|
| 備份失效 | RMAN 備份包含 NOLOGGING 操作的資料檔,恢復時該段資料損壞 | 操作後立即執行 Level 0 備份;或啟用 FORCE LOGGING (資料庫/表空間層級) |
| Data Guard 同步中斷 | 備庫無法應用 NOLOGGING 變更,導致備庫資料不一致 | 主庫操作後手動同步受影響資料檔;或使用 ALTER DATABASE FORCE LOGGING |
| 索引 Redo 仍大 | 表 NOLOGGING 但索引預設 LOGGING | 索引同步建立 NOLOGGING,或操作後 REBUILD NOLOGGING |
NOLOGGING + APPEND,窗口結束後立即 Level 0 備份。FORCE LOGGING 保護備份恢復能力。ALTER TABLE ... MOVE NOLOGGING 後緊接 ALTER INDEX ... REBUILD NOLOGGING + 備份。