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


项目场景:

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

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

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

ORA-00018: maximum number of sessions exceeded
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的值,例如:

SQL> show parameter session;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
java_max_sessionspace_size           integer     0
java_soft_sessionspace_limit         integer     0
license_max_sessions                 integer     0
license_sessions_warning             integer     0
logmnr_max_persistent_sessions       integer     1
session_cached_cursors               integer     20
session_max_open_files               integer     10
sessions                             integer     445
shared_server_sessions               integer     

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

 
SQL> select count(*) from v$session;
 
  COUNT(*)
----------
        43

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

SQL> show parameter processes
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
_high_priority_processes             string      LMS*|VKTM|LGWR
aq_tm_processes                      integer     1
db_writer_processes                  integer     24
gcs_server_processes                 integer     4
global_txn_processes                 integer     1
job_queue_processes                  integer     20
log_archive_max_processes            integer     4
processes                            integer     1000

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

SQL> select count(*) from v$process;
 
  COUNT(*)
----------
       920

5. 详细查询谁在使用

SQL> select b.MACHINE, b.PROGRAM, count(*)
  2    from v$process a, v$session b
  3   where a.ADDR = b.PADDR
  4     and b.USERNAME is not null
  5   group by b.MACHINE, b.PROGRAM
  6   order by count(*) desc;

MACHINE                                                          PROGRAM                                            COUNT(*)
---------------------------------------------------------------- ------------------------------------------------ ----------
noservice00                                                      JDBC Thin Client                                        319
noservice04                                                      JDBC Thin Client                                        312
noservice05                                                      JDBC Thin Client                                         66
s824-1                                                           rman@s824-1 (TNS V1-V3)                                  44
hjzxserver                                                       JDBC Thin Client                                         18
BJ\STAR10000044                                                  plsqldev.exe                                             13
noservice01                                                      JDBC Thin Client                                         12
noservice03                                                      JDBC Thin Client                                         11
dsfpayserver                                                     JDBC Thin Client                                         10
BRMS                                                             JDBC Thin Client                                         10
BJ\STAR10001874                                                  PlSqlDev.exe                                              6
ljbidb                                                           oracle@ljbidb (TNS V1-V3)                                 6
s824-1                                                           oracle@s824-1 (O003)                                      1
s824-1                                                           oraagent.bin@s824-1 (TNS V1-V3)                           1
s824-1                                                           oracle@s824-1 (O002)                                      1
s824-1                                                           oracle@s824-1 (O001)                                      1
 
20 rows selected

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

将Process设置为500
SQL> alter system set processes=500 scope=spfile;
系统已更改。

重新启动数据库使改动生效。


SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

SQL> startup
ORACLE 例程已经启动。


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

你可能感兴趣的:(数据存储,sql,数据库,oracle)