datafile,tempfile,undo空间使用过大时可以通过 resize将空间回收到 高水位线附近(不低于高水位);
其中表段,索引段存在高水位线,表空间的高水位线就是所有表段,索引段等高水位线的最大值;

---查看所有数据文件,undo文件
占用空间大小(filesize),
空闲空间大小(freesize),
使用空间大小(usedsize),
高水位线(hwmsize),
可以回收的空间(canshirnksize),
回收resize语句(cmd)
select a.file_id,
       a.file_name,
       a.filesize,
       b.freesize,
       (a.filesize - b.freesize) usedsize,
       c.hwmsize,
       c.hwmsize - (a.filesize - b.freesize) unsedsize_belowhwm,
       a.filesize - c.hwmsize canshrinksize,
       'alter database datafile ' || a.file_name || ' resize ' || c.hwmsize || 'M;' cmd
  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 unsedsize_belowhwm desc;

执行此SQL前需要确保数据库统计信息是最新的

  • 查出来高水位线后,就可以通过cmd列 把数据文件或者undo缩小到高水位线附近了,
alter database datafile 'datafilename' resize xxM;
alter database datafile 'undodatafilename' resize xxM;
  • 查询当前数据库没有使用临时表空间时,也可以通过Resize回收临时表空间;
alter database tempfile 'tempfilename' resize xxM;
  • 查看数据文件,undo,temp文件大小
select *
  from (select bytes / 1024 / 1024 / 1024, file_name, tablespace_name
          from dba_data_files
        union all
        select bytes / 1024 / 1024 / 1024, file_name, tablespace_name
          from dba_temp_files)
 order by 1 desc;

除此以外,临时表空间和UNDO表空间可以通过重建回收空间;
如果报错ORA-03297,说明Resize的尺寸过小,需要适当调大reisze的值;

  • 查看10号数据文件中高水位线较高的区属于哪些用户以及段名,段类型
select *
  from (select owner, segment_name, segment_type, block_id
          from dba_extents
         where file_id =
               (select file_id from dba_data_files where file_id = 10)
         order by block_id desc)
 where rownum <= 5;

转载自chenoracle

最后修改:2022 年 02 月 28 日
如果觉得我的文章对你有用,请随意赞赏