Press "Enter" to skip to content

Oracle数据库查询表空间使用情况、扩容表空间命令脚本(dba、ETL必备)

文章目录

Oracle数据库查询表空间使用情况、扩容表空间命令脚本(dba、ETL必备)
一、查看数据库每个表空间的大小
二、查看数据库剩余表空间大小
三、检查系统中所有表空间总体空间
四、查询oracle表空间使用情况(重点)用的最多

2、方式二(比较清晰使用情况)
3、方式三(比较清晰使用情况)

五、查询单张表的使用情况
六、查询所有用户表使用大小的前十名
七、解决方案(扩容表空间)

1、给表空间增加数据文件
2、新增数据文件,并且允许数据文件自动增长
3、允许已存在的数据文件自动增长
4、手工改变已存在数据文件的大小
5、如果执行第4步报错(无法修改已存在文件ora-03291)执行这步否则滤过

数据库中用户存储数据的存储大小(表结构+表中的数据),如果表空间不足会出现数据库连接失败、监听服务挂掉的情况,这时应查询表空间的使用情况并找到解决方法,以下说明解决方案。

提示:以下是本篇文章正文内容,下面案例可供参考

一、查看数据库每个表空间的大小

 

SELECT SEGMENT_NAME 表名称,SUM(BYTES)/1024/1024  占用空间 FROM USER_EXTENTS GROUP BY SEGMENT_NAME

 

效果截图

二、查看数据库剩余表空间大小

 

SELECT TABLESPACE_NAME 表空间,SUM(BLOCKS*8192/1000000) 剩余空间M FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME;

 

效果截图

三、检查系统中所有表空间总体空间

 

SELECT B.NAME 表空间名称,SUM(A.BYTES/1000000)总空间 FROM V$DATAFILE A,V$TABLESPACE B WHERE A.TS#=B.TS# GROUP BY B.NAME;

 

效果截图

四、查询oracle表空间使用情况(重点)用的最多

 

1、方式一

 

SELECT B.FILE_ID  文件ID,B.TABLESPACE_NAME 表空间,B.FILE_NAME 物理文件名,B.BYTES 总字节数,(B.BYTES-SUM(NVL(A.BYTES,0))) 已使用,SUM(NVL(A.BYTES,0)) 剩余,SUM(NVL(A.BYTES,0))/(B.BYTES)*100 剩余百分比
  FROM DBA_FREE_SPACE A,DBA_DATA_FILES B  WHERE A.FILE_ID=B.FILE_ID 
 GROUP BY             B.TABLESPACE_NAME,B.FILE_NAME,B.FILE_ID,B.BYTES 
 ORDER BY B.TABLESPACE_NAME

 

效果截图

红框内为数据库存储文件在服务器的路径,root用户 切换到oracle用户就能查到

 

2、方式二(比较清晰使用情况)

 

SELECT TABLESPACE_NAME "表空间",
       To_char(Round(BYTES / 1024, 2), '99990.00')
       || ''           "实有",
       To_char(Round(FREE / 1024, 2), '99990.00')
       || 'G'          "现有",
       To_char(Round(( BYTES - FREE ) / 1024, 2), '99990.00')
       || 'G'          "使用",
       To_char(Round(10000 * USED / BYTES) / 100, '99990.00')
       || '%'          "比例"
FROM   (SELECT A.TABLESPACE_NAME                             TABLESPACE_NAME,
               Floor(A.BYTES / ( 1024 * 1024 ))              BYTES,
               Floor(B.FREE / ( 1024 * 1024 ))               FREE,
               Floor(( A.BYTES - B.FREE ) / ( 1024 * 1024 )) USED
        FROM   (SELECT TABLESPACE_NAME TABLESPACE_NAME,
                       Sum(BYTES)      BYTES
                FROM   DBA_DATA_FILES
                GROUP  BY TABLESPACE_NAME) A,
               (SELECT TABLESPACE_NAME TABLESPACE_NAME,
                       Sum(BYTES)      FREE
                FROM   DBA_FREE_SPACE
                GROUP  BY TABLESPACE_NAME) B
        WHERE  A.TABLESPACE_NAME = B.TABLESPACE_NAME)
--WHERE TABLESPACE_NAME LIKE 'CDR%' --这一句用于指定表空间名称
ORDER  BY Floor(10000 * USED / BYTES) DESC;

 

效果截图

3、方式三(比较清晰使用情况)

 

SELECT B.FILE_NAME 物理文件名,B.TABLESPACE_NAME 表空间,B.BYTES/1024/1024 大小M,(B.BYTES-SUM(NVL(A.BYTES,0)))/1024/1024 已使用M,SUBSTR((B.BYTES-SUM(NVL(A.BYTES,0)))/(B.BYTES)*100,1,5) 利用率
  FROM DBA_FREE_SPACE A,DBA_DATA_FILES B
  WHERE A.FILE_ID=B.FILE_ID
  GROUP BY B.TABLESPACE_NAME,B.FILE_NAME,B.BYTES
  ORDER BY B.TABLESPACE_NAME

 

效果截图

五、查询单张表的使用情况

 

IFB_ACPT_CONT是您要查询的表名称

 

SELECT SEGMENT_NAME,BYTES/1024/1024 FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'IFB_ACPT_CONT' AND OWNER = USER

 

效果截图

六、查询所有用户表使用大小的前十名

 

SELECT * FROM (SELECT SEGMENT_NAME,BYTES FROM DBA_SEGMENTS WHERE OWNER = USER ORDER BY BYTES DESC ) WHERE ROWNUM <= 10

 

效果截图

七、解决方案(扩容表空间)

 

1、给表空间增加数据文件

 

DATAFILE标签标识添加的存储文件路径 SIZE 是文件大小

 

ALTER TABLESPACE app_data ADD DATAFILE '/data/oradata/BMS/TB_BMS.DBF' SIZE 1000M;

 

2、新增数据文件,并且允许数据文件自动增长

 

ALTER TABLESPACE app_data ADD DATAFILE '/data/oradata/BMS/TB_BMS.DBF' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 500M;

 

3、允许已存在的数据文件自动增长

 

ALTER DATABASE DATAFILE '/data/oradata/BMS/TB_BMS.DBF' AUTOEXTEND ON NEXT 10M MAXSIZE 500M;

 

4、手工改变已存在数据文件的大小

 

加10G

 

ALTER DATABASE DATAFILE '/data/oradata/BMS/TB_BMS.DBFF' RESIZE 10000M;

 

5、如果执行第4步报错(无法修改已存在文件ora-03291)执行这步否则滤过

 

1、查询oracle本次修改的数据文件及其编号。 找到对应的 FILE值

 

SELECT FILE#,NAME FROM V$DATAFILE;

2、查找该数据文件的最大块号。语句如下: 查询到的最大块为:2205952

FILE_ID 为上一步查询的id值,就是你需要添加存储大小的文件路径

 

SELECT MAX(BLOCK_ID) FROM DBA_EXTENTS WHERE FILE_ID=14;

 

3、显示SXSJ表空间每个数据块的大小。 数据库中得到的结果为8192,就是8K。

 

SELECT TABLESPACE_NAME,BLOCK_SIZE,STATUS,CONTENTS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME='TB_BMS'

 

4、计算该数据块占用的物理空间 17234,就是16个G左右

 

SELECT 2205952*8/1024 FROM DUAL;

 

5、修改原有的数据文件大小,改为10G

 

ALTER DATABASE DATAFILE '/DBSoft/oracle/oradata/ZHCS/zhcspdb/tb_bms01.dbf' RESIZE 10G;

 

验证一下

 

查一下表空间,原先只有4个G,加到10个G(注意:不是累加是修改存储文件的大小)

以上执行即可解决表空间存储文件满了,导致数据库灯登陆不上以及数据库监听挂掉的情况,我遇到的坑。

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注