Oralce清理多余的session
首先我们了解下,会话有那些状态:
1、active
此状态的会话,表示正在执行,处于活动状态。
2、killed
此状态的会话,被标注为删除,表示出现了错误,正在回滚,当然,也是占用系统资源的。还有一点就是,killed的状态一般会持续较长时间,而且用windows下的工具pl/sql developer来kill掉,是不管用的,要用命令:alter system kill session ‘sid,serial#’ ;
3、inactive
该状态处于等待操作(即等待需要执行的SQL语句),通常当DML语句已经完成。 但连接没有释放,这个可能是程序中没有释放,如果是使用中间件来连接的话,也可能是中间件的配置或者是bug 导致。
4、SNIPED- Session inactive, waiting on the client
其它说明:
inactive对数据库本身没有什么影响,但是如果程序没有及时commit,那么就会造成占用过多会话。容易是DB 的session 达到极限值。
他们的做法是不处理inactive 状态的session, 如果达到了session 的最大值, 就增加processes 和 sessions 参数。 如果kill inactive session 可能会到中间件有影响。
下面讲怎么清除长时间的会话数:
1、启动资源计划
alter system set resource_limit=true scope=spfile;
2、设置非活动回话十五分钟断开,释放资源
alter profile default limit idle_time 15;
- 清楚非活动的进程 (没10分钟发送检测包)
$ORACLE_HOME/network/admin 添加 SQLNET.EXPIRE_TIME=10;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | SELECT SID, SERIAL#,MODULE, STATUS FROM V$SESSION S WHERE S.USERNAME ISNOTNULL ANDUPPER(S.PROGRAM) IN ( 'TOAD.EXE' , 'W3WP.EXE' ) AND S.LAST_CALL_ET >= 60*60*2 AND S.STATUS = 'INACTIVE' ORDERBY SID DESC; --如果是RAC环境,那么最好使用下面SQL语句,使用全局视图GV$SESSION。 SELECT SID, SERIAL#, INST_ID, MODULE,STATUS FROM gv$session S WHERE S.USERNAME ISNOTNULL ANDUPPER(S.PROGRAM) IN ( 'TOAD.EXE' , 'W3WP.EXE' ) AND S.LAST_CALL_ET >= 2 * 60*60 AND S.STATUS = 'INACTIVE' ORDERBY INST_ID DESC CREATE OR REPLACE PROCEDURE SYS.DB_KILL_IDLE_CLIENTS AUTHID DEFINER AS job_no number; num_of_kills number := 0; BEGIN FOR REC IN (SELECT SID, SERIAL#, INST_ID, MODULE,STATUS FROM gv$session S WHERE S.USERNAME IS NOT NULL AND UPPER(S.PROGRAM) IN ( 'xxx' , 'xxx.EXE' ) AND S.LAST_CALL_ET >= 2*60*60 AND S.STATUS= 'INACTIVE' ORDER BY INST_ID ASC ) LOOP --------------------------------------------------------------------------- -- kill inactive sessions immediately --------------------------------------------------------------------------- DBMS_OUTPUT.PUT( 'LOCAL SID ' || rec.sid || '(' || rec.module || ')' ); execute immediate 'alter system kill session ' '' || rec.sid || ', ' || rec.serial# || '' 'immediate' ; DBMS_OUTPUT.PUT_LINE( '. killed locally ' || job_no); num_of_kills := num_of_kills + 1; END LOOP; DBMS_OUTPUT.PUT_LINE ( 'Number of killed xxxx system sessions: ' || num_of_kills); END DB_KILL_IDLE_CLIENTS; / 我们可以在作业(JOB)或Schedule里面定期调用该存储过程,也可以通过后台作业结合shell脚本实现定期清理空闲会话的功能。例如如下所示。 创建killSession.sh脚本,调用该存储过程SYS.DB_KILL_IDLE_CLIENTS #!/bin/bash logfile=/home/oracle/cron/session/log/killSession.log echo " " >> $logfile 2>&1 echo "START ----`date`" >> $logfile 2>&1plus /nolog <<STATS connect / as sysdba exec sys.db_kill_idle_clients; exit; STATSecho "END ------`date`" >> $logfile 2>&1 |
最后在系统任务中增加:
在crontab里面配置后台作业,每隔15分钟运行一次,清理哪些满足条件的空闲会话。y
0,15,30,45 * * * * /home/oracle/cron/session/bin/killSession.sh >/dev/null 2>&1
原文链接:
https://blog.csdn.net/xyl870419/article/details/232521505
SELECT SID, SERIAL#,MODULE, STATUS
FROM V$SESSION S
WHERE S.USERNAME ISNOTNULL
ANDUPPER(S.PROGRAM) IN ('TOAD.EXE', 'W3WP.EXE')
AND S.LAST_CALL_ET >= 60*60*2
AND S.STATUS = 'INACTIVE'
ORDERBY SID DESC;
--如果是RAC环境,那么最好使用下面SQL语句,使用全局视图GV$SESSION。
SELECT SID, SERIAL#, INST_ID, MODULE,STATUS
FROM gv$session S
WHERE S.USERNAME ISNOTNULL
ANDUPPER(S.PROGRAM) IN ('TOAD.EXE', 'W3WP.EXE')
AND S.LAST_CALL_ET >= 2 * 60*60
AND S.STATUS = 'INACTIVE'
ORDERBY INST_ID DESC
CREATE OR REPLACE PROCEDURE SYS.DB_KILL_IDLE_CLIENTS AUTHID DEFINER AS
job_no number;
num_of_kills number := 0;
BEGIN FOR REC IN
(SELECT SID, SERIAL#, INST_ID, MODULE,STATUS
FROM gv$session S
WHERE S.USERNAME IS NOT NULL
AND UPPER(S.PROGRAM) IN ('xxx', 'xxx.EXE')
AND S.LAST_CALL_ET >= 2*60*60
AND S.STATUS= 'INACTIVE'
ORDER BY INST_ID ASC
) LOOP
---------------------------------------------------------------------------
-- kill inactive sessions immediately
---------------------------------------------------------------------------
DBMS_OUTPUT.PUT('LOCAL SID ' || rec.sid || '(' || rec.module || ')');
execute immediate 'alter system kill session ''' || rec.sid || ', ' ||
rec.serial# || '''immediate' ;
DBMS_OUTPUT.PUT_LINE('. killed locally ' || job_no);
num_of_kills := num_of_kills + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE ('Number of killed xxxx system sessions: ' || num_of_kills);
END DB_KILL_IDLE_CLIENTS;
/
我们可以在作业(JOB)或Schedule里面定期调用该存储过程,也可以通过后台作业结合shell脚本实现定期清理空闲会话的功能。例如如下所示。
创建killSession.sh脚本,调用该存储过程SYS.DB_KILL_IDLE_CLIENTS
#!/bin/bash
logfile=/home/oracle/cron/session/log/killSession.log
echo " " >> $logfile 2>&1
echo "START ----`date`" >> $logfile 2>&1plus /nolog <<STATS
connect / as sysdba
exec sys.db_kill_idle_clients;
exit;
STATS

您的资助是我最大的动力!
金额随意,欢迎来赏!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)