想压缩表空间执行这个alter databasedatafile 'XXXX\xxx.dbf resize 242m语句的时候,出了下面这些错误

ORA-03927:文件包含在请求的RESIZE值以外使用的数据
,咋个办???谢谢

解决方案 »

  1.   

    空间能不能压缩,能压缩多少,主要看表空间的高水位线,空间是不可以压缩到高水位线以下的。
    select /*+ ordered use_hash(a,b,c) */
    a.file_id,a.file_name,a.filesize, b.freesize,
    (a.filesize-b.freesize) usedsize,
    c.hwmsize,
    c.hwmsize - (a.filesize-b.freesize) unusedsize_belowhwm,
    a.filesize - c.hwmsize canshrinksize 
    from 
    (
    select file_id,file_name,round(bytes/1024/1024) filesize 
    from dba_data_files
    ) a,
    (
    select file_id,round(sum(dfs.bytes)/1024/1024) freesize 
    from dba_free_space dfs
    group by file_id
    ) b,
    (
    select file_id,round(max(block_id)*8/1024) HWMsize 
    from dba_extents
    group by file_id
    ) c
    where a.file_id = b.file_id
    and a.file_id = c.file_id
    order by unusedsize_belowhwm desc;--结果说明:
    --file_id : 文件编号
    --file_name: 文件名称
    --file_size: 数据文件占用磁盘空间大小
    --freesize:文件中被标记为free的空间大小
    --usedsize: 使用的空间大小。
    --hwmsize: 已经分配出去的空间大小,如果希望通过alter database datafile … resize integerM回收空间,将需要这个值作为参考,不能回收到这个值之下,否则会报错。
    -- unusedsize_belowhwm: 在HWM(高水位标记线之下的空闲空间数),这个是理论上的可以回收的空间大小。
    -- canshrinksize: 这个是实际大小与HWM标记之间的差,就是还没有分配出去的空间大小。
    查下你的高水位线。
      

  2.   

    跑一下这个 script :SELECT 'alter database datafile '||d.file_id ||' resize '||NVL(ROUND(MAX(e.block_id+e.blocks -1)* t.block_size /1024/1024+1),11)||'M;'FROM dba_extents e, dba_data_files d , dba_tablespaces tWHERE d.tablespace_name = t. tablespace_nameAND d.file_id = e.file_id(+)AND t. tablespace_name = :tbsnameAND e. tablespace_name(+) = :tbsnameGROUP BY d.file_id , t.block_size
      

  3.   

    呵呵,搞复杂了,这和表空间的水位线也没关系。
    简单点说,就是文件尾部有数据块存在,也就是这个文件虽然有足够的自由空间,但空间分布不是连续的,要解决这个问题,需要查出文件尾部分配空间的段,然后,移去这个段,这样,一点点的逐个移去最靠近文件尾部的段,直到resize确定的边界到文件尾部没有被分配才可以resize,这个操作无疑是很繁琐的。