您的位置:首页 > 移动开发

ORA-12519: TNS:no appropriate service handler found 解决

2017-04-18 17:13 405 查看
有时候连得上数据库,有时候又连不上.

可能是数据库上当前的连接数目已经超过了它能够处理的最大值.

select count(*) from v$process --当前的连接数

select value from v$parameter where name = 'processes' --数据库允许的最大连接数

 修改最大连接数:

alter system set processes = 300 scope = spfile;

重启数据库:

shutdown immediate;

 startup;

--查看当前有哪些用户正在使用数据

SELECT osuser, a.username,cpu_time/executions/1000000||'s', sql_fulltext,machine 

from v$session a, v$sqlarea b

where a.sql_address =b.address order by cpu_time/executions desc;

下面摘自别的地方:

windows2003 32位即使修改了连接数也还是报错的处理说法。

都知道,当数据库最大连接数不够时会出现客户端连接间歇性失败,报错ORA-12519。设置大点一般就可以了。但是做大型项目的时候还是会遇到一 些不正常

的问题,比如:设置最大连接数800,但是正常连接200多个就会报错,这也是我在一次面试中得知的。回来因为自己的垃圾机器上没有装 Oracle,就查了些

资料,发现还真的有这个问题,不过不是什么难题,貌似很多人遇到过,看来我们真的做项目太少了吧,顶多同时测试的也就十多个人。

网上搜集到有此类问题的描述,如下。

服务器IBM XSERVER,内存:4G

oracle 数据库配置的主要参数如下:

processes integer 500

sessions integer 585

pga_aggregate_target big integer 350M

sga_max_size big integer 1256M

sga_target big integer 1152M

shared_pool_size big integer 400M

large_pool_size big integer 16M

看样子挺不粗的配置,但是就这样默认情况还是会出现连接数不够的现象。数据库配置的连接数是500个,但是现在当Oracle的连接数达到120个 时候,其他的

客户端就无法再连接上Oracle服务器了,报个错:ORA-12518: TNS: 监听程序无法分发客户机;但是已经连接上数据库的应用还可以正常应用,就是其他没连上的

就再也连不上了,除非已有的连接有退出的,其他的才能再联上,就是 可连接的总数是120个;

有网友说是在可以在listener.ora中加入一行: direct_handoff_ttc_ =off,经测试此方法依旧不行;

这期间我尝试着把pga_aggregate_target 改成200或者500等,结果是一样的。也尝试着把sga_target改成800m后,结果数据库就起不来了,提示说要不能小于

1024m。

后来查到有可能是oracle 10g for win32的一个bug,上网下了补丁,打完补丁后的版本是:10.2.0.3;也曾怀疑是不是windows 2003的tcp连接数不够,上网查

说好像是有这毛病,下了个2003的补丁,把tcp连接数扩到了1000,结果能够达到可以有250个并发连接,但是 再多就又连不上了。

现在就是不太清楚究竟是什么参数配置的不合适(不管是oracle10g的,还是windows 2003的),才会造成实际上没有达到oracle设置的最大连接数时就不能连接

了。

最后,怀疑是不是windows 2003(32位)的问题,于是就装了个64位的windows 2003,同样版本的oracle 10g,装好后就把连接数process参数配置成800,然后

做连接测试,一直可以有800个session连接上来,到现在为止,可以大致总结出症结 所在了,就是windows 2003 server(32位)的操作系统,在安装oracle 

10g(10.2.0.1-10.2.0.3)时有问题,连接数不能达到系统配置的那么大,可以采用64位的替代。找到问题根源了,就可以想到究竟为什么 windows 2003 

server(32位)的操作系统和oracle 10g数据库连接数会有限制,修改一下2003的配置或者oracle 10g的配置, 就可解决掉这个问题。

解决方案:

A.修改Oracle参数

1、原有参数

#pga_aggregate_target=67108864

#processes=500

#sessions=555

# pga_aggregate_target此参数是扩大并发连接数占用内存大小。

# 可调整此参数,放大或缩小,同时影响并发数量。

# 公式: 约=可按照并发数量*4M

pga_aggregate_target=720M

# processes、sessions是扩大并发连接数,是同时使用。

# 公式: sessions = processes *1.1 +5

processes=600

sessions=665

2、在监听参数文件LISTENER.ORA 文件中增加参数

direct_handoff_ttc_listener = off

3、重新启动数据库服务。

B.修改windows配置

1、修改Windows系统中Boot.ini文件

/3GB /PAE

说明:修改操作系统中Boot.ini文件,可以使Oracle使用更多的内存空间。

2、修改用户组策略中锁定内存页大小权限。

参数修改完毕问题解决。

3、重启计算机。

附数据库系统数据查询

1、查询oracle的连接数

select count(*) from v$session;

2、查询oracle的并发连接数

select count(*) from v$session where status='ACTIVE';

3、查看不同用户的连接数

select username,count(username) from v$session where username is not null group by username;

4、查看所有用户:

select * from all_users;

5、查看用户或角色系统权限(直接赋值给用户或角色的系统权限):

select * from dba_sys_privs;

select * from user_sys_privs;

6、查看角色(只能查看登陆用户拥有的角色)所包含的权限

select * from role_sys_privs;

7、查看用户对象权限:

select * from dba_tab_privs;

select * from all_tab_privs;

select * from user_tab_privs;

8、查看所有角色:

select * from dba_roles;

9、查看用户或角色所拥有的角色:

select * from dba_role_privs;

select * from user_role_privs;

10、查看哪些用户有sysdba或sysoper系统权限(查询时需要相应权限)

select * from V$PWFILE_USERS;

 

修改数据库允许的最大连接数:

alter system set processes = 300 scope = spfile;

 

查看游标数量

Select * from v$open_cursor Where user_name=''

 

查询数据库允许的最大连接数:

select value from v$parameter where name = 'processes';

或者:show parameter processes;

 

查询数据库允许的最大游标数:

select value from v$parameter where name = 'open_cursors'

 

查看oracle版本

select banner from sys.v_$version;

按降序显示用户"SYSTEM"为每个会话打开的游标数

select o.sid, osuser, machine, count(*) num_curs  from v$open_cursor o, v$session s  where user_name = 'SYSTEM' and o.sid=s.sid  group by 

o.sid, osuser, machine  order by num_curs desc;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle