TNS Internal limit restriction exceeded
Cause Too many files or sockets open simultaneously (or some other resource has been depleted)
Action For further details trace the operation for protocol details
TNS TNS:listener failed to start a dedicated server process
Cause The process of starting up a dedicated server process failed The executable could not be found or the environment may be set up incorrectly
Action Turn on tracing at the ADMIN level and reexecute the operation Verify that the Oracle Server executable is present and has execute permissions enabled Ensure that the Oracle environment is specified correctly in LISTENERORA The Oracle Protocol Adapter that is being called may not be installed on the local hard drive Check that the correct Protocol Adapter are successfully linked If the error persists contact Oracle Customer Support
TNS TNS:internal limit restriction exceeded
Cause Too many TNS connections open simultaneously
Action Wait for connections to close and retry
TNS TNS:protocol adapter error
Cause A generic protocol adapter error occurred
Action Check addresses used for proper protocol specification Before reporting this error look at the error stack and check for lower level transport errorsFor further details turn on tracing and reexecute the operation Turn off tracing when the operation is complete
问进程的数量会引起监听器错误吗?
TNS: TNS:listener failed to start a dedicated server process
TNS: TNS:internal limit restriction exceeded
TNS: TNS:protocol adapter error
TNS: Internal limit restriction exceeded
IBM/AIX RISC System/ Error: : Resource temporarily unavailable
我们在监听器日志中发现如上的错误信息服务器上每个用户的最大进程数量被设置 Oracle中的最大进程数量为进程最大的利用率是每个会话的最大利用率是会话的数量设置为
根据我所了解的看起来进程的数量是没有问题的我们通过在这个机器上无法正确建立内存分页空间而对此进行了证实然而一些人仍然告诉我们要在起始的时候增加进程的数量我不同意这个观点我遗漏了什么吗?
答TNS错误信息显示了有太多的文件或者socket同时开放了(或者是其他一些资源耗尽了)这是操作系统的限制不是Oracle的限制你需要确认你的AIX平台可以处理你在服务器上开放的这么多的文件这是全部文件并不仅仅是Oracle数据库文件并且你还需要确认你的AIX服务器可以正确处理全部数量的Oracle进程而不仅仅是专用的服务器进程Oracle的起始参数PROCESSES限制了专用的服务器进程数量但是还有后台的进程(SMON PMON LGWR等)以及支持并行语句的进程更不用说你的监听器等了我觉得你应该配置AIX来允许每个Unix用户拥有更多的进程
总结TNSTNSTNSTNS解决过程
一 环境
平台 IBM AXG内存 windows k advServer sp + oracle 独占模式
内存分配相关参数
processes=
shared_pool_size=
large_pool_size=
java_pool_size=
db_block_buffers=
db_block_size=
log_buffer=
log_checkpoint_interval=
sort_area_size=
sort_area_retained_size=
open_cursors=
job_queue_processes=
job_queue_interval=
max_dump_file_size=
最大并发用户数个左右
二 故障现象
当用户数达到一定的数量时(多)客户端连接服务器时报ora错误紧跟着报ora错误不能连接到服务器此时已连接到服务器的用户能正常访问数据库
首先查看警告日志文件未见到明显错误信息
查看listnerlog文件发现如下信息(很多个类似的错误记录摘两个上来)
JUL :: * (CONNECT_DATA=(SID=ORCL)(CID=(PROGRAM=***EXE)(HOST=*******)(USER=*****))) * (ADDRESS=(PROTOCOL=tcp)(HOST=*******)(PORT=)) * establish * ORCL *
TNS: TNS:listener failed to start a dedicated server process
TNS: TNS:internal limit restriction exceeded
TNS: TNSrotocol adapter error
TNS: Internal limit restriction exceeded
bit Windows Error: : Exec format error
JUL :: * (CONNECT_DATA=(SID=ORCL)(CID=(PROGRAM=***EXE)(HOST=*****)(USER=***))) * (ADDRESS=(PROTOCOL=tcp)(HOST=******)(PORT=)) * establish * ORCL *
TNS: TNS:listener failed to start a dedicated server process
TNS: TNS:internal limit restriction exceeded
TNS: TNSrotocol adapter error
TNS: Internal limit restriction exceeded
bit Windows Error: : Exec format error
此时原来已连接上服务器的用户还能正常使用查看此时session达到多个
重启oracle服务后能连接新的用户数但当并发用户数达到个以上时再次报同样的错误
三 原因分析
系统资源耗竭意味着系统分配给oracle的内存用尽了虽然我们有G的物理内存但正常情况下系统只能给oracle分配G的内存这G的内存中包括了SGAPGA等oracle需要使用的全部内存在独占模式下每一个session将单独分配M左右的内存在本例中SGA分配了约M按每一个用户分配M内存计算连接数达到个时总分配内存已达到G将不能再增加新的连接数如果要解决这个问题在不做大的调整的前提下要么减小SGA大小要么减小为每一个会话分配的内存大小以能连接更多的用户
四 解决过程
查阅了oracle文档文档里提出来了几个解决的办法
重置initora参数文件调小以下四个参数的值
short_area_size
hash_area_size
bitmap_merge_area_size
create_bitmap_area_seze
open_cursone
调小SGA的大小
减小oracle Job队列数量(job_queue_processes)和并发队列数(parallel_max_servers)
重置并减小会话/线程使用的堆栈大小
将oracle改为mts模式
更换操作系统为windows NT 企业版
使用intel的ESMA硬件支持即使用大内存
) 在intel系统上使用 /G 开关
) 使用PSE内存
结合本实例的具体情况决定调整的主要目标为减小用户的PGA大小
构成PGA的主要内容有short_area_size hash_area_size open_cursone 以及oracle 堆栈和TNS 堆栈在本实例中排序区为Khash区为K(缺少值)打开的游标数与应用有关不能随便减小了然而oracle堆栈和TNS堆栈都是M却有较大的减小的余地因此调整的目标定为减小这两个堆栈的大小
使用orastack 命令来减小这两个堆栈的大小
D:\oracle\ora\bin>orastack oracleexe
Couldnt open file with CreateFile()
GetLastError() ==
停止oracle服务和TNS服务再运行以上命令
D:\oracle\ora\bin>orastack oracleexe
Dump of file oracleexe
Current Reserved Memory per Thread =
Current Committed Memory per Thread =
New Reserved Memory per Thread =
D:\oracle\ora\bin>orastack tnslsnrexe
Dump of file tnslsnrexe
Current Reserved Memory per Thread =
Current Committed Memory per Thread =
New Reserved Memory per Thread =
重新启动oracle服务和TNS服务打开数据库用户连接到服务器经测试用户数到以上时数据库仍然运行正常解决了本实例存在的问题
五 小结
事实上正如oracle文档所指出的那样要增加用户连接数的途径很多除了减小用户堆栈之外还可以减小SGA或者是更改成MTS方式或者是使用第三方工具增加oracle可用内存本人前面小结过如何让oracle在位的windows操作系统上使用超过G内存的方法( &pagenumber= )在本安全应用中宜将两者(减小用户堆栈与增加oracle可用内存)结合起来使用以提高数据库性能但是这种方式下同样不可能无限制地增加用户连接数要想使用户连接数达到更大则应使用MTS方式