在做项目时遇到了连接不上数据库的问题,搜索错误之后发现原因在于进程数已经到达oracle的上限。但是不太明白oracle中的sessions和processes这两个参数的含义,于是摘录了一下网友的总结。
一、引言
经常有朋友会聊到sessions和processes这两个参数,所以很有必要了解一下这两个参数的概念。那什么是sessions和什么是processes呢?
二、Sessions的概念
Sessions参数指定了一个Instance中能够同时存在的sessions数量,或者说,就是能同时登陆到数据库的并发用户数。通常,我们设定这个参数时需要考虑我们可能会有多少个同时连接到数据库的并发用户,并加上后台进程的进程数,最后乘以1.1。
比如说,估计系统中可能会同时有100个用户连接到数据库,那么你的session最少应该为(100+10)*1.1 = 121.
在这里需要提一下的是:Sessions和Processes的关系
Oracle的连接数(sessions)与其参数文件中的进程数(processes)相关,它们的关系如下:
sessions = (1.1*process + 5)
若资源允许,当当前process数过小,那么可以适当增大process数(session数依赖于process数,一般不会直接修改session数)。
当数据库连接的并发用户已经达到这个值时,又有新session连进来,就会报错:
1 [oracle@yft dbs]$ oerr ORA 00018
2 00018, 00000, "maximum number of sessions exceeded"
3 // *Cause: All session state objects are in use.
4 // *Action: Increase the value of the SESSIONS initialization parameter.
Reference的介绍
三、Processes的概念
Processes参数指定了Instance在OS层面所能同时运行的进程数。基于和sessions设定同样的考虑,我们在设定processes时,也应该考虑我们可能会有多少个同时连接到数据库的并发用户,并加上后台进程的进程数。
在MTS(shared server)的配置下,这个值是有所不同的。应该是普通后台进程+最大共享服务器的进程数(max_shared_servers)+最大Dispatcher进程数(max_dispatchers)。
另外,由于在windown平台中,Oracle是以单一一个进程的形式存在的,processes参数变成了限制Oracle进程的线程数。
关于processes应该设置多少的问题,只能根据实际情况来设置,设置成适当值是最好的,既不能设置的太小,又不能设置的太大。
下面两个例子:
当processes设置的比较小的时候,Oracle需要启动新的process而又已经达到processes参数时,就会报错:
----先查看一下当前processes的值----
1 SQL> show parameter processes;
2
3 NAME TYPE VALUE
4 ------------------------------------ ----------- ------------------------------
5 processes integer 150
6
----将processes的值设置的小一点----
7 SQL> alter system set processes=30 scope=spfile;
8
9 System altered.
10
11 SQL> shutdown immediate;
12 Database closed.
13 Database dismounted.
14 ORACLE instance shut down.
15 SQL> startup
16 ORACLE instance started.
17
18 Total System Global Area 330600448 bytes
19 Fixed Size 1336344 bytes
20 Variable Size 247466984 bytes
21 Database Buffers 75497472 bytes
22 Redo Buffers 6299648 bytes
23 Database mounted.
24 Database opened.
25
----当我打开多个session的时候就会启动一些processes,所以当processes超过30后就会有报错----
26 SQL> conn /as sysdba
27 ERROR:
28 ORA-00020: maximum number of processes (30) exceeded
29
30 [oracle@yft bin]$ oerr ORA 00020
31 00020, 00000, "maximum number of processes (%s) exceeded"
32 // *Cause: All process state objects are in use.
33 // *Action: Increase the value of the PROCESSES initialization parameter.
在这个时候的解决办法是增加processes的值,直接使用alter system set processes=xxx scope=spfile,再重启一下。
;
如果processes的值设置过大也是会有报错的:
----在原来30的基础上设置成5000----
1 SQL> alter system set processes=5000 scope=spfile;
2
3 System altered.
4
----重启的时候就会报错-----
5 SQL> startup force
6 ORA-04031: unable to allocate 70672 bytes of shared memory ("shared pool","unknown object","sga heap(1,0)","private strands")
7
8
----其实processes的值也是跟操作系统的内存有关系,在这里就应给processes的值太大,影响到了shared memory----
9
10 [oracle@yft ~]$ oerr ORA 04031
11 04031, 00000, "unable to allocate %s bytes of shared memory (\"%s\",\"%s\",\"%s\",\"%s\")"
12 // *Cause: More shared memory is needed than was allocated in the shared
13 // pool.
14 // *Action: If the shared pool is out of memory, either use the
15 // DBMS_SHARED_POOL package to pin large packages,
16 // reduce your use of shared memory, or increase the amount of
17 // available shared memory by increasing the value of the
18 // initialization parameters SHARED_POOL_RESERVED_SIZE and
19 // SHARED_POOL_SIZE.
20 // If the large pool is out of memory, increase the initialization
21 // parameter LARGE_POOL_SIZE.
解决办法:
通过spfile创建pfile,在pfile中修改一下processes的值,再用pfile创建spfile,最后启动数据库。
;
Reference中对processes的介绍:
--转自