能,MOVE PARTITION ONLINE 通过将排他锁降级为行级 DML 并发锁避免业务中断,但需检查数据文件 status 和 online_status 均为 ONLINE、表空间状态正常,并及时更新统计信息,且 LOB 和压缩参数须分步处理。
MOVE PARTITION ONLINE 能否真正避免业务中断?
能,但不是“零锁”,而是把排他锁降级为行级 dml 并发锁。只要加了 online,insert/update/delete 就不会被阻塞——应用无感知,sql 继续执行。但注意:ora-00054 仍可能出现,通常不是 move partition 自身导致的,而是其他会话正持有该分区上的未提交事务(比如长 update 卡住),这时需先查 v$transaction 和 v$session 定位并清理。
迁移前必须验证的三个状态字段
别只看 DBA_DATA_FILES,它不反映实时状态。执行前务必查 v$datafile 确认目标分区所在数据文件是否真正就绪:
-
status = 'ONLINE':表示文件处于数据库管理下的在线状态 -
online_status = 'ONLINE':表示文件已成功打开、可读写;若为OFFLINE或RECOVER,命令会挂起或报错 - 还要确认表空间本身是
ONLINE(查DBA_TABLESPACES.STATUS)
漏掉任一检查,轻则迁移失败,重则卡住 checkpoint,影响后续 shutdown。
MOVE PARTITION ONLINE 后查询变慢的真正原因
不是数据搬错了,而是统计信息没更新 + 执行计划缓存没刷新。即使用了 UPDATE INDEXES ONLINE,它只重建索引结构,不收集统计信息。结果就是:
-
DBA_TAB_PARTITIONS.NUM_ROWS变成NULL,优化器误判分区为空或数据量极小 - 分区裁剪(partition pruning)失效,全表扫描概率上升
- 动态采样(dynamic sampling)可能临时补救,但对倾斜数据不可靠
立刻执行:DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCHEMA', tabname => 'TABLE_NAME', granularity => 'PARTITION', partname => 'P_202406'),否则性能抖动会持续存在。
LOB 字段和压缩参数不能与 ONLINE 共存
这是最容易踩的语法坑:MOVE PARTITION ... ONLINE 语句里如果混入 LOB 子句或 ROW STORE COMPRESS BASIC,直接报 ORA-14647。正确做法是拆成两步:
- 第一步:用
ALTER TABLE t1 MOVE PARTITION p1 TO tablespace ts_new ONLINE UPDATE INDEXES ONLINE迁移主数据 - 第二步:单独处理 LOB:
ALTER TABLE t1 MOVE LOB(lob_col) STORE AS (TABLESPACE ts_new) - 若要压缩,只能在第一步中去掉
ONLINE(即离线压缩),或改用ALTER TABLE ... MODIFY PARTITION ... COMPRESS FOR OLTP(该操作支持在线,但不移动位置)
压缩后首次访问可能触发透明解压,延迟明显——这不是 bug,是预期行为,仅限首查,但得提前告知监控团队。











