LOB空间失控主因是BasicFile的IN_ROW与PCTVERSION机制导致双重占用和旧版本堆积迁移至SecureFiles需停写MOVE且须用DBMS_SPACE.SPACE_USAGE查真实占用CHUNK仅对新写生效。LOB段空间爆满时DBA_SEGMENTS里看到的不是表而是SYS_LOB*段lob数据不存于表段内而是在独立段中管理。一旦select * from dba_segments where segment_name like sys_lob% and bytes 1073741824返回大量gb级段说明lob空间失控了——这时候查原表行数可能才几万但sys_lob段已占上百gb。根本原因在于BasicFile LOB默认启用ENABLE STORAGE IN ROW小LOB≤3964字节会挤进表块大LOB才进单独段但只要发生过一次UPDATE哪怕只改了个字段Oracle就可能把原本在行内的LOB“踢出去”变成NOINROW且不会自动回收原行内空间导致双重占用。用SELECT COLUMN_NAME, IN_ROW, CHUNK, PCTVERSION FROM DBA_LOBS WHERE TABLE_NAME YOUR_TABLE确认当前策略BasicFile下IN_ROWNO且PCTVERSION设得过高如默认10长期更新会产生大量旧版本LOB块无法被常规DELETE清理SecureFiles默认禁用IN ROW、不维护PCTVERSION版本由RETENTION策略统一控制更可控从BasicFile迁移到SecureFiles必须停写且ALTER TABLE ... MOVE LOB会锁全表很多人以为加个USING SECUREFILE就能在线切换实际ALTER TABLE t MODIFY LOB(c) (SECUREFILE)在12c之前根本不支持12c也仅限新插入LOB生效存量数据仍走BasicFile路径。真正迁移只能靠MOVE但这个操作会持有SSsub-share锁阻塞所有DML。如果LOB列有索引还得重建索引——而ALTER INDEX ... REBUILD ONLINE对LOB索引无效必须离线重建。执行前务必检查SELECT * FROM V$SESSION WHERE EVENT LIKE enq: TX - row lock contention避免在业务高峰跑ALTER TABLE t MOVE LOB(c) STORE AS SECUREFILE (COMPRESS HIGH DEDUPLICATE)中COMPRESS和DEDUPLICATE会显著延长MOVE时间测试环境先压测MOVE后原BasicFile段不会自动删除需手动DROP SEGMENT或等ASSM自动回收但前提是没开启DELAYED_SEGMENT_CREATIONFALSEDBMS_SPACE.SPACE_USAGE查SecureFiles真实空间别信DBA_SEGMENTS.BYTESDBA_SEGMENTS.BYTES显示的是分配空间SecureFiles大量使用压缩和去重后实际占用可能只有1/10。直接按这个值扩容容易买多几十TB存储还解决不了问题。DBMS_SPACE.SPACE_USAGE能穿透压缩层返回UNFORMATTED_BYTES未格式化、UNUSED_BYTES已分配但未用、USED_BYTES真正写入数据。注意它只对SecureFiles有效BasicFile调用会报ORA-40439。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。