当要做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;