oracle的alter table move操作本质是重建段,非指针调整:分配新区、逐块重写数据并生成完整redo,即使未启用row movement也强制重定位,所有rowid变更,索引失效需手动重建。
移动大表段会触发全量块重写,不是简单指针调整
Oracle 的 ALTER TABLE ... MOVE 操作本质是重建整个段:它分配新区、逐块读取原数据、在新位置重新构造数据块,并为每个块的物理写入生成完整 redo 条目。这和索引重建、SHRINK SPACE COMPACT 不同——后两者可能复用部分结构或仅移动行,而 MOVE 是彻底的“复制+清空”。即使表上没开行移动(ENABLE ROW MOVEMENT),该命令也强制启用逻辑重定位,所有数据块变更都会被记录。
常见错误现象包括:ORA-01653(无法扩展表)、归档空间迅速耗尽、log file switch (archiving needed) 等待事件飙升、v$sysstat 中 redo size 在执行窗口内陡增数 GB。
- 不带
NOLOGGING时,默认全程写 full redo,与 DML 的 redo 生成机制一致 - 即使表空间是
NOLOGGING,MOVE本身仍需 logging,除非显式加NOLOGGING子句 - 如果启用了补充日志(
supplemental log)或使用了逻辑复制(如 OGG),NOLOGGING可能被忽略或降级为 minimal logging - 移动过程中若发生中断,已写入的新段不会自动回滚,残留空间需手动清理
NOLOGGING 并非万能,且有严格前提
加 NOLOGGING 能跳过 redo 日志写入,但只对直接路径操作生效,且要求数据库处于 ARCHIVELOG 模式下且归档正常 —— 否则命令会报错 ORA-01278。更重要的是,NOLOGGING 后的段在后续备份中不可用于介质恢复(Media Recovery),因为缺少 redo 支撑前滚;DG 备库也会丢失这部分变更,导致主备不一致。
使用场景受限于业务连续性要求:只适用于可容忍丢失(如临时中间表、ETL staging 表)、且能接受从逻辑备份或上游重放恢复的数据。
- 必须配合
ALTER DATABASE NOARCHIVELOG或确保备库已暂停应用,否则 DG 会报ORA-16198 -
NOLOGGING对索引无效,移动表时关联索引仍会生成大量 redo,需单独重建并加NOLOGGING - 执行后应立即做 RMAN 备份,标记该数据文件为“nologging 区域”,避免误用旧备份恢复
替代方案比硬 MOVE 更可控
若目标只是释放高水位线(HWM)或整理碎片,SHRINK SPACE 是更轻量的选择:它只移动行、复用现有块,redo 量通常只有 MOVE 的 10%–30%。前提是表空间为本地管理 + ASSM,且已启用 ROW MOVEMENT。
对于超大表(TB 级),可考虑分区级操作:ALTER TABLE ... MOVE PARTITION 分批处理,配合 DBMS_PARALLEL_EXECUTE 控制并发度,避免单次 redo 峰值冲击。
-
SHRINK SPACE COMPACT不降低 HWM,但几乎不产生 redo;后续SHRINK SPACE才真正回收空间,redo 量仍远小于MOVE - 分区移动可结合
UPDATE INDEXES避免索引失效,减少额外 DDL redo - 执行前务必检查
v$archive_dest_status的STATUS和ERROR列,防止归档卡住放大问题
真正容易被忽略的是索引维护成本——移动一张 500GB 表,其二级索引可能占到总 redo 的 60% 以上,而这点在计划阶段常被低估。











