• oracle 大量连接导致数据库不能登录


    系统遇到过几次这种问题,一个系统申请的session数过大,导致数据库进程数满,无法连接的问题。

    pl sql develope 报的错误是:ORA-12170:TNS:链接超时

    oracle用户登录服务器,使用dba身份进入sqlplus:

    sqlplus / as sysdba

    报错信息如下:

    SQL*Plus: Release 11.2.0.1.0 Production on Thu Feb 1 18:34:46 2018

    Copyright (c) 1982, 2009, Oracle. All rights reserved.

    ERROR:
    ORA-00020: maximum number of processes (1000) exceeded

    线程数超过最大值1000了。

    由于oracle 线程数超过最大,所以不能登录了。(当然,sqlplus / nolog 是可以登的,但是不能用)

    1、这个时候,就只有关闭oracle 的监听:  

    lsnrctl stop   # start 启动  status 查看状态

    关闭了监听,就不会有新的用户登录进来,也不会生成新的session,占用process了

    稍等一下,就可以使用sqlplus / as sysdba 登录了(oracle 会保存一些已经关闭的session,这些session会被标记为“kill”状态,2小时候清除,所以关闭监听后,一会就会,process 使用就会掉一点下来)

    2、这个时候,执行SQL:

    select count(1) from v$session;

    查看session使用情况。

    3、执行SQL:

    select machine,count(1)coun from v$session group by machine order by 2 desc

    查看session数最多的机器(也可以换成user/program)

    4、这样,就找到占用session多的机器、用户、程序。然后执行如下SQL:

    select spid, osuser, s.program
         from v$session s,v$process p
         where s.paddr=p.addr and s.machine = 'venn01';

    注意最后一个条件,换为上一步查出来的数据,字段也要改下

    spid即为占用session最多的机器、用户、程序的线程号(同系统进程号)

    5、执行:  

    kill -9 spid

    可杀掉session(见效快),参见我的博客:关于oracle的锁表解决session marked for kill

     6、这个时候,就可以使用pl sql developer登录了,执行SQL

    select 'kill -9 '||spid, osuser, s.program
         from v$session s,v$process p
         where s.paddr=p.addr and s.machine = 'venn01';

    7、可以打印出kill 命令,直接copy 一列,粘贴到服务器上执行,就搞定了。

    科普一下oracle的session和process

    session : 指用户连接的session

    process : 指session执行的线程

    session 可以从 v$session 表查看,process 可以从v$process 表查看

    session和process 表的关系为:

    select s.sid,p.PID,s.*,p.*
         from v$session s,v$process p
         where s.paddr=p.addr

    session表中保存了process的地址。

    select * from v$parameter 
    where name like 'sessions' or name like 'processes'

    v$parameter 表可以查看session和process的配置,建议配置session 略大于process,可以修改(重启生效):

    SQL> alter system set processes=500 scope=spfile;
    SQL> alter system set sessions=555 scope=spfile;

    也可以这样 查看:

    SQL>show parameter processes;    
    SQL>show parameter sessions;    
  • 相关阅读:
    3DMAX贴图无法显示
    3DMAX2016安装教程【图文】
    OSG学习:转动的小汽车示例
    JAVA Eclipse 快捷键
    解决JQUERY在IE8,7,6下将字符串转成XML对象时产生的BUG
    毕设二:python 爬取京东的商品评论
    redis 注册为服务
    python 爬取bilibili 视频弹幕
    python 爬取36kr 7x24h快讯
    jQuery实现表格冻结行和列
  • 原文地址:https://www.cnblogs.com/Springmoon-venn/p/8400509.html
Copyright © 2020-2023  润新知