1 某业务系统数据库告警如下:
Tue Dec 14 16:50:14 2021
ORA-1652: unable to extend temp segment by 128 in tablespace TEMP1
2 在17:00 查看临时表空间,几个节点进行查看,使用率为 0% ;但为什么会报临时表空间不足?距离告警时间只有10分钟。
节点 1
TABLESPACE_NAME Total(MB) Used(MB) Free(MB) Pct. Free(%)
------------------------------ ---------- ---------- ---------- ------------
TEMP1 215040 0 215040 100
TEMP 155647 3 155644 100
TEMP2 28672 0 28672 100
节点 2 :
TABLESPACE_NAME Total(MB) Used(MB) Free(MB) Pct. Free(%)
------------------------------ ---------- ---------- ---------- ------------
TEMP1 215040 0 215040 100
TEMP 155647 2 155645 100
TEMP2 28672 0 28672 100
3
根据
ASH
查看
16:40-16:50
执行的相关
SQL
,在节点
2
上发现如下
SQL
进行排序。


4 查看相关 SQL 的执行计划,发现进行排序耗费的临时表空间为 18E ,即为 18*1024*1024G ,这明显应该是写的 SQL 有问题,产生笛卡尔积的结果。

5 使用 PLSQL 进行对相关 SQL 进行格式化,发现此 SQL 没有 where 条件,故导致笛卡尔积。
select table_A.CONS_ID as "CONS_ID", table_A.CUST_ID as "CUST_ID",
...................
'' as "TYPE_CODE"
from table_A, table_B, table_C, table_D order by ORG_NO, table_A.CONS_NO
6 原因分析:
在查询临时表空间是否够用?如果是RAC,则每个节点都需要进行查询,原因为RAC环境下,临时表空间为共用的,
即在节点1查询临时表空间是够用的,在节点2有可能已经耗尽。如果事件已经发生,不能通过当前会话查询出耗尽临时表空间的SQL,那么可以通过生成每个节点的ASH,查看顶级事件中是否有sort关键字的SQL,并查看执行计划,来验证是否耗尽临时表空间。