环境:RHEL 5.4 X86_64,  Oracle 10g 10.2.0.1 64bit
存储:7.2T磁盘柜,EXT4有两个bigfile表空间EMAIL_TABLE和EMAIL_INDEX库中有三个最大的表,EMAIL_HOT,  EMAIL_TEMP,  EMAIL_TEST 。均为分区表,以其中的时间字段按范围分区,每两小时一个分区表中所有分区均在EMAIL_TABLE表空间,三个表所有的索引的分区(索引均为local)均在EMAIL_INDEX表空间SQL*Loader 7*24小时入库中以上为背景
-----------------------------------------------------------------------------------------由于无法预测的数据量激增等原因,现在磁盘空间写了99%,删除了三个表中一些可以删除的历史分区,数据可以再入了,两个表空间占用率均下降到40%,想收缩表空间清理磁盘空间。想到两个办法
1·直接resize datafile
-------------失败,表空间HWM高水位水平过高,文件无法收缩。2·创建新的表空间,写一段代码将以前表空间的所有对象move过去,再删除原有的表空间-------------无法实现,这么做需要格外的磁盘空间支持2·尝试alter table 表名 shrink space cascade ,看能否降低表空间高水位,再resize datafile
-------------失败,完成该操作后还是无法resize,似乎高水位没有降低。
求助各位大神,有没有什么办法啊,东西不能删除啊,磁盘就要写满了,可能还要创建别的表空间,满了就没法用了

解决方案 »

  1.   

    看楼主的描述,每天定时drop历史分区 好像就达到目的了啊???
      

  2.   

    alter table xxx shrink space  --整理碎片和回收表空间也不行吗?
    alter table xxx compress  --可以考虑表压缩,但数据要并行加载才压缩
    再就是可以考虑行迁移了
      

  3.   

    1.将该表空间下的RECYCLEBIN对象清除。
    2.找出收缩空间大小之外的对象迁移到另外表空间:
    SELECT owner,segment_name,(block_id+blocks)*8/1024 loc_size FROM DBA_EXTENTS where tablespace_name='TBS_NAME'
    order by 3 desc;
    3.然后再把你的文件缩小:
     ALTER DATABASE DATAFILE 6 RESIZE 100M;