oracle删除数据后,空间不释放如何解决???
数据数据后,dbf文件还是很大,数据实际只占用了不到一半的空间.有什么方法让dbf文件变小点?

解决方案 »

  1.   

    可以resize datafile:
    alter database datafile '/db/adpdb/foo.dbf' resize 1024M
      

  2.   

    要清空表的可以用truncate table xxxx;命令
      

  3.   

    可以尝试下shrink space
    alter table "TABLE_OWNER"."TABLE_NAME" shrink space
      

  4.   

    resize datafile不行,不能使dbf文件变小,只能改大还可以.
      

  5.   

    shrink space 也不行;
     我使用这样的方式进行数据空间释放的.
     创建临时表保存数据
      create table tableback as select * from table_name;
      然后清空主表
       truncate table table_name;
     重新导回数据
      insert into table_nameselect * from tableback ;
      丢掉临时表
       drop table tableback ;
    结果是数据文件dbf文件比以前大了一倍,实际数据只占了大概25%;怎么样可以让dbf变小与实际数据保持一致.非常急,望高手指点好方法
      

  6.   


    ALTER DATABASE DATAFILE '%ORADATADIR%\NETMAXU\UNDOTBS01.DBF' RESIZE 1G;
      

  7.   

    楼主如果删除的数据没有达到高水位线的话空间是不会释放的,楼主如果想释放空间只能:
    truncate table table_name
      

  8.   

    如果是生产库,表之前非常大,那还是慎用shrink,会产生N多的归档.以及非常的慢
      

  9.   

    上面各位的方法我都实验过了,主要是还是dbf文件所占的物理空间不能释放掉,
    数据实际占有的空间和dbf文件的大小相差太大了.
    现在关键问题是如何让dbf文件变小的,ALTER DATABASE DATAFILE '%ORADATADIR%\NETMAXU\UNDOTBS01.DBF' RESIZE 1G; 这个不行,报错说设定的值小于数据实际占有值(文件包含在请求的resize值以外使用的数据)
      

  10.   

    你缩小到比你实际占有量大些就行了。别人写的1G,不是说你就也得写1g。正确做法是先降低HWM,再确定实际占有大小,再resize数据文件。注意操作时对业务的影响
      

  11.   

    使用exp导出,删除后,导入imp
      

  12.   

    上面说的 ALTER DATABASE DATAFILE '%ORADATADIR%\NETMAXU\UNDOTBS01.DBF' RESIZE 1G; 我只是举个例子.
    我数据的dbf文件有2.6G,而数据实际使用只有1.3G;
    我用resize 1.6G;1.8;2.0;2.5G都不行.降低HWM是不是用下面两种方法可以实现
    可以用 move table 然后再重新见index
    或者
    创建临时表保存数据 
      create table tableback as select * from table_name; 
      然后清空主表 
      truncate table table_name; 
    重新导回数据 
      insert into table_nameselect * from tableback ; 
      丢掉临时表 
      drop table tableback (注:不准备用exp/imp方法实现)
      

  13.   

    vc555
    就是不能实现啊,
    817,9i上都不能实现上面说的 ALTER DATABASE DATAFILE '%ORADATADIR%\NETMAXU\UNDOTBS01.DBF' RESIZE 1G; 我只是举个例子. 
    我数据的dbf文件有2.6G,而数据实际使用只有1.3G; 
    我用resize 1.6G;1.8;2.0;2.5G都不行. 
    resize 完全不能变小啊.
      

  14.   

    你先查查各个datafiel的hwm是多少,然后才能知道是否可以resizeselect file_name, ceil((nvl(hwm, 1) * 8192) / 1024 / 1024) as "HWM(MB)"
      from dba_data_files a,
           (select file_id, max(block_id + blocks - 1) hwm
              from dba_extents
             group by file_id) b
     where a.file_id = b.file_id(+);
      

  15.   

    删除表数据时使用truncate就行了
      

  16.   


    数据文件是可以变小的,尝试如下:
    select * from dba_data_files;/*
         FILE_NAME  FILE_ID  TABLESPACE_NAME  BYTES  BLOCKS
    1  D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\USERS01.DBF  4  USERS  5242880  640
    2  D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\SYSAUX01.DBF  3  SYSAUX  272629760  33280
    3  D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\UNDOTBS01.DBF  2  UNDOTBS1  26214400  3200
    4  D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\SYSTEM01.DBF  1  SYSTEM  503316480  61440
    5  D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\DATA01.DBF  5  DATA  20971520  2560
    6  D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\DATA02.DBF  6  DATA  31457280  3840
    7  D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\TEST1.DBF 7 TEST 10485760 1280
    */alter database datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\TEST1.DBF' resize 5m;
    ---执行成功!/*
        FILE_NAME FILE_ID TABLESPACE_NAME BYTES BLOCKS
    1 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\USERS01.DBF 4 USERS 5242880 640
    2 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\SYSAUX01.DBF 3 SYSAUX 272629760 33280
    3 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\UNDOTBS01.DBF 2 UNDOTBS1 26214400 3200
    4 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\SYSTEM01.DBF 1 SYSTEM 503316480 61440
    5 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\DATA01.DBF 5 DATA 20971520 2560
    6 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\DATA02.DBF 6 DATA 31457280 3840
    7 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ASIAINFO_ZHENGZW\TEST1.DBF 7 TEST 5242880 640
    */
      

  17.   

     20 楼 mmqingfeng  你好!用你方法查了下我的hwm怎么基本和datafile大小是一致的,不是实际数据占有的大小.难道这样的方式
     move table 然后再重新见index 
    或者 
    创建临时表保存数据 
      create table tableback as select * from table_name; 
      然后清空主表 
      truncate table table_name; 
    重新导回数据 
      insert into table_nameselect * from tableback ; 
      丢掉临时表 
      drop table tableback 
    不能降低hwm吗?
    那还有什么方式可以降低hwm.
      

  18.   

    要清空表的可以用truncate table xxxx;命令
      

  19.   

    truncate table  把所有数据都删除了啊 ?
    我现在不是要清空,是删除一部分数据啊.
      

  20.   

    truncate table table name
      

  21.   


    alter table tb move
      

  22.   

    alter table  move 也实验过了,不过没有移到其他空间去,只是在本数据空间内移动.
      

  23.   

    你设置 pctfree 和 pctused 参数了么? 可能是这个导致的吧