Oracle_连接时ORA-12519错误
Oracle_连接时ORA-12519错误
业务系统试运行期间,后台一直报12519异常,详情参见下图:
报错:OERR: ORA-12519 TNS:no appropriate service handler found
=> 没有找到合适的服务处理程序。有时候连得上数据库,有时候又连不上;可能是数据库上当前的连接数目已经超过了它能够处理的最大值。(
注意:尽管可能并没有多少人使用系统
)
解决:
修改Oracle最大连接数 。
1、检查process和session使用情况
首先检查process和session的使用情况,在sqlplus里面查看。
processes的官方解析:
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. The default values of the SESSIONS and TRANSACTIONS parameters are derived from this parameter. Therefore, if you change the value of PROCESSES, you should evaluate whether to adjust the values of those derived parameters.
processes指定了可以同时连接到oracle的最大操作系统用户数,os层面。它的值应该大于或等于所有的后台进程例如锁、作业、并行处理程序的总数。其中sessions和transactions参数的默认值都是由这个参数所派生出来的。所以,你要改变processes的时候,要考虑一下派生出来的值是否需要调整。
processes和sessions的数量关系:sessions>=(processes值+后台process数量)*1.4~1.5
sessions:
session指定了在系统中可以建立的session的最大数目。因为每个登陆都需要请求一个session,这个参数影响了在系统中的最大并发用户数。然后后面就是建议怎么设置session数的问题了。数量=(可能的连接数+后台进程数)*1.1。
个人的见解:由于session 由 process所建立,所以process相当于session的基础,而处理多少session的能力要看process,即process决定了session,所以当日常用户的并发数为120的时候,此时应当设置相应的process的值为120以确保当并发用户数达到或者超过session上限时,有足够的process可以处理session。
show parameter processes; show parameter session; -- 查看当前进程数(当前的数据库连接数) select count(*) from v$process; -- 查看当前会话数 select count(*) from v$session; -- 查看进程最大值(数据库允许的最大连接数) select value from v$parameter where name = 'processes'; -- 查看会话最大值 select value from v$parameter where name = 'sessions'; -- 并发连接数 Select count(*) from v$session where status='ACTIVE'; -- 最重要的脚本:分别查看进程,会话的历史最大数和最大数: select resource_name,max_utilization,limit_value from v$resource_limit where resource_name in('processes','sessions');
2、以sysdba权限登录:
SQL> show parameter processes; NAME ------------------------------------ TYPE VALUE -------------------------------------------- ------------------------------ aq_tm_processes integer 1 db_writer_processes integer 2 gcs_server_processes integer 0 global_txn_processes integer 1 job_queue_processes NAME ------------------------------------ TYPE VALUE -------------------------------------------- ------------------------------ integer 10 log_archive_max_processes integer 4 processes integer 300 -- 数据库允许的最大连接数(我已修改) SQL> select value from v$parameter where name = 'processes'; VALUE -------------------------------------------------------------------------------- 300 -- 当前的数据库连接数 SQL> select count(*) from v$process; COUNT(*) ---------- 49 SQL>
3、修改最大连接数
SQL> alter system set processes = 300 scope = spfile; alter system set processes = 300 scope = spfile * ERROR at line 1: ORA-32001: write to SPFILE requested but no SPFILE is in use
在执行该命令时出现下列错误;解决:
-- 查看spfile SQL> show parameter spfile; NAME ------------------------------------ TYPE VALUE -------------------------------------------- ------------------------------ spfile string -- 创建spfile SQL> create spfile from pfile; File created. -- 关闭/重启数据库 SQL> shutdown immediate; SQL> startup; -- 查看spfile SQL> show parameter spfile; NAME ------------------------------------ TYPE VALUE -------------------------------------------- ------------------------------ spfile string /u01/app/oracle/product/12.1.0 /dbhome_1/dbs/spfileagile9.ora
再次执行命令: alter system set processes = 300 scope = spfile;
--修改最大连接数:
通常完成以上操作后即可完成最大连接数的修改。注意一定要重启数据库。