ORA-1652: unable to extend temp segment by 128 in tablespace TEMP解决

问题描述

查看告警日志看到报错:

ORA-1652: unable to extend temp segment by 128 in tablespace                 TEMP

问题解决

常规检查ORA报错三部曲

第一部:检查Alert Log

告警日志中显示的报错与上述内容一致,并无过多内容可以追踪,但是可以确定的是,报错信息显示异常原因为temp表空间无法扩展
在这里插入图片描述
针对上述信息可以确认下一步动作:
1.确认temp tablespace空间大小
2.确认该表空间是否开启自动扩展
3.如果确认已开启自动扩展或已知表空间大小,则判断当时数据库的动作有无超过temp最大空间,即可定位至异常的原因

  • 查看temp表空间大小
SQL> select tablespace_name,file_name,bytes/1024/1024/1024 file_size,autoextensible from dba_temp_files;

TABLESPACE_NAME            FILE_NAME                       FILE_SIZE AUT
------------------------------ -------------------------------------------------- ---------- ---
TEMP                   +RACDB_DATA/racdb/tempfile/temp.321.966507821          10 NO
TEMP                   +RACDB_DATA/racdb/tempfile/temp.438.971462603          10 NO
TEMP                   +RACDB_DATA/racdb/tempfile/temp01.dbf              10 NO
TEMP                   +RACDB_DATA/racdb/tempfile/temp.360.966507817          10 NO

可以看出temp表空间下有4个数据文件,每个大小为10G,且为开启自动扩展
目前temp表空间总大小为40G

  • 错误定位
    根据配置可知,数据库单次获取的数据量应该小于40G,否则会出现temp表空间不足的情况
    查询在异常时间内(2020-06-23 10:00至12:00),占用资源超过40G的SQL
    TEMP_SPACE_ALLOCATED >=42949672960
SQL> select *
from
(
select INSTANCE_NUMBER iid,
to_char(SAMPLE_TIME,'mmdd hh24:mi:ss') SAMPLE_TIME,
to_char(SQL_EXEC_START,'mmdd hh24:mi:ss') SQL_EXEC_START,
SESSION_ID sess,
SESSION_SERIAL# serial#,
machine,
sql_id,
round(TEMP_SPACE_ALLOCATED/1024/1024/1024)   GB,
round(TEMP_SPACE_ALLOCATED/1024/1024)-lag(round(TEMP_SPACE_ALLOCATED/1024/1024),1,0) over (partition by INSTANCE_NUMBER,SESSION_ID,SESSION_SERIAL#,machine,program,SQL_EXEC_START order by SAMPLE_TIME)  diff
from dba_hist_active_sess_history
where
SAMPLE_TIME between TO_TIMESTAMP ('2020-06-23 10:00:00', 'YYYY-MM-DD HH24:MI:SS') and TO_TIMESTAMP ('2020-06-23 12:00:00', 'YYYY-MM-DD HH24:MI:SS')
and TEMP_SPACE_ALLOCATED >=42949672960
order by INSTANCE_NUMBER,SAMPLE_TIME,SQL_EXEC_START
)
where  diff >=1 order by GB desc;

未选定行

没有查询到结果。扩大了时间范围从8:00到12:00,还是没有结果。
否则,可以根据查询出来的sql_id查询对应的SQL

SQL> select * from dba_hist_sqltext where sql_id='xxx';

那么只能通过第二种方法:

生成AWR报告

告警日志的报错信息是12点左右,所以awr报告生成时间从11点-12点
在这里插入图片描述

可以看到发生了等待事件direct path readdirect path read temp
在这里插入图片描述

  • 查看引起物理读的前几名SQL
    在这里插入图片描述
  • 查看导致direct path write等待事件的sql
SQL> select sql_id, count(*) from gv$session where event = 'direct path write'
group by sql_id  order by count(*) desc;  2  

未选定行
SQL> select sql_id, count(*) from dba_hist_active_sess_history
where event = 'direct path write'
group by sql_id  order by count(*) desc;  2    3  

SQL_ID        COUNT(*)
------------- ----------
1gz69fj5z6kr6          47
1hvdu8dztxpfx          41
1s5dj6fckb73s          16
bt08vmahnwsm3           8
fp700pqw3yy00           5
b97wpwpmcuuvz           5
4wu7fmh7wcqqx           5
brntjyy188uk7           4
9g2rwr603usa7           4
0jfyv1q7m378w           3
2pxux7fu9tg7r           3
7spktz0yr1gxa           2
gayvdbrghw368           2
6fzzh1nqjc4t4           2
5f4k63fgy7t1r           2
               2
8u5159x70k02j           1
dmhqjx16c6w8y           1
956mwc1vc2ky6           1
9ycqu1mdf7svy           1
bqpnkpzk4bt2y           1
4k46mt51n7n8f           1
1arqnr7put41x           1
cmvrcbkpc2px3           1
5bzr32d7rya4f           1
47scxjyac9u03           1

已选择26行。
  • 直接查看导致direct path write temp等待事件的sql
SQL> select sql_id, count(*) from gv$session where event = 'direct path write temp'
group by sql_id  order by count(*) desc;  2  

未选定行
SQL> select sql_id, count(*) from dba_hist_active_sess_history
where event = 'direct path write temp'
group by sql_id  order by count(*) desc;  2    3  

SQL_ID        COUNT(*)
------------- ----------
cqg6vfbga9q95          12
0h95w07ddcg2u           5
a9q2hvagvvs81           3
dc9g07nz7a2pp           2
dx059p2t30q04           1
29fy3yj4n7pxb           1
0ffv6pfmr3bx2           1
cu16dzgjyyysj           1
dkfqxss9cwtg8           1
3xsyjsjbgz4yy           1
7jds61daks522           1
2tnt2pa3b9prp           1
66gkwjphn9zvb           1
gv2fufczm34s4           1
dcp9w720y3zfm           1
bjyp0nj6j2nhj           1
0xa2mbckpp4xa           1
0zs65b6zpquxb           1
0dspay35dqdgt           1
dwhb1gruxvx9p           1
27nktfu251hg8           1
5ddsan4jp3zap           1
dnzpwyy0tw969           1
fr26gt7zucnsp           1
03zktf63bd1bs           1

已选择25行。

cqg6vfbga9q95这条sql在物理读也是居高榜首,那么他一定有问题

查看sql_id为cqg6vfbga9q95的SQL

SQL> select * from dba_hist_sqltext where sql_id='cqg6vfbga9q95';

      DBID SQL_ID     SQL_TEXT                           COMMAND_TYPE
---------- ------------- ------------------------------ ------------
801114584 cqg6vfbga9q95 select xx from xx;                3

异常处理

优先确认相关的SQL具体的功能,判断是否为系统异常操作

  • 如果是异常操作导致,则忽略不计
  • 如果为系统正常操作导致,则判断是否需要新增TEMP表空间
### 解决方案概述 ORA-01652 错误表示无法在指定的临时表空间中扩展临时段。这通常是因为临时文件的空间不足或配置不当引起的。以下是针对该问题的具体解决方案。 #### 创建新的临时表空间 可以通过创建一个新的临时表空间来解决问题。例如: ```sql create temporary tablespace TEMPTS2 tempfile '/u01/app/oracle/oradata/jhim/temp02.dbf' size 10m reuse autoextend on; ``` 此命令会创建名为 `TEMPTS2` 的新临时表空间,并设置其初始大小为 10MB,允许自动扩展[^1]。 #### 切换默认临时表空间 一旦成功创建了新的临时表空间,可以将其设为系统的默认临时表空间: ```sql alter database default temporary tablespace TEMPTS2; ``` 通过上述操作,所有新建的会话都会使用新的临时表空间 `TEMPTS2` 而不是原来的表空间。 #### 验证临时文件状态 为了确认新表空间的状态以及验证旧表空间中的文件是否支持自动扩展,可运行以下查询: ```sql select file_name, autoextensible from dba_temp_files; ``` 如果结果显示某些文件不支持自动扩展,则需要调整这些文件的属性以启用自动扩展功能。 --- ### 增加现有临时表空间的数据文件 除了创建新的临时表空间外,还可以向现有的临时表空间添加额外的数据文件。具体做法如下: ```sql ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/jhim/temp03.dbf' SIZE 50M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED; ``` 这条语句会在当前的 `TEMP` 表空间下新增一个数据文件 `/u01/app/oracle/oradata/jhim/temp03.dbf`,并设定相应的参数以便于动态管理存储需求[^2]。 --- ### 处理已存在的大事务占用资源情况 当遇到 ORA-01652 错误时,可能的原因之一是存在长时间运行的大事务占用了大量临时段而未释放。此时应考虑等待这些事务完成或者终止它们以回收被锁定的资源[^3]。 另外,在日常维护工作中定期监控和优化临时表空间也是预防此类错误的有效手段之一。 --- ### 总结 对于 ORA-01652 错误,推荐采取以下措施: 1. **增加容量**:通过增大已有临时文件尺寸或将更多磁盘分配给特定表空间; 2. **更换表空间**:建立全新的临时表空间作为替代品; 3. **清理无用对象**:结束那些不必要的长期活动从而腾出可用空间; 以上方法均有助于缓解因临时段短缺引发的各种性能瓶颈问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值