临时表空间ORA-1652问题解决

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 有问题,产生笛卡尔积的结果。

使用 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,并查看执行计划,来验证是否耗尽临时表空间。


请使用浏览器的分享功能分享到微信等