ORA-12520:TNS:监听程序无法为请求的服务器类型找到可用的处理程序
oracle这个错误的意思是 数据库的连接数达到最大值限制。
一、关于vsession的基本知识
Oracle数据库中Session和Connection的区别。
在Oracle的官方文档上,对Session和Connection是这样解释的:
Connection: Communicate pathway between a client process and an Oracle database instance.
连接:一个客户端进程和Oracle数据库实例之间的通信链路。
Session: A logical entity in the database instance memory that represnts the state of a current user login to a database. A single connection can have 0, 1 or more sessions established on it.
会话:用于展示当前登录到数据库用户的状态的数据库实例内存中的一个逻辑实体。一个单独的连接可以有0,1,或者更多的会话。
Connection并不是直接建立在用户进程和数据库实例之间的。而是在用户进程和Server Process(服务器进程)之间的,因此有一个Connection就一定会有一个用户进程和一个服务器进程。但不一定会存在Session。比如,如果需要将东西从A运到B,Connection可以看成是一座“桥”,而卡车把东西从A运到B后并返回A,这就是Session。所以,只要不断开连接,随时都可以在这个连接上创建出会话。
二、查看vsession的基本信息
查询资源限制的视图的语法:
select * from v$resource_limit
select * from v$process
select * from v$session
select * from vprocess;
三、释放资源
在sqlnet.ora文件中设置expire_time 参数。
可以使用EXPIRE_TIME参数间歇检查异常session并释放process。
官方说明:SQLNET.EXPIRE_TIME
Recommended Value
10
Example
SQLNET.EXPIRE_TIME=10
这里设置是10分钟,每10分钟Oracle会确认所有session客户端连接是否正常,对于不正常的session,oracle会清理process。
同时,扩大最大连接数,同时Session自动跟着扩大。
--修改最大连接数:
alter system set processes = 500 scope = spfile;
重启数据库:
cmd :sqlplus sys/passw@databasename as sysdba
然后输入以下命令
shutdown immediate;——关闭数据库,大概需要一个小时
startup;--重启数据库,大概几分钟。
重启之后:
select count(*) from vsession ——从104变成38
--查看当前有哪些用户正在使用数据
SELECT osuser, a.username,cpu_time/executions/1000000||'s',b.sql_text,machine
from vsqlarea b
where a.sql_address =b.address order by cpu_time;
——查询数据库有没有死锁,no row selected 说明没有死锁。
select * from v$locked_object