ITPub博客

首页 > Linux操作系统 > Linux操作系统 > resize datafile以节省磁盘空间

resize datafile以节省磁盘空间

原创 Linux操作系统 作者:myownstars 时间:2011-09-29 17:35:06 0 删除 编辑

因为磁盘空间不够,而表空间data中的很多表已经被迁移走,现在需要从表空间data中回收空间;
一个数据文件能够resize(缩小)的最大限度需要取决于其max extent,通过以下sql可以查看

select a.FILE#,
       a.name,
       ceil(HWM * a.BLOCK_SIZE) / 1024 / 1024 ResizeTO,
       a.BYTES / 1024 / 1024 CurrentMB
  from v$datafile a,
       (select file_id, max(block_id + blocks - 1) HWM
          from dba_extents
         group by file_id) b,
       dba_data_files d
 where a.file# = b.file_id
   and d.FILE_ID = a.FILE#
   and d.TABLESPACE_NAME = 'DATA'
   and (a.BYTES - b.HWM * a.BLOCK_SIZE) > 0;


查询结果如下
     FILE# NAME                                                                                                   RESIZETO  CURRENTMB
---------- ---------------------------------------------------------------------------------------------------- ---------- ----------
         6 /data/oracle/oradata/justin/data02.dbf                                                               8191.0625       8192
        14 /data/oracle/oradata/justin/data43.dbf                                                              201.992188       8192
        84 /data/oracle/oradata/justin/data24.dbf                                                               8191.0625       8192
       105 /data/oracle/oradata/justin/data32.dbf                                                              8000.99219       8001
       106 /data/oracle/oradata/justin/data33.dbf                                                              8000.99219       8001
       107 /data/oracle/oradata/justin/data34.dbf                                                              8000.99219       8001
       115 /data/oracle/oradata/justin/data35.dbf                                                              8191.99219       8192
       118 /data/oracle/oradata/justin/data36.dbf                                                              8000.99219       8001
       124 /data/oracle/oradata/justin/data37.dbf                                                              8191.99219       8192
       129 /data/oracle/oradata/justin/data38.dbf                                                              8191.99219       8192
       130 /data/oracle/oradata/justin/data39.dbf                                                              8191.99219       8192
       131 /data/oracle/oradata/justin/data40.dbf                                                              5218.99219      10240
       133 /data/oracle/oradata/justin/data41.dbf                                                              4045.99219      10240
       134 /data/oracle/oradata/justin/data42.dbf                                                              3731.99219      10240
      
按照以上结果可以执行      
alter database datafile 134 resize 3740m;

对于temp file,则需要查看v$sort_usage视图
select max(segblk#)*8192/1024/1024/1024 from v$sort_usage;

SQL> select max(segblk#)*8192/1024/1024/1024 from v$sort_usage;

MAX(SEGBLK#)*8192/1024/1024/1024
--------------------------------
                      7.68756866

alter database tempfile '/data/oracle/oradata/justin/temp01.dbf' resize 7700m;
 
如果是undo数据文件,则不必这么麻烦
可以新建一个undo tablespace,指定较小的数据文件,并且执行alter system set undo_tablespace = new_undo scope =both;
观察v$rollstat,待到旧的undo segment都offline时执行drop tablespace old_undo including contents and datafiles即可

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15480802/viewspace-708520/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-03-18

  • 博文量
    375
  • 访问量
    3320692