您好,欢迎访问一九零五行业门户网

TNS-12500,TNS-12540,TNS-12560,TNS-00510解决过程

一环境: 1平台:ibmax360,4g内存windows2kadvserversp3+oracle816独占模式 2内存分配相关参数 ..processes................=.1000 ..shared_pool_size.........=.240000000 ..large_pool_size..........=.614400 ..java_pool_size...........=.32768 ..db_bl
一 环境: 
1 平台: ibm ax360,4g内存 windows 2k advserver sp3 + oracle 816 独占模式
2 内存分配相关参数 
..processes................=.1000 
..shared_pool_size.........=.240000000 
..large_pool_size..........=.614400 
..java_pool_size...........=.32768 
..db_block_buffers.........=.90000 
..db_block_size............=.4096 
..log_buffer...............=.163840 
..log_checkpoint_interval..=.10000 
..sort_area_size...........=.65536 
..sort_area_retained_size..=.65536 
..open_cursors.............=.100 
..job_queue_processes......=.4 
..job_queue_interval.......=.10 
..max_dump_file_size.......=.10240
3 最大并发用户数:850个左右
二 故障现象: 
....当用户数达到一定的数量时(700多)客户端连接时报ora-12560错误,紧跟着报ora-03114错误,不能连接到。此时已连接到服务器的用户能正常访问。 
....首先查看警告日志文件,未见到明显错误信息。 
....查看listner.log文件,发现如下信息(很多个类似的错误记录,摘两个上来) 
......................... 
02-jul-2003 10:30:09 * (connect_data=(sid=orcl)(cid=(program=***.exe)(host=*******)(user=*****))) * (address=(protocol=tcp)(host=*******)(port=1136)) * establish * orcl * 12500 
tns-12500: tns:listener failed to start a dedicated server process 
.tns-12540: tns:internal limit restriction exceeded 
..tns-12560: tnsrotocol adapter error 
...tns-00510: internal limit restriction exceeded 
....32-bit windows error: 8: exec format error 
02-jul-2003 10:30:10 * (connect_data=(sid=orcl)(cid=(program=***.exe)(host=*****)(user=***))) * (address=(protocol=tcp)(host=******)(port=1203)) * establish * orcl * 12500 
tns-12500: tns:listener failed to start a dedicated server process 
.tns-12540: tns:internal limit restriction exceeded 
..tns-12560: tnsrotocol adapter error 
...tns-00510: internal limit restriction exceeded 
....32-bit windows error: 8: exec format error 
..................... 
此时,原来已连接上服务器的用户还能正常使用。查看此时session达到760多个。 
....重启oracle服务后,能连接新的用户数,但当并发用户数达到750个以上时,再次报同样的错误
三 原因分析: 
....系统资源耗竭,意味着系统分配给oracle的内存用尽了。虽然我们有4g的物理内存,但正常情况下系统只能给oracle分配2g的内存,这2g的内存中,包括了sga、pga等oracle需要使用的全部内存。在独占模式下,每一个session将单独分配2m左右的内存。在本例中,sga分配了约600m,按每一个用户分配2m内存计算,连接数达到750个时,总分配内存已达到2g,将不能再增加新的连接数。如果要解决这个问题,在不做大的调整的前提下,要么减小sga大小,要么减小为每一个会话分配的内存大小,以能连接更多的用户。
四 解决过程: 
....查阅了oracle文档,文档里提出来了几个解决的办法:
1 重置init.ora参数文件,调小以下四个参数的值: 
....short_area_size 
....hash_area_size 
....bitmap_merge_area_size 
....create_bitmap_area_seze 
....open_cursone
2 调小sga的大小
3 减小oracle job队列数量(job_queue_processes)和并发队列数(parallel_max_servers)
4 重置并减小会话/线程使用的堆栈大小
5 将oracle改为mts模式
6 更换操作系统为windows nt 企业版
7 使用intel的esma硬件支持,即使用大内存 
..1) 在intel系统上使用 /3g 开关 
..2) 使用pse36内存 
....结合本实例的具体情况,决定调整的主要目标为减小用户的pga大小。 
....构成pga的主要内容有short_area_size, hash_area_size, open_cursone, 以及oracle 堆栈和tns 堆栈。在本实例中,排序区为64k,hash区为128k(缺少值),打开的游标数与应用有关,不能随便减小了,然而oracle堆栈和tns堆栈都是1m,却有较大的减小的余地。因此,调整的目标定为减小这两个堆栈的大小。 
....使用orastack 命令来减小这两个堆栈的大小: 
d:\oracle\ora81\bin>orastack oracle.exe 500000 
couldn’t open file with createfile() 
getlasterror() == 32 
....停止oracle服务和tns服务,再运行以上命令 
d:\oracle\ora81\bin>orastack oracle.exe 500000 
dump of file oracle.exe 
current reserved memory per thread = 1048576 
current committed memory per thread = 4096 
new reserved memory per thread = 500000 
d:\oracle\ora81\bin>orastack tnslsnr.exe 500000 
dump of file tnslsnr.exe 
current reserved memory per thread = 1048576 
current committed memory per thread = 4096 
new reserved memory per thread = 500000 
重新启动oracle服务和tns服务,打开数据库,用户连接到服务器,经测试,用户数到1350以上时数据库仍然运行正常,解决了本实例存在的问题。
五 小结 
....事实上,正如oracle文档所指出的那样,要增加用户连接数的途径很多,除了减小用户堆栈之外,还可以减小sga,或者是更改成mts方式,或者是使用第三方工具增加oracle可用内存。本人前面小结过如何让oracle在32位的windows操作系统上使用超过2g内存的方法( http://www.itpub.net/showthread.php...15&pagenumber=1 ),在本安全应用中,宜将两者(减小用户堆栈与增加oracle可用内存)结合起来使用,以提高数据库性能。但是,这种方式下,同样不可能无限制地增加用户连接数。要想使用户连接数达到更大,则应使用mts方式。
其它类似信息

推荐信息