能,MOVE PARTITION ONLINE 将排他锁降级为行级并发锁,INSERT/UPDATE/DELETE 不阻塞;但需12c+、检查长事务、更新统计信息、LOB须拆步处理。
MOVE PARTITION ONLINE 能否真正避免锁表?
能,但不是“完全不加锁”,而是把排他锁(exclusive)降级为行级 dml 并发锁。只要加了 online,insert/update/delete 就不会被阻塞——应用无感知中断。
常见错误现象:ORA-00054 仍可能出现,但这通常不是 MOVE PARTITION 自身导致的,而是其他会话正持有该分区上的未提交事务(比如长事务未 COMMIT 或 ROLLBACK)。执行前建议查一下:SELECT sid, serial#, sql_id FROM v$session WHERE blocking_session IS NOT NULL。
- 必须是 Oracle 12c R1(12.1.0.1)及以上版本;11g 不支持该语法
-
ONLINE仅对当前操作的分区生效,不影响其他分区读写 - 会产生大量 redo 日志,尤其在大分区上,需提前检查归档空间是否充足
UPDATE INDEXES ONLINE 和 UPDATE INDEXES 的关键区别
区别在索引可用性保障级别:UPDATE INDEXES ONLINE 确保全局索引和本地索引全程保持 VALID 状态;而仅写 UPDATE INDEXES(离线模式)会导致全局索引瞬间变为 UNUSABLE,哪怕只持续几毫秒,也可能触发应用报错或执行计划突变。
使用场景:有全局索引的订单表按月分区,迁移 P_202401 时若漏掉 ONLINE,查询可能突然走全表扫描。
- 本地索引(
LOCAL)受分区绑定,MOVE PARTITION后自动重建,无需额外干预 - 函数索引、域索引也适用
UPDATE INDEXES ONLINE,但需确认其底层实现是否支持在线重建 - 不加
UPDATE INDEXES会导致全局索引失效,必须手动ALTER INDEX ... REBUILD
移动后查询变慢,大概率是统计信息没更新
不是数据搬错了,而是统计信息没更新 + 执行计划缓存未刷新。即使加了 UPDATE INDEXES ONLINE,它只重建索引结构,不触发统计信息收集——优化器仍用旧的行数、分布直方图估算,容易误判分区裁剪失效或选错索引。
-
DBA_TAB_PARTITIONS.NUM_ROWS在迁移后变为NULL,必须手动收集 - 动态采样不可靠,尤其对倾斜数据;建议立刻执行:
DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCHEMA_NAME', tabname => 'TABLE_NAME', granularity => 'PARTITION', partname => 'PARTITION_NAME') - 如果新表空间启用了压缩(如
ROW STORE COMPRESS BASIC),首次访问可能触发透明解压,延迟明显,但仅限首查
LOB 字段不能和 ONLINE 一起迁移,必须拆步处理
MOVE PARTITION ONLINE 与 LOB STORE AS 不兼容,会报 ORA-14647。LOB 分区必须单独处理,不能混在同一语句中。
- 第一步:用
ALTER TABLE ... MOVE PARTITION ... ONLINE UPDATE INDEXES ONLINE迁移主数据 - 第二步:单独执行
ALTER TABLE ... MODIFY LOB (col_name) (STORE AS ...)指定新表空间 - 注意:LOB 段迁移本身不支持
ONLINE,期间该分区的 LOB 列 DML 会被阻塞
最易被忽略的是统计信息刷新和 LOB 拆步——前者让优化器“看不清”数据分布,后者一并写进 ONLINE 语句就会直接失败。这两个点不处理,再顺利的移动也等于白做。


















