Oracle表空间溢出排查及解决方案(oracle表空间不够)
Oracle表空间溢出是一种常见的数据库性能问题,指的是表空间上的数据\索引段空间彻底用光或者平均分配空间已经满了,这样就不能再插入新的行或者扩大表的键空间。处理此类问题首先应当从查询表空间溢出原因开始,一般可使用以下方法来检测表空间溢出:
一,查询表空间溢出情况
使用如下sql脚本,查询表空间的使用情况:
SELECT
substr(a.tablespace_name,1,30) “表空间名 “,
a.BYTES/1024/1024 “表空间大小M “,
ROUND(b.BYTES/1024/1024,2) “已使用M “,
ROUND((a.BYTES-b.BYTES)/1024/1024,2) “未使用M “,
(ROUND((a.BYTES-b.BYTES)/a.BYTES,3)*100)||’%’ “表空间使用率%”
FROM
(SELECT TABLESPACE_NAME,SUM(BYTES) BYTES FROM dba_data_files GROUP BY TABLESPACE_NAME) a,
(SELECT TABLESPACE_NAME,SUM(BYTES) BYTES FROM DBA_SEGMENTS WHERE SEGMENT_NAME NOT LIKE ‘BIN$%’ GROUP BY TABLESPACE_NAME) b
WHERE
a.TABLESPACE_NAME = b.TABLESPACE_NAME;
二,查询是否有表空间上特定表无索引段空间
如果发现有表空间使用率较高,我们可以通过下面的sql语句查询特定表空间上某个表是否存在无索引段空间:
select
segment_name,segment_type,bytes
from
dba_segments
where
tablespace_name=’xx’ and segment_name=’yy’ and bytes=’0′
如果查询结果存在,则可判断是表空间溢出的问题了。
三,解决表空间溢出问题
1.如果发现表空间溢出,首先应当移动表或扩大表空间,以免影响存在的数据。
2.检查是否有rows chained/migrated情况,如果存在,可以执行analyze table的table的sql语句,及时的调整chained rows和migrated rows,从而避免表空间溢出。
3.通过调整table的pctfree和pctused参数,使其尽可能均匀的分布表数据,以及避免表空间溢出。
4.适当减少Indexes的对表空间的使用,减少Indexes分段的数量,或者升级Index结构。
5.如果由于临时活动引发的短期表空间压力,在容许的情况下可临时改变数据库扩展空间的大小。
6.适当增减 table空间大小,也可以采取即时增加伸缩空间文件等操作限制表空间溢出。
由上述步骤,我们可以正确地查询表空间溢出情况,并采取有效的措施来解决表空间溢出问题,提升数据库性能。