Oracle 查询各表空间使用情况--完善篇
链接:
标题:
作者: ©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]
前言 :
之前简单写过" ",当时只简单用到dba_data_file"总大小"与dba_free_space"剩余大小"来判断空间使用情况 ;
但当如下2种情况产生的时候 ,以前的脚本不太适用 ;
1、 DBF设置AUTOEXTENSIBLE='YES'自增长时, 例如:初步分配10G,使用9.9G,原方法使用率 = 9.9/ 10 *100 = 99%,而实际为=9.9 /总( 'smailfile' ≈32 G )*100 = 31%;
2、 UNDO表空间循环使用,当大部分空间分配状态为UNEXPIRED,EXPIRED时,按照之前方式所算的使用率完全没有参考价值;
针对如上的2中情况 ,在如下sql已做改进.
SQL :
SELECT TBSP.TABLESPACE_NAME ,
TBSP.TOTAL_GB ,
TBSP.USE_GB ,
TBSP.TOTAL_GB - TBSP.USE_GB FREE_GB,
ROUND (TBSP.USE_GB / TBSP.TOTAL_GB * 100 ,2 ) "USE%"
FROM ( SELECT TOTAL.TABLESPACE_NAME ,
TOTAL_GB ,
/*USE.TABLESPACE_NAME IS NULL 表示表空间使用为0'未分配段'*/
( CASE WHEN USE.TABLESPACE_NAME IS NULL THEN 0
/*各UNDO表空间ACTIVE状态USE_GB
--ACTIVE表示目前仍活跃的事务相关回滚信息;
--UNEXPIRED表示虽然事务已经结束但回滚信息保留的时间仍未超过实例参数 UNDO_RETENTION所设定的值;
--EXPIRED表示回滚信息保留时间已超过UNDO_RETENTION所设定的值*/
WHEN TOTAL.TABLESPACE_NAME IN ( SELECT DISTINCT TABLESPACE_NAME FROM DBA_UNDO_EXTENTS) THEN
( SELECT ROUND(NVL(SUM(BLOCKS) * 8 / 1024 / 1024,0), 2) AS "SIZE G" FROM DBA_UNDO_EXTENTS WHERE STATUS = 'ACTIVE'
AND TABLESPACE_NAME = TOTAL.TABLESPACE_NAME) ELSE USE_GB END ) USE_GB
FROM (/*表空间总大小*/
SELECT TABLESPACE_NAME ,
/*自动增长,OS层空间足够时,取MAXBYTES*/
ROUND (SUM (( CASE WHEN AUTOEXTENSIBLE = 'YES' THEN MAXBYTES ELSE BYTES END ) / 1024 / 1024 / 1024 ), 2 ) TOTAL_GB
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) TOTAL
LEFT JOIN ( /*表空间真实使用情况*/
SELECT TABLESPACE_NAME ,
ROUND (SUM ( BYTES / 1024 / 1024 / 1024), 2 ) USE_GB
FROM DBA_SEGMENTS
GROUP BY TABLESPACE_NAME) USE
ON USE.TABLESPACE_NAME = TOTAL.TABLESPACE_NAME) TBSP
UNION ALL ( /*临时表空间使用情况*/
SELECT TABLESPACE_NAME ,
ROUND (TF.TABLESPACE_SIZE / 1024 / 1024 / 1024 , 2) TABLESPACE_NAME ,
ROUND ((TF.TABLESPACE_SIZE - TF.FREE_SPACE) / 1024 / 1024 / 1024 , 2 ) USE_GB ,
ROUND (TF.FREE_SPACE / 1024 / 1024 / 1024 , 2) FREE_GB ,
ROUND ((TF.TABLESPACE_SIZE - TF.FREE_SPACE) /TF.TABLESPACE_SIZE * 100 , 2) "USE%"
FROM DBA_TEMP_FREE_SPACE TF);
视图官方介绍 :
DBA_DATA_FILES DBA_SEGMENTS DBA_TEMP_FREE_SPACE DBA_UNDO_EXTENTS |
提示:
若想针对各个DBF使用率进行查询,需要完善例如DBA_SEGMENTS.HEADER_FILE = DBA_DATA_FILES.FILE_ID...等