收缩oracle数据库表空间大放送

当要做oracle数据库迁移, 备份时,需要对数据库的整体使用情况有一个了解,有时要把占用的无用空间释放出来,可以用下面的slq 查询,这是我从网上整理出来的:

--查询系统各个表空间的大小及使用百分比情况

SELECT UPPER(F.TABLESPACE_NAME) "表空间名",D.TOT_GROOTTE_MB "表空间大小(M)",
    D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
    TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES)/D.TOT_GROOTTE_MB * 100,2),'990.99')"使用比",
    F.TOTAL_BYTES "空闲空间(M)",F.MAX_BYTES "最大块(M)"
  FROM (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
               ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
        FROM SYS.DBA_FREE_SPACE
        GROUP BY TABLESPACE_NAME
       ) F,
      (SELECT DD.TABLESPACE_NAME,ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
       FROM SYS.DBA_DATA_FILES DD
       GROUP BY DD.TABLESPACE_NAME
      ) D
  WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
  ORDER BY 4 DESC;




--查询系统的所有表空间大小,并自动产生调整空间的sql 
--生成的sql需要分析一下,有的sql可能调整的意义不大,有可能只可能收缩出几MB的空间
select a.file#,a.name,a.bytes/1024/1024 CurrentMB,
       ceil(HWM * a.block_size)/1024/1024 ResizeTo,
       (a.bytes - HWM * a.block_size)/1024/1024 ReleaseMB,
       'alter database datafile '''||a.name||''' resize '||
       ceil(HWM * a.block_size/1024/1024) || 'M;' ResizeCMD
from v$datafile a,
     (select file_id,max(block_id+blocks-1) HWM
       from dba_extents
       group by file_id) b
where a.file# = b.file_id(+)
and (a.bytes - HWM *block_size)>0
order by 5;


/*
FILE# NAME CURRENTMB RESIZETO RELEASEMB RESIZECMD
1 F:\JBOSS\HRMP\DATA\HRMP\SYSTEM01.DBF 710 706.9921875 3.0078125 alter database datafile 'F:\JBOSS\HRMP\DATA\HRMP\SYSTEM01.DBF' resize 707M;
3 F:\JBOSS\HRMP\DATA\HRMP\UNDOTBS01.DBF 75 69.1796875 5.8203125 alter database datafile 'F:\JBOSS\HRMP\DATA\HRMP\UNDOTBS01.DBF' resize 70M;
5 F:\JBOSS\HRMP\DATA\HRMP\HRMP01.DBF 238.75 227.3671875 11.3828125 alter database datafile 'F:\JBOSS\HRMP\DATA\HRMP\HRMP01.DBF' resize 228M;
2 F:\JBOSS\HRMP\DATA\HRMP\SYSAUX01.DBF 650 607.9921875 42.0078125 alter database datafile 'F:\JBOSS\HRMP\DATA\HRMP\SYSAUX01.DBF' resize 608M;
6 F:\JBOSS\HRMP\DATA\HRMP\HRMP02.DBF 50 1.1171875 48.8828125 alter database datafile 'F:\JBOSS\HRMP\DATA\HRMP\HRMP02.DBF' resize 2M;
4 F:\JBOSS\HRMP\DATA\HRMP\USERS01.DBF 177.5 5.6171875 171.8828125 alter database datafile 'F:\JBOSS\HRMP\DATA\HRMP\USERS01.DBF' resize 6M;


*/


--查询表空间信息(包括创建时间,名称,读写权限)
select * from v$datafile;
--查询表空间的备份信息(是不是bigfile,flashback_on)
select * from v$tablespace;
--如果只是想对某个表个间的datafile resize,可采用:
select a.file#,a.name,a.bytes/1024/1024 CurrentMB,
       ceil(HWM * a.block_size)/1024/1024 ResizeTo,
       (a.bytes - HWM * a.block_size)/1024/1024 ReleaseMB,
       'alter database datafile '''||a.name||''' resize '||
       ceil(HWM * a.block_size/1024/1024) || 'M;' ResizeCMD
from v$datafile a,
     (select file_id,max(block_id+blocks-1) HWM
       from dba_extents where file_id in
              (select b.file#  From v$tablespace a ,v$datafile b
                where a.ts#=b.ts# and a.name='HRMP')
       group by file_id) b
where a.file# = b.file_id(+)
and (a.bytes - HWM *block_size)>0
order by 5;


--计划tempfile可以resize的空间.on apply that have only one tempfile
--生成临时表空间可调整的sql
select 'alter database tempfile '''||a.name ||''' reize '||b.siz||'M;' from v$tempfile a,
     (select tmsize.maxblk*bk.value/1024/1024 siz from
         (select nvl(max(segblk#),128) maxblk  from v$sort_usage) tmsize,
         (select value From v$parameter where name = 'db_block_size') bk) b;




--生成收缩空闲表空间的sql
--首先,如果没有分配的空间不足100M,则不考虑收缩。
--收缩目标:当前数据文件大小 - (没分配空间- 100M)×0.8 
--优点:可以直接执行生成的sql
select /*+ ordered use_hash(a,c) */
  'alter database datafile '''||a.file_name||''' resize '
   ||round(a.filesize - (a.filesize - c.hwmsize-100) *0.8)||'M;',
  a.filesize,
  c.hwmsize
from
(
select file_id,file_name,round(bytes/1024/1024) filesize from dba_data_files
) a,
(
select file_id,round(max(block_id)*8/1024) HWMsize from dba_extents
group by file_id) c
where a.file_id = c.file_id
  and a.filesize - c.hwmsize > 100;

猜你喜欢

转载自blog.csdn.net/c_huabo/article/details/46379551