Redo Log 是 Oracle 恢復機制的基石,但大量資料載入時,Redo 產生會成為效能瓶頸。Oracle 提供 NOLOGGING 選項,讓特定 DDL 與直接載入操作跳過 Redo 產生(僅記錄最少元資料),大幅提升速度。本文整理所有支援 NOLOGGING 的操作類型、使用限制與風險控制。
INSERT/UPDATE/DELETE) 無法 禁止 Redo,這是 ACID 基礎NOLOGGING,新分配的 Extent 標記為 Invalid(無 Redo 保護)| 操作類型 | 語法範例 | 說明 |
|---|---|---|
| 建表即查詢 (CTAS) | CREATE TABLE t2 NOLOGGING AS SELECT * FROM t1; | 新表初始載入不產生 Redo |
| 建立索引 | CREATE INDEX idx_t_col NOLOGGING ON t(col); | 索引建立過程不記 Redo |
| 直接路徑載入 (SQL*Loader) | sqlldr ... DIRECT=TRUE | 繞過 SQL 層直接寫入資料塊 |
| 直接路徑 INSERT (APPEND Hint) | INSERT /*+ APPEND */ INTO t SELECT * FROM src; | 高水位線以上直接寫入,需表設 NOLOGGING |
| 分區移動 | ALTER TABLE t MOVE PARTITION p1 NOLOGGING; | 分區重組 |
| 分區分割 | ALTER TABLE t SPLIT PARTITION p1 ... NOLOGGING; | 分區拆分 |
| 索引分割 | ALTER INDEX idx SPLIT PARTITION ... NOLOGGING; | 索引分區拆分 |
| 索引重建 | ALTER INDEX idx REBUILD NOLOGGING; | 整體或分區重建 |
| 索引分區重建 | ALTER INDEX idx REBUILD PARTITION p1 NOLOGGING; | 局部重建 |
| LOB 操作 (NOCACHE NOLOGGING) | INSERT/UPDATE/DELETE ON LOB ... STORE AS (NOCACHE NOLOGGING) | 行外儲存的 LOB 欄位 |
-- 1. 表/索引/分區必須設定 NOLOGGING 屬性
ALTER TABLE t NOLOGGING;
ALTER INDEX idx NOLOGGING;
-- 2. 直接路徑 INSERT 需滿足條件:
-- - 表設定 NOLOGGING
-- - 使用 APPEND Hint (或 PARALLEL DML)
-- - 無觸發器、外鍵、檢查約束
-- - 非叢集表、非物化視圖
| 風險場景 | 後果 | 對策 |
|---|---|---|
| NOLOGGING 操作後發生媒體故障 | 受影響 Extent 無 Redo 可恢復,資料永久遺失 | 操作緊接執行 資料檔層級備份 (RMAN BACKUP DATAFILE) |
| Data Guard 環境 | 主庫 NOLOGGING 導致備庫對應區塊標記損壞 | 啟用 FORCE LOGGING 模式,或備庫執行 RMAN RECOVER ... NONLOGGED BLOCK |
| 閃回資料庫 | 無法閃回 NOLOGGING 操作期間的變更 | 評估是否接受該時間窗不可閃回 |
-- 查看表/索引/分區的 LOGGING 屬性
SELECT table_name, logging FROM user_tables WHERE table_name = 'T';
SELECT index_name, logging FROM user_indexes WHERE index_name = 'IDX_T';
SELECT partition_name, logging FROM user_tab_partitions WHERE table_name = 'T';
-- 操作前後對比 Redo 產生量
SELECT name, value FROM v$sysstat WHERE name = 'redo size';
NOLOGGING 是大量資料初載、索引重建、分區維護的利器,但必須配合嚴格的備份策略與 Data Guard 保護模式。切記:無備份的 NOLOGGING 等於裸奔。