临时表空间满分析

oracle 临时表空间满,业务无法进行,临时表空间快速增长通过以下方式来分析

分析步骤

1. 查看临时空间占用情况

  • 总占用情况
select inst_id,  username, blocks*8/1024/1024 from  gv$tempseg_usage  order by blocks DESC;

2. 查看会话的占用临时空间情况

  • 通过会话和应用做分类
--11g
 SELECT a.inst_id,b.sid,b.serial#,sum(a.blocks*8/1024/1024),b.program
                                            FROM  gv$tempseg_usage a,gv$session b WHERE a.inst_id=b.inst_id  AND a.session_num=b.serial# AND a.SESSION_ADDR =b.SADDR  GROUP BY
                                          a.inst_id,b.sid,b.serial#,b.program ORDER BY sum(a.blocks*8/1024/1024) DESC 
--19c
SELECT a.sql_id_tempseg, a.inst_id,b.sid,b.serial#,sum(a.blocks*8/1024/1024),b.program
                                            FROM  gv$tempseg_usage a,gv$session b WHERE a.inst_id=b.inst_id  AND a.session_num=b.serial# AND a.SESSION_ADDR =b.SADDR  GROUP BY
                                        a.sql_id_tempseg,  a.inst_id,b.sid,b.serial#,b.program ORDER BY sum(a.blocks*8/1024/1024) DESC 


如果超过几个g,可以采用kill处理
临时解决方法

alter system kill session 'sid,serial#,@inst_id' immediate;

--19c 的话,可以直接具体的sql_id查看,通过上面的sql_id_tempseg 获取到

SELECT * FROM gv$sql WHERE sql_id=

3. 查看会话空间增长情况

分析这个时间段07:00-08:30会话的,增量量情况如何

SELECT * FROM (select sample_time,session_id,session_serial#,sql_id,temp_space_allocated/1024/1024 temp_mb,

               temp_space_allocated/1024/1024-lag(temp_space_allocated/1024/1024,1,0) over (order by sample_time) as temp_diff

               from Gv$active_session_history

               where

               session_id=1201

               and session_serial#=55655 and

               SAMPLE_TIME>TO_dATE('2025-01-01 07:00:00','YYYY-MM-DD HH24:MI:SS') AND  SAMPLE_TIME<TO_dATE('2025-01-01 08:30:00','YYYY-MM-DD HH24:MI:SS')

               order by sample_time DESC) A ;

都是一点一点累増的,没有任何释放。其他会话查看也是类似的情况

4. 分析相关的sql

通过sql_id分析相对的sql语句,发现问题

  • wm_concat:调用wmsys.wm_concat

5. WM_CONCAT为什么会导致增长

排查一些资料,应该是oracle的bug

  • WMSYS.WM_CONCAT Should Not Be Used For Customer Applications, It Is An Internal Function [ID 1336219.1]
    Problem with WMSYS.WM_CONCAT Function after Upgrading [ID 1300595.1]
  • SQL USING WM_CONCAT RUNS SLOWER IN 10.2.0.5 and 11.2.0.2 [ID 1393596.1]
  • How to Release Temporary LOB Segments without Closing the JDBC Connection [ID 1384829.1]
  • How to Release the Temp LOB Space and Avoid Hitting ORA-1652 [ID 802897.1]
    使用了clob或者blob字段后,WM_CONCAT导致,无法释放临时空间。

改进措施

1. 处理方案

  • 杀了一些占用过高
  • 把wm_CONCAT,自己来创建返回to_char类型,外面的附件有类似自定义的创建函数,来替换。或者11g以后使用listagg来替换
  • 设置alter system set events '60025 trace name context forever';这样还要看看效果

2. 预防措施

主要通过脚本,钉钉推送,加上阈值干预,kill session和增加临时空间

  • 监控脚本
select case
when round(g.usedtemp/f.zmax*100) >= 70 and round(g.usedtemp/f.zmax*100) < 80 then
'目前临时表空间占用:' || round(g.usedtemp/f.zmax*100) || '%,可以适当处理'
when round(g.usedtemp/f.zmax*100) >= 80 and round(g.usedtemp/f.zmax*100) < 90 then
'目前临时表空间占用:' || round(g.usedtemp/f.zmax*100) || '%,马上处理'
when round(g.usedtemp/f.zmax*100) >= 90 then
'目前临时表空间占用:' || round(g.usedtemp/f.zmax*100) || '%,快崩了,快快处理'
else
'目前临时表空间占用:' || round(g.usedtemp/f.zmax*100) || '%'
end content,round(g.usedtemp/f.zmax*100) value
from (
select round(sum(decode(autoextensible, 'YES', maxbytes, 'NO', bytes) / 1048576/1024),2) zmax from dba_temp_files) f,(select round(sum(blocks*8/1024/1024),2) usedtemp from gv$tempseg_usage) g
where round(g.usedtemp/f.zmax*100)>=50
group by g.usedtemp,f.zmax
  • 用python 可以开发一个类似的监控,如一下,利用AI写代码的功能,python 写代码还是很方便的

附件

1. 参考资料

语法高亮让你的代码更易读。

2. 自定义的wm_concat

--定义类型
-- WDHIS.WM_CONCAT_IMPL definition

CREATE OR REPLACE TYPE WDHIS.WM_CONCAT_IMPL                                                                                                                                                                                                                                         AS OBJECT
-- AUTHID CURRENT_USER AS OBJECT
(
CURR_STR VARCHAR2(32767), 
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
P1 IN VARCHAR2) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER
);

TYPE BODY       WM_CONCAT_IMPL
IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL)
RETURN NUMBER
IS
BEGIN
SCTX := WM_CONCAT_IMPL(NULL) ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
P1 IN VARCHAR2)
RETURN NUMBER
IS
BEGIN
IF(CURR_STR IS NOT NULL) THEN
CURR_STR := CURR_STR || ',' || P1;
ELSE
CURR_STR := P1;
END IF;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER
IS
BEGIN
RETURNVALUE := CURR_STR ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
SCTX2 IN WM_CONCAT_IMPL)
RETURN NUMBER
IS
BEGIN
IF(SCTX2.CURR_STR IS NOT NULL) THEN
SELF.CURR_STR := SELF.CURR_STR || ',' || SCTX2.CURR_STR ;
END IF;
RETURN ODCICONST.SUCCESS;
END;
END;

--自定义函数
CREATE OR REPLACE FUNCTION WDHIS.wm_concat(P1 VARCHAR2)
RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;
posted @ 2025-03-17 18:21 gull 阅读(12) 评论(0) 推荐(0) Edit
1. 背景 业务出现异常后,或者某个sql导致系统卡顿。需要问题后需要溯源,需要获取这个sql是在哪个客户端的IP发起的。 2. cs架构 客户端直接连接数据库,可以很方便查询,采用通过sql_id找到客户端、进程或者port等,默认的模式是没有ip地址记录 select machine,progr Read More
posted @ 2024-12-13 15:03 gull 阅读(359) 评论(0) 推荐(1) Edit
目录 1、自动捕获 当optimizer_capture_sql_plan_baselines参数设置为TRUE,查询优化器自动存储新SQL计划的基线,默认是FALSE。 第一个SQL语句被执行只是把signature插入到log日志中,第二次相同的语句执行时,一个SQL执行基线仅包含创建当前执行计 Read More
posted @ 2018-03-29 10:12 gull 阅读(211) 评论(0) 推荐(0) Edit
目录 1、如何工作 2、何时使用 1、如何工作 sql plan baseline 是一个关联sql 语句的对象,设计会影响查询优化器生成执行计划,更具体的说,一个sql baseline包含其中的一些内容,一个或多个执行计划的一组HINTS信息,基本上一个SQL plan baselines被使用 Read More
posted @ 2018-03-29 09:19 gull 阅读(254) 评论(0) 推荐(0) Edit
目录 1 sql跟踪 1.1 alter session 1.2 DBMS_MONITOR 1.3 DBMS_SESSION 1.4 oradebug模式 1.5 触发器的模式启用sql 跟踪 1.6 跟踪文件中时间信息 1.7 跟踪文件限制大小 1.8 查找跟踪文件 2 跟踪内容说明 3 TKPR Read More
posted @ 2018-03-08 14:06 gull 阅读(499) 评论(0) 推荐(0) Edit
一、历史执行计划固定 历史的执行计划找到一个合理的执行计划进行绑定 1. 存在多个执行计划的语句,按照索引是比较合适的,FULL SCAN不合适 存在两个执行计划,使之后的SQL语句都走Plan hash value: 1404472509 处理模 2、运行coe_xfr_sql_profile脚本 Read More
posted @ 2016-07-05 22:30 gull 阅读(4681) 评论(0) 推荐(0) Edit
固定(稳定)执行计划 你的应用的功能时快时慢,变化比较大,功能的性能能够保持一种稳定的状态,ORACLE 固定执行计划,采用以下这几种方式 oracle 9i使用 Outline oracle 10g采用 sql profile oracle 11g增加了sql plan manage oracle Read More
posted @ 2016-06-23 14:26 gull 阅读(5071) 评论(0) 推荐(0) Edit
一、AND-EQUAL(INDEX MERGE) 谓词中多个列等值条件,并且这些列上都有单键值的索引,oracle会合并扫描单个索引的rowid集合。 通过先访问IND_EMP_JOB、INDEX_EMP_DEPTNO这两个索引后,在过滤rowid相同的在filter(("A"."JOB"='SAL Read More
posted @ 2016-06-23 13:03 gull 阅读(436) 评论(0) 推荐(0) Edit
一、表访问方式 CBO基础概念中有讲到,访问表的方式有两种:全表扫描和ROWID扫描。 全表扫描的执行计划:TABLE ACCESS FULL ROWID扫描对应执行计划:TABLE ACCESS BY USER ROWID 或 TABLE ACCESS BY INDEX ROWID 通过例子说明 Read More
posted @ 2016-06-12 23:18 gull 阅读(1272) 评论(0) 推荐(0) Edit
执行计划的组成部分 正确的看执行计划 DBMS_XPLAN 这个包是一个很好查看执行计划,显示很多格式,来分析执行计划中存在的问题 format:控制详细执行计划输出的格式,包含以下内容: BASIC:显示最少的信息-ID,operation name TYPICAL :默认,在计划中显示最多相关信 Read More
posted @ 2016-06-08 16:30 gull 阅读(3591) 评论(0) 推荐(0) Edit
点击右上角即可分享
微信分享提示