文章目录
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