ORA-10635报错根本原因是SHRINK SPACE准入检查失败,与权限和空间无关;必须同时满足三条件:表空间为ASSM(AUTO)、对象为堆表且不含LONG或FDA、LOB段compression=NONE且securefile=NO。

ORA-10635报错根本不是权限或空间问题
直接原因很明确:ORA-10635: Invalid segment or tablespace type 是 Oracle 在执行 SHRINK SPACE 前做的硬性准入检查失败,和你有没有 DBA 权限、表空间是否还有空闲空间完全无关。它只认三件事:表空间类型、段类型、LOB 属性是否合规。一旦不满足,立刻拒绝,不给任何具体提示——这也是排查最耗时的地方。
收缩LOB必须同时满足表级 + LOB级双重条件
对含 CLOB/BLOB 的表执行 ALTER TABLE t MODIFY LOB (col) (SHRINK SPACE) 时,除了主表要满足常规 shrink 前提(ASSM 表空间、堆表、已启用行移动),LOB 段本身还额外卡两条红线:
-
compression必须为NONE—— 即使是 BASICFILE LOB,只要建表时指定了COMPRESS,shrink 就会被拒 -
securefile必须为NO—— SecureFile LOB 在所有 Oracle 版本中都不支持 shrink,哪怕表空间是 ASSM、表是普通堆表也无效
查证方式:
SELECT table_name, column_name, securefile, compression FROM dba_lobs WHERE table_name = 'YOUR_TABLE';
若 securefile = 'YES' 或 compression != 'NONE',SHRINK SPACE 必报 ORA-10635,无例外。
分区表LOB收缩必须指定分区,不能靠CASCADE
对分区表执行 ALTER TABLE t SHRINK SPACE CASCADE,看似能连带收缩索引和 LOB,但实际行为是:索引可能被收缩,LOB 段完全被跳过。更麻烦的是,如果该表是分区表且 LOB 列启用了 STORE AS SECUREFILE,哪怕只对单个分区操作,也会因 LOB 属性不合规而触发 ORA-10635。
正确做法是分步处理:
- 先确认目标分区是否独立段(非 interval 自动创建、未设为 READ ONLY)
- 对分区显式执行:
ALTER TABLE t MODIFY PARTITION p1 SHRINK SPACE(注意:这是收缩分区段,不涉及 LOB) - LOB 收缩必须单独发命令:
ALTER TABLE t MODIFY LOB (col) (SHRINK SPACE) PARTITION p1—— 且仅当该分区的 LOB 段满足securefile=NO和compression=NONE时才有效
最容易被忽略的隐性陷阱
很多人查完表空间是 AUTO、表是堆表、也没 LONG 列,就认定 shrink 应该成功,结果还是报 ORA-10635。这时真正该盯住的是:
- 物化视图日志表(
MLOG$开头):它们是普通堆表,但 Oracle 内部标记为不可 shrink 对象,执行会直接报错 - 函数索引或位图连接索引所在的表:即使结构完全合规,Oracle 也会静默拒绝 shrink,错误码仍是
ORA-10635 - LOB 所在表空间本身是 ASSM,但 LOB 段被显式指定建在另一个 MANUAL 表空间里(通过
STORE AS (TABLESPACE xxx))——此时查dba_tablespaces看的是主表空间,真正起作用的是 LOB 段所在表空间的segment_space_management
最稳的排查顺序永远是:先查 dba_tablespaces 确认主表和 LOB 段各自所在表空间的 segment_space_management,再查 dba_lobs 确认 securefile 和 compression,最后看对象类型是否在 Oracle 明确排除列表里。漏掉任意一环,ORA-10635 就会准时出现。


















