先弄清:什么绝对不能 NOLOGGING
- 普通
INSERT / UPDATE / DELETE / MERGE
这些 DML 无论如何都会记 redo,别打它们的主意了。
可以“NOLOGGING”的 10 大操作(附一句话场景)
操作 | 场景一句话 |
---|---|
1. SQL*Loader direct path load | 海量文本一次性灌库,不想写日志 |
2. INSERT /*+ APPEND */ | 巨大的 ETL 结果直接追加到分区表 |
3. CREATE TABLE … AS SELECT | 快速克隆一张大表做测试 |
4. CREATE INDEX | 给 10 亿行的表建索引,时间从小时变分钟 |
5. ALTER TABLE … MOVE PARTITION | 分区搬迁到新表空间,顺带压缩 |
6. ALTER TABLE … SPLIT PARTITION | 按日期拆分历史分区,瞬间完成 |
7. ALTER INDEX … SPLIT PARTITION | 局部分区索引“大卸八块” |
8. ALTER INDEX … REBUILD | 索引碎片化,重建时省 redo |
9. ALTER INDEX … REBUILD PARTITION | 只重建受损分区,其余不动 |
10. 对 NOCACHE NOLOGGING 的 LOB 做 DML | 存储图像、音频等大对象,且可接受丢失 |
NOLOGGING 的副作用
- 介质恢复时会丢数据:上述操作产生的新区间被标记为
INVALID
,一旦崩溃,数据无法通过 redo 恢复。 - 必须备份:操作结束后立即对数据文件做一次备份(RMAN 或 OS 冷备),把“坑”填上。
- 不是免死金牌:数据字典、空间分配等少量 redo 依旧会产生,只是业务数据不写日志。
实战
- 会话级启用 ALTER SESSION ENABLE PARALLEL DML;
ALTER SESSION SET NOLOGGING; - 语句级写法 CREATE INDEX idx_big ON big_table(col1, col2) NOLOGGING PARALLEL 8;
- 检查是否真正“静音” SELECT logging, degree FROM user_indexes WHERE index_name = ‘IDX_BIG’;
NOLOGGING 是 Oracle 给“大批量、可重现”的数据装载准备的加速器;用得好省时间,用不好省数据。先备份,再提速!