ORA-12519错误的解决方案

本文探讨了ORA-12519错误的原因及解决方案,此错误表明监听器未能找到适当的会话处理程序。文章分析了数据库连接失败的情况,并提供了调整参数processes的步骤,以确保足够的后台进程支持用户会话。

OERR: ORA-12519 TNS:no appropriate service handler found

客户端连接间歇性失败,报错ORA-12519

Cause: the listener could not find any available service handlers that are 
       appropriate for the client connection.

Action:  检查lsnrctl service ,instance已经注册,状态显示ready时,可以连接。

When the listener believes the current number of connections has reached maximum load, 
it may set the state of the service handler for an instance to "blocked" and begin refusing 
incoming client connections with either of the following errors: ora-12519 or ora-12516

采用服务动态注册的方式,由PMON 通过SERVICE_UPDATE 来得到目前连接情况,但SERVICE_UPDATE 有时间间隔,
所以,listener显示的连接数和当前实际的连接数可能不同。

查询解决方法:

查看一下数据库现有的进程数,是否已经达到参数processes的大小。

   1.select count(*) from v$process;                         取得数据库目前的进程数。
2.select value from v$parameter where name = 'processes'; 取得进程数的上限。
3.如已达到上限,修改initSID.ora中的processes的大小。
4.重新启动数据库到nomount状态下,执行create spfile from pfile; 并startup open。

查询数据库自启动以来最大的并发数量

select * from v$license

=====================================================================================

在压力测试的时候,JDBC连接出现了ORA-12519错误。

 

连接是报错如下:

<2008-8-23 上午01时34分38秒 CST> <Warning> <JDBC> <BEA-001129> <Received exception while creating connection for pool "rac11g1": Listener refused the connection with the following error:

ORA-12519, TNS:no appropriate service handler found

The Connection descriptor used by the client was:

172.0.2.58:1521:rac11g1

检查了半天metalink,最终发现是由于Oracle初始化参数的设置问题导致了bug。

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

session_cached_cursors integer 50

session_max_open_files integer 10

sessions integer 600

shared_server_sessions integer

SQL> SHOW PARAMETER PROCESS

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

aq_tm_processes integer 0

db_writer_processes integer 2

gcs_server_processes integer 2

global_txn_processes integer 1

job_queue_processes integer 1000

log_archive_max_processes integer 4

processes integer 150

根据Oracle文档,SESSIONS和TRANSACTIONS的初始化参数应该源于PROCESSES参数,根据默认设置SESSIONS = PROCESSES * 1.1 + 5。

但是目前SESSIONS的设置达到了600,而PROCESSES的设置没有改变,仍然为150,导致了过多的用户会话连接到Oracle上时,Oracle没有足够的后台进程来支持这些会话。

详细的问题描述可以参考metalink的文档:Doc ID: Note:240710.1。

解决方法很简单,直接设置合适的PROCESSES产生就可以了。

=====================================================================================

修改process的值的方法二(针对LINUX系统):

先到ORACLE_BASE/admin/你的实例名/profile/目录下找到一个init.ora的文件,然后修改里面的process的值,然后将该文件拷贝到ORACLE_HOME/dbs目录下,并将文件重命名为initorcl.ora(其中的orcl为你的数据库实例名,我的数据库实例为orcl所以命名为 initorcl.ora)

用sys用户同时以sysoper身份登录sqlplus

即 sqlplus sys/sa as sysoper;

进入SQLPLUS后,先把数据库关闭,可以使用shutdown abort命令,也可以使用shutdown immediate命令,推荐使用shutdown abort命令。然后使用命令startup force即可,说白了就是重启数据库。

<think>好的,我现在需要帮助用户解决Oracle数据库ORA-12519错误。首先,我需要回忆一下这个错误的常见原因和解决方法。根据之前提供的引用内容,这个错误通常与数据库进程数达到上限有关,比如最大进程数(processes)或会话数(sessions)被超过。用户提到引用[3]中显示错误ORA-00020,指出最大进程数150被超过,所以这可能是一个关键点。 接下来,我应该分步骤思考如何解决这个问题。首先,确认当前数据库的进程和会话使用情况。用户可能需要登录到数据库服务器,使用sysdba账户通过SQL*Plus执行查询,比如查看当前进程数和会话数,以及设置的最大值。例如,查询v$resource_limit视图,或者使用show parameter processes和show parameter sessions命令。 然后,调整数据库参数。如果当前进程数已经达到最大值,就需要增加processes和sessions参数的值。这需要修改spfile或者pfile,然后重启数据库实例。但用户可能遇到生产环境不能立即重启的情况,这时候可能需要寻找临时解决方案,比如释放一些资源或杀掉无效会话。不过,根据引用[3],用户已经尝试用sqlplus连接,但遇到了ORA-00020,说明此时数据库已经无法处理新连接,可能需要通过操作系统级别的强制终止进程,或者等待部分会话释放。 另外,还需要检查监听器的服务处理程序是否足够。有时候,监听器的配置问题也可能导致ORA-12519,比如监听器无法分配更多的服务处理器。这时候可能需要调整监听器的配置,比如增加LISTENER的QUEUESIZE参数,或者检查是否有足够的资源分配给监听器。 此外,用户可能没有正确配置数据库服务,或者监听器没有正确注册服务。需要检查监听器状态(lsnrctl status),确认数据库服务是否已经动态注册。如果动态注册有问题,可能需要手动注册,或者检查数据库的local_listener参数是否正确。 然后,用户可能需要检查数据库的连接泄漏问题,比如应用程序没有正确关闭连接,导致大量空闲会话堆积。这时候需要分析应用的连接管理,或者设置sqlnet.expire_time来终止不活动的连接。 最后,总结解决方案的步骤,并给出相关的注意事项,比如调整参数时的计算方式(sessions通常是1.1*processes +5),以及在生产环境中谨慎操作,避免服务中断。 现在,我需要将这些步骤整理成一个清晰的解决方案,确保用户能够逐步操作。同时,要引用提供的参考资料,特别是引用[3]中提到的进程数超出问题,以及可能的解决方法。还要注意使用中文,结构清晰,分点说明,并生成相关问题。</think>### ORA-12519错误解决方案分步说明 #### 1. **确认当前数据库资源限制** 通过SQL*Plus连接到数据库(需操作系统权限): ```sql -- 查询当前进程和会话使用情况 SELECT * FROM v$resource_limit WHERE resource_name IN ('processes', 'sessions'); -- 查看最大进程数设置 SHOW PARAMETER processes; SHOW PARAMETER sessions; ``` 若`CURRENT_UTILIZATION`接近`LIMIT_VALUE`,则需调整参数[^3]。 #### 2. **调整数据库参数** 修改`processes`和`sessions`参数(需重启数据库): ```sql -- 临时修改(立即生效,但重启失效) ALTER SYSTEM SET processes=300 SCOPE=spfile; ALTER SYSTEM SET sessions=335 SCOPE=spfile; -- 通常sessions = 1.1*processes +5 -- 重启数据库 SHUTDOWN IMMEDIATE; STARTUP; ``` 注:若无法立即重启,需先释放资源(见步骤3)。 #### 3. **释放现有资源** 强制终止无效会话(谨慎操作): ```sql -- 查询非活跃会话 SELECT sid, serial#, username, status FROM v$session WHERE type='USER' AND status='INACTIVE'; -- 终止指定会话 ALTER SYSTEM KILL SESSION 'sid,serial#'; ``` #### 4. **检查监听器配置** 查看监听器状态并调整配置: ```bash # 在操作系统执行 lsnrctl status # 若发现"Service handler not found",尝试重启监听器 lsnrctl stop lsnrctl start ``` 修改`listener.ora`添加队列大小: ```ini LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (QUEUESIZE = 1000) -- 增加队列容量 ) ``` #### 5. **验证动态服务注册** 确保数据库向监听器动态注册: ```sql SHOW PARAMETER service_names; SHOW PARAMETER local_listener; -- 手动注册(若自动注册失败) ALTER SYSTEM REGISTER; ``` #### 6. **预防连接泄漏** - 在`sqlnet.ora`中设置空闲超时: ```ini SQLNET.EXPIRE_TIME = 10 -- 每10分钟检测空闲连接 ``` - 优化应用程序连接池配置,确保及时释放连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值