有一个图片表,数据量很大,每个月都会定期删除一些过期的数据,因系统必须24小时运行,不能间断,所以不能采用先drop 再重建表的方式,采用以下方式时执行第二步报错:ora-10662 segments has long columns。表中确实有一个Long类型的字段,请问如何处理?或者其它更好的办法?1、--shrink必须开启行迁移功能。
alter table img_file  enable row movement ;
2、--保持HWM
alter table img_file shrink space compact;
3、--回缩表与HWM
alter table img_file shrink space;
4、--回缩表与相关索引
alter table img_file shrink space cascade;
5、--回缩索引
alter index img_file_idx01  shrink space;

解决方案 »

  1.   

    我记得上次我们做测试的时候
    是这样直接做的:只有两步
    alter table enable row movement;
    alter table shrink space;
    至于你说的long字段引起的,我不是很清楚shrink space是否会对long类型有要求
      

  2.   

    to gelyon: 
    alter table img_file shrink space ;
    也报同样的错。
      

  3.   

    ORA-10662: Segment has long columns 
    Cause: Shrink was issued on a segment with long columns. This is not supported.
    Action: Nonehttp://www.oracle86.com/ora_doc/server.111/b28278/e9858.htm
      

  4.   

    重新rename 表,
    然后truncate 现在的表
    在重新插入。可以不?
      

  5.   

    alter table … move; 也可以降低hwm
      

  6.   

    to qin_phoenix:因系统每时每刻都可能会产生数据,且该表数据量很大(有20G左右),所以重新rename 表,
    然后truncate 现在的表,再重新插入也不好操作。
      

  7.   

    使用shrink 的限制有:
    cluster中的表;
    有long类型的表;
    有on_commit物化视图的表;
    有基于rowid物化视图的表;
    大对象(LOB)索引。 
    ------------楼主想其它办法吧
      

  8.   


    应该shrink都会中断访问的对oracle不懂,这是我查的2点:
    --数据重组需要在表上加RX锁,对业务影响比较小
    --HWM调整,在表上加X锁,表上的所有DML语句阻塞很难理解lz的24小时不间断。据我所知,csdn晚上都有个时间会中断一下服务的。我的想法,能否在操作不频繁的时候,将前台的操作临时指向一个与该表结构一致的临时表呢?或者说写入时写到临时表,读取时从镜像表里去读。等你从容处理完后在把这段时间写入的数据插入到原来的表中。如有说错请见谅。
      

  9.   

    建议你弄成按月或按日分区表,要删除数据的时候直接truncate某个分区就可以了。