• Oralce ORA-00018超出最大会话数处理记录



    项目场景:

    线上系统JBOSS异常报错,信息如下

    1. 018-07-18 10:55:12,851 WARN [org.jboss.resource.connectionmanager.JBossManagedConnectionPool] Throwable while attempting to get a new connection: null
    2. org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (java.sql.SQLException: Listener refused the connection with the following error:
    3. ORA-12516, TNS:listener could not find available handler with matching protocol stack
    4. The Connection descriptor used by the client was:
    5. (description=(address_list= (address=(host=1.1.0.1) (proto

     查看日志发现创建数据库链接的时失败,存在ORA-00018异常

    1. ORA-00018: maximum number of sessions exceeded
    2. ORA-00018: 超出最大会话数


    原因分析:

    Session是什么

            通俗来讲,Sessions是通信双方从开始通信到通信结束期间的一个上下文。这个上下文是一段位于服务器端的内存:记录了本次连接的客户端机器、通过哪个应用程序、哪个用户在登录等信息[在pl/sql developer中,通过Tools-->Sessions可以查看当前数据库的session]。

           Sessions是和connection同时建立的,两者是对同一件事情不同层次的描述。简单讲,connection是物理上的客户机同服务器段的通信链路,Sessions是逻辑上的用户同服务器的通信交互。Sessions被应用于oracle层次而非操作系统层次.在不考虑通过专用服务器或共享服务器进行登录的情况下,这个参数限制了对指定实例的并发登陆数. 

             Oracle中一个用户登录oracle服务器的前提,就是该用户具有oracle的 “create session”权限。oracle允许同一个用户在同一个客户机上建立多个同服务器的连接,这一点从oracle的视图V$session中可以看

    select * from v$session;

           每个Sessions都代表了用户与服务器的一个交互。就像两个国家之间可以同时开展很多谈判,经济的,环境的等等。关闭了有关经济的谈判,不会影响到环境谈判的进行。后台进程PMON会每隔一段时间,就会测试用户连接状况,如果连接已断开,PMON会清理现场,释放相关的资源。

    Process是什么

             Process这个参数限制了能够连接到SGA的操作系统进程数(或者是Windows 系统中的线程数),这个总数必须足够大,从而能够适用于后台进程与所有的专用服务器进程,此外,共享服务器进程与调度进程的数目也被计算在内.此外,共享服务器进程与调度进程的数目也被计算在内.因此,在专用服务器环境中,这是一种限制并发连接数的方法. Oracle 默认 Processes 的值是 150,导致实际的 Sessions 的值会超过设置值

    Session和Process关系

            Oracle的连接数(Sessions)与其参数文件中的进程数(Process)相关,Session和Process的关系为:sessions=(1.1*Process+5),若果资源允许,而当前process 数过小,那么可以适当增大processs 数,session 数依赖于process数,一般不去直接修改session数。


    解决方案:

    当出现ORA-00018: 超出最大会话数的时候一般是访问量超过设置, 只需要将会话数增加就可解决问题, 当然还需要先分析访问量增大是否是合理。 常用到的SQL如下

    1. 从输出的信息可以看到当前数据库中参数sessions的值,例如:

    1. SQL> show parameter session;
    2. NAME TYPE VALUE
    3. ------------------------------------ ----------- ------------------------------
    4. java_max_sessionspace_size integer 0
    5. java_soft_sessionspace_limit integer 0
    6. license_max_sessions integer 0
    7. license_sessions_warning integer 0
    8. logmnr_max_persistent_sessions integer 1
    9. session_cached_cursors integer 20
    10. session_max_open_files integer 10
    11. sessions integer 445
    12. shared_server_sessions integer

     2. 查看当前使用的Session数量,例如

    1. SQL> select count(*) from v$session;
    2. COUNT(*)
    3. ----------
    4. 43

    3. 查询进程信息show parameter processes,processes表示400个

    1. SQL> show parameter processes
    2. NAME TYPE VALUE
    3. ------------------------------------ ----------- ------------------------------
    4. _high_priority_processes string LMS*|VKTM|LGWR
    5. aq_tm_processes integer 1
    6. db_writer_processes integer 24
    7. gcs_server_processes integer 4
    8. global_txn_processes integer 1
    9. job_queue_processes integer 20
    10. log_archive_max_processes integer 4
    11. processes integer 1000

    4.查询当前正在使用的进程数

    1. SQL> select count(*) from v$process;
    2. COUNT(*)
    3. ----------
    4. 920

    5. 详细查询谁在使用

    1. SQL> select b.MACHINE, b.PROGRAM, count(*)
    2. 2 from v$process a, v$session b
    3. 3 where a.ADDR = b.PADDR
    4. 4 and b.USERNAME is not null
    5. 5 group by b.MACHINE, b.PROGRAM
    6. 6 order by count(*) desc;
    7. MACHINE PROGRAM COUNT(*)
    8. ---------------------------------------------------------------- ------------------------------------------------ ----------
    9. noservice00 JDBC Thin Client 319
    10. noservice04 JDBC Thin Client 312
    11. noservice05 JDBC Thin Client 66
    12. s824-1 rman@s824-1 (TNS V1-V3) 44
    13. hjzxserver JDBC Thin Client 18
    14. BJ\STAR10000044 plsqldev.exe 13
    15. noservice01 JDBC Thin Client 12
    16. noservice03 JDBC Thin Client 11
    17. dsfpayserver JDBC Thin Client 10
    18. BRMS JDBC Thin Client 10
    19. BJ\STAR10001874 PlSqlDev.exe 6
    20. ljbidb oracle@ljbidb (TNS V1-V3) 6
    21. s824-1 oracle@s824-1 (O003) 1
    22. s824-1 oraagent.bin@s824-1 (TNS V1-V3) 1
    23. s824-1 oracle@s824-1 (O002) 1
    24. s824-1 oracle@s824-1 (O001) 1
    25. 20 rows selected

    6. 修改Process ,例如设置为500

    1. 将Process设置为500
    2. SQL> alter system set processes=500 scope=spfile;
    3. 系统已更改。
    4. 重新启动数据库使改动生效。
    5. SQL> shutdown immediate;
    6. 数据库已经关闭。
    7. 已经卸载数据库。
    8. ORACLE 例程已经关闭。
    9. SQL> startup
    10. ORACLE 例程已经启动。


    上一篇:Oralce 日期型函数使用

  • 相关阅读:
    R语言ggplot2可视化:使用ggpubr包的ggviolin函数可视化小提琴图、使用ggadd函数在可视化图像中添加均值数据点、标准差线、抖动数据点
    STM32CubeMX环境安装(保姆级)
    在Ubuntu中启用root用户登录SSH
    【C/C++】函数调用小议
    Bentley二次开发教程26-工程属性-ItemType操作实际案例
    基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(一)
    商品秒杀系统整理
    自定义pycharm的debug控件
    【AI视野·今日NLP 自然语言处理论文速览 第三十七期】Wed, 20 Sep 2023
    Android 应用程序文件目录数据清理的时机
  • 原文地址:https://blog.csdn.net/Beijing_L/article/details/127112131