1.1现象

存在一套11.2.0.4 RAC 2节点,数据库存在5000个会话数量,其中active正在执行的会话500个,其余均为非活跃会话。

大量inactive会话过多给Oracle数据库带来什么样的影响?

[活跃说明数据库存在大量并发,正常情况下说明是业务负载这块只能拆库,常规无法优化套路】

1) 内存消耗,每个会话对应数据库来说都是一个pga process 需要单独分配一块内存区域,并且其中会话保留的游标越多,越消耗内存;

2) cpu资源消耗,每个会话对应操作系统来说都是一个Oracle用户进程,虽然大量属于inactive 但是对于操作系统来说还是一个进程运行;

1.2相关参数

SESSIONS
Default value Derived: (1.5 * PROCESSES) + 22
Range of values 1 to 216 (which is 1 to 65536)
SESSIONS specifies the maximum number of sessions that can be created in the system. Because every login requires a session, this parameter effectively determines
the maximum number of concurrent users in the system. You should always set this parameter explicitly to a value equivalent to your estimate of the maximum number of concurrent users,
plus the number of background processes, plus approximately 10% for recursive sessions. PROCESSES
Default value 100
Range of values 6 to operating system dependent
PROCESSES specifies the maximum number of operating system user processes that can simultaneously connect to Oracle. Its value should allow for all background processes such as locks,
job queue processes, and parallel execution processes. # vi /etc/security/limits.conf
oracle soft nproc 32
oracle hard nproc 64
#ulimit -a

1.3 方法论

状态
1.活跃会话基本上无法处理,Oracle数据库拆分[极端情况例如:会话挤压等异常情况,处理数据库异常后,活跃会话趋于平稳】;
2.非活跃会话可以定期清理 参考文档
https://www.anbob.com/archives/5837.html 非活跃会话方法论:
A:dead session
Dead connection detection(DCD)是Oracle网络功能,主要用于客户端关闭其系统电源或客户端计算机意外崩溃而又无法正常关闭Oracle数据库连接的环境。
如果客户端计算机因正确断开会话而突然崩溃,则这些会话锁定的资源将继续被锁定,从而导致环境性能问题。由于这种情况可以在任何环境中发生,因此Oracle网络服务提供了DCD的功能,可以在早期检测到这种情况,从而可以快速恢复锁定的资源。
为了解决这种情况并检测死连接,Oracle在网络会话(12c中的tcp)层引入了一个新概念。服务器进程将SQL * Net Probe数据包发送到客户端,以检查在sqlnet.expire_time【单位:分钟】参数指定的每个固定时间间隔内连接是否仍然可用。
如果通过探测数据包的通信失败,则会返回错误,导致服务器进程退出。
SQLNET.EXPIRE_TIME = 10 B:idel session
1.WAS等中间件或程序软件,存在会话一定时间不工作自动断开设置;
2.MAX_IDLE_TIME指定会话可以空闲的最大分钟数。 此后会话将自动终止。12.2 引入的新参数。这参数是整个db或CDB级,不可以alter session. 单位分钟,超过idle上限时间后会收到 ORA-03113错误。
3.编写plsql脚本,定期执行[如下详细说明] C:idle blocker session
1.目前常规基本上都是DBA人为参与处理;
2.如果一个idle session阻塞了其他会话,在19c 20c中可以使用参数max_idle_blocker_time 自动终止blocker, 当会话持有其他会话所需的资源时,该会话被视为阻塞会话.
1)如 该会话持有另一个会话所需的锁。
2)该会话是并行操作,并且其使用者组,PDB或数据库已达到其最大并行服务器限制或已排队的并行操作。
3)会话的PDB或数据库实例即将达到其SESSIONS或PROCESSES限制。
此参数与MAX_IDLE_TIME参数的不同之处在于,MAX_IDLE_TIME适用于所有会话(阻塞和非阻塞),而MAX_IDLE_BLOCKING_TIME仅适用于阻塞会话。 因此,为了使MAX_IDLE_BLOCKING_TIME有效,其限制必须小于MAX_IDLE_TIME限制。

1.4 模拟人工处理

操作系统并发20进行登录,使用1000并发测试主机hang
#!/bin/bash
i=1
while (($i<=20))
do
sqlplus -S scott/tiger &
let "i++"
echo $1
done

测试环境process 400达到上限报错

ERROR:
ORA-00020: maximum number of processes (400) exceeded
Thu Oct 22 02:24:15 2020
ORA-00020: maximum number of processes (400) exceeded
ORA-20 errors will not be written to the alert log for
the next minute. Please look at trace files to see all
the ORA-20 errors.
Process m000 submission failed with error = 20
Process m000 submission failed with error = 20
Process m000 submission failed with error = 20
Process m000 submission failed with error = 20
Thu Oct 22 02:24:18 2020

DB 什么视图记录历史登录情况达到上限值???
SQL> SELECT * FROM GV$RESOURCE_LIMIT WHERE RESOURCE_NAME='sessions' or RESOURCE_NAME='processes';

手工方法输出KILL语句

SELECT STATUS,COUNT(*) FROM GV$SESSION GROUP BY STATUS;
select username,round(LAST_CALL_ET/3600) as "HH24",count(*) from gv$session where status='INACTIVE'
group by username,round(LAST_CALL_ET/3600) order by 2,3,1;
select 'ALTER SYSTEM KILL session '''||sid||','||serial#||''' IMMEDIATE;' AS "KILL_SQL" from v$session where status='INACTIVE'
AND LAST_CALL_ET>600 AND USERNAME='CC'
union
select 'ALTER SYSTEM KILL session '''||sid||','||serial#||''' IMMEDIATE;' AS "KILL_SQL" from v$session where status='INACTIVE'
AND LAST_CALL_ET>36000 AND USERNAME='CB';

plsql执行kill inactive session

SET SERVEROUTPUT ON
DECLARE
P_SID NUMBER;
P_SERIAL NUMBER;
P_STATUS VARCHAR2(32);
KILL_SQLTEXT VARCHAR2(4000);
CURSOR CUR_APP_ID IS
SELECT
SID, SERIAL#
FROM
V$SESSION
WHERE STATUS = 'INACTIVE' AND USERNAME IN('SCOTT') AND STATUS = 'INACTIVE' AND LAST_CALL_ET >6 ;
BEGIN
OPEN CUR_APP_ID;
LOOP
FETCH CUR_APP_ID INTO P_SID,P_SERIAL;
EXIT WHEN CUR_APP_ID%NOTFOUND;
SELECT
STATUS
INTO P_STATUS
FROM
V$SESSION
WHERE
SID = P_SID AND SERIAL# = P_SERIAL AND USERNAME IN('SCOTT') AND STATUS = 'INACTIVE' AND LAST_CALL_ET >6 ;
IF P_STATUS = 'INACTIVE' THEN
KILL_SQLTEXT := 'ALTER SYSTEM KILL SESSION '||CHR(39)||P_SID || ',' || P_SERIAL ||CHR(39)||' IMMEDIATE';
EXECUTE IMMEDIATE KILL_SQLTEXT;
DBMS_OUTPUT.PUT_LINE(KILL_SQLTEXT);
END IF;
END LOOP;
CLOSE CUR_APP_ID;
END;
/

1.5 配置定时任务

!对于RAC 2节点,需要每个节点都配置这个脚本,建议时间错开一定时间,例如30分钟。 通过实际执行发现kill 1300 inactive session话费时间3分钟左右。
[oracle@test script]$ chmod +x kill_inactive_session.sh
[oracle@test script]$ cat kill_inactive_session.sh
#!/bin/bash
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1/
export ORACLE_SID=tt
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
sqlplus / as sysdba <<EOF
spool /home/oracle/script/kill_session.log
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as "date" from dual;
SET SERVEROUTPUT ON
DECLARE
P_SID NUMBER;
P_SERIAL NUMBER;
P_STATUS VARCHAR2(32);
KILL_SQLTEXT VARCHAR2(4000);
CURSOR CUR_APP_ID IS
SELECT
SID, SERIAL#
FROM
V\$SESSION
WHERE STATUS = 'INACTIVE' AND USERNAME IN('SCOTT') AND STATUS = 'INACTIVE' AND LAST_CALL_ET >6 ;
BEGIN
OPEN CUR_APP_ID;
LOOP
FETCH CUR_APP_ID INTO P_SID,P_SERIAL;
EXIT WHEN CUR_APP_ID%NOTFOUND;
SELECT
STATUS
INTO P_STATUS
FROM
V\$SESSION
WHERE
SID = P_SID AND SERIAL# = P_SERIAL AND USERNAME IN('SCOTT') AND STATUS = 'INACTIVE' AND LAST_CALL_ET >6 ;
IF P_STATUS = 'INACTIVE' THEN
KILL_SQLTEXT := 'ALTER SYSTEM KILL SESSION '||CHR(39)||P_SID || ',' || P_SERIAL ||CHR(39)||' IMMEDIATE';
EXECUTE IMMEDIATE KILL_SQLTEXT;
DBMS_OUTPUT.PUT_LINE(KILL_SQLTEXT);
END IF;
END LOOP;
CLOSE CUR_APP_ID;
END;
/
exit;
EOF [oracle@test script]$ crontab -l
01 07,21 * * * sh /home/oracle/script/kill_inactive_session.sh & # tail -200f //var/log/cron
Oct 22 07:00:01 test crond[4834]: (oracle) CMD (sh /home/oracle/script/kill_inactive_session.sh &)

数据库会话数量过多,定期清理inactive会话的更多相关文章

  1. ORACLE定期清理INACTIVE会话

      ORACLE数据库会话有ACTIVE.INACTIVE.KILLED. CACHED.SNIPED五种状态.INACTIVE状态的会话表示此会话处于非活动.空闲.等待状态.例如PL/SQL Dev ...

  2. 【转】ORACLE定期清理INACTIVE会话

    源地址:http://www.cnblogs.com/kerrycode/p/3636992.html ORACLE数据库会话有ACTIVE.INACTIVE.KILLED. CACHED.SNIPE ...

  3. Servlet之会话(Session)以及会话追踪技术(Cookie),(URL重写)和(隐藏表单域)

    Session 什么是会话? 会话: Web应用中的会话 指的是一个客户端浏览器与Web服务器之间连续发生的一系列请求和响应的过程 会话状态: Web服务器和浏览器在会话的过程中产生的状态信息 作用: ...

  4. laravel会话驱动扩展—连接自定义会话管理系统

    laravel 版本:5.3.* 用laravel开发公司信息系统过程中,由于业务或安全问题的考虑,会有一些特殊的用户会话管理方面的需求,如多个子系统会话统一管理或A系统业务操作导致B系统中某些在线用 ...

  5. 编写高质量代码改善C#程序的157个建议——建议78:应避免线程数量过多

    建议78:应避免线程数量过多 在多数情况下,创建过多的线程意味着应用程序的架构设计可能存在着缺陷.经常有人会问,一个应用程序中到底含有多少线程才是合理的.现在我们找一台PC机,打开Windows的任务 ...

  6. 无状态会话Bean、有状态会话Bean、CMP与BMP中,哪一种Bean不需要自己书写连接数据库的代码?

    无状态会话Bean.有状态会话Bean.CMP与BMP中,哪一种Bean不需要自己书写连接数据库的代码? A.无状态会话Bean B.有状态会话Bean C.CMP D.BMP 解答:C

  7. mysql查看数据库表数量

    1.查看数据库表数量SELECT count(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='dbname'; selec ...

  8. mysql中数据库database、实例instance、会话session的关系

    1. No suitable driver found for http://127.0.0.1:3306/test jdbc_url错误,jdbc走自己的协议. 正确的路径应该是:jdbc:mysq ...

  9. oracle查询当前会话数量

    SELECT a.inst_id,sid,username,event,sql_id,a.PROGRAM FROM gv$session a WHERE a.STATUS='ACTIVE' AND u ...

随机推荐

  1. MySQL 修改表中的字段,使其自增

    例如,我想使字段 id 自增. 1.查看表定义 mysql> DESC user; +----------+-------------+------+-----+---------+------ ...

  2. 云服务器、euleros系统自动断开连接解决方案

    我这里的云服务器,网上查的修改sshd.config文件并不有效 我提供另一种方法解决这个问题: vim /etc/profile 再最底部新增 export TMOUT=6000 #6000代表60 ...

  3. day54 Pyhton 前端JS06

    内容回顾 - ECMAScript5.0 基础语法 - var 声明变量 - 五种基本数据类型 - string - number NaN number 1 number - boolean - un ...

  4. 《我想进大厂》之Dubbo普普通通9问

    这是面试专题系列第四篇,Dubbo系列.Dubbo本身并不复杂,而且官方文档写的非常清楚详细,面试中dubbo的问题一般不会很多,从分层到工作原理.负载均衡策略.容错机制.SPI机制基本就差不多了,最 ...

  5. elasticsearch-安装-centos7- es7.5 搭建

        centos6 搭建 参考 https://www.cnblogs.com/php-linux/p/8758788.html   搭建linux虚拟机  https://www.cnblogs ...

  6. scrapy 采集数据存入excel

    # -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your pipeline to t ...

  7. Eclipse JSP +Tomcat 环境搭建 错误记录

    环境搭建请参考原文:https://www.cnblogs.com/james-lee/p/5964238.html 错误1:运行时,弹出如下错误:(如果没有此错误,请忽略) 原因是,我们之前点击了T ...

  8. Django ORM Queryset 的缓存机制, 惰性查询简述

    在Django的ORM中 必须注意由于QuerySet的 cache导致的数据获取不正确的问题 在哪些情况下不会出发QuerySet缓存? 隐式存储QuerySet(查询语句没有显示赋值给变量而直接进 ...

  9. Linux 发行版本简介

    1991年的10月5日Linus Benedict Torvalds在comp.os.minix 新闻组上发布消息,正式向外宣布他自行编写的完全自由免费的内核诞生(Freeminix-like ker ...

  10. JS之关于函数

    Javascript的函数也是一个对象 function test() { ... } var test = function(){ ... } 函数内部一旦执行return,则函数执行完毕,如果没有 ...