分区表lob迁移必须用alter table...move partition...lob(...)store as(...)显式指定,否则lob段不动;全局索引需加update global indexes,否则变unusable;迁移前须确认表空间配额、无未提交事务及lob类型。

不能直接用 ALTER TABLE ... MOVE TABLESPACE,必须按分区+LOB列双维度显式指定目标表空间,否则LOB段纹丝不动,表空间迁移等于白做。
分区表 + LOB 列必须用 MOVE PARTITION + LOB 子句
Oracle 对分区表的 LOB 字段不支持“整表迁移”,哪怕你加了 LOB (col) 也不行——报错 ORA-14511。必须把分区名、LOB列名、表空间全部写死在一条语句里。
- 正确语法:
ALTER TABLE t1 MOVE PARTITION p2023 TABLESPACE ts_data LOB (clob_col) STORE AS (TABLESPACE ts_lob); - 错误写法:
ALTER TABLE t1 MOVE TABLESPACE ts_data LOB (clob_col) STORE AS (TABLESPACE ts_lob);(语法拒绝) - 错误写法:
ALTER TABLE t1 MOVE PARTITION p2023 TABLESPACE ts_data;(LOB 仍卡在原表空间) - 若表有多个 LOB 列,可一次列出:
LOB (c1, c2, b1),但每个都得落在STORE AS (TABLESPACE ...)里
本地索引和全局索引状态要分开处理
MOVE PARTITION 后,本地索引分区自动重定位,状态保持 USABLE;但全局索引会直接变 UNUSABLE,且期间不可用于任何查询(包括 SELECT),这点极易被忽略。
- 加
UPDATE INDEXES只对本地索引有效,对全局索引无效 - 必须显式加
UPDATE GLOBAL INDEXES才能维持全局索引可用,例如:ALTER TABLE t1 MOVE PARTITION p2023 TABLESPACE ts_data LOB (clob_col) STORE AS (TABLESPACE ts_lob) UPDATE GLOBAL INDEXES; - 如果同时存在本地和全局索引,统一用
UPDATE GLOBAL INDEXES更稳妥,它兼容本地索引逻辑 - 执行后立刻查:
SELECT INDEX_NAME, PARTITION_NAME, STATUS FROM DBA_IND_PARTITIONS WHERE TABLE_NAME = 'T1';,别只信 “Table altered”
LOB 分区迁移前必须确认三件事
漏掉任意一项,MOVE 就会卡住、失败或残留旧段。
- 目标表空间已存在,且当前用户对该表空间有
QUOTA(仅授UNLIMITED TABLESPACE角色不够,需查DBA_TS_QUOTAS确认) - 该分区无未提交事务:运行
SELECT * FROM V$TRANSACTION WHERE XIDUSN > 0;,有结果就得等或 kill - LOB 列实际用了 BasicFile(查
DBA_LOBS.SEGMENT_TYPE = 'BASICFILE');如果是SECUREFILE或STORAGE IN ROW,MOVE 收益极低,应优先考虑SHRINK SPACE - 大 LOB 迁移不可中断、不可回滚,预估时间并安排窗口期;
SELECT tablespace_name FROM DBA_LOBS WHERE table_name='T1' AND column_name='CLOB_COL';先确认当前位置
最常踩的坑不是语法写错,而是以为 MOVE PARTITION 能顺带把 LOB 带走,或者忘了 UPDATE GLOBAL INDEXES 会让全局索引锁死整个过程——看似一条 SQL,实则牵动分区、LOB 段、索引三处状态,每处都得单独验。











