快捷搜索:

oracle开发 TNS-12500的解决过程

一 情况:

1 平台: HP,2G内存 windows 2k advServer sp3 + oracle 817 独有模式

2 内存分配相关参数

..processes................=.350

..shared_pool_size.........=.314572800

..large_pool_size..........=.614400

..java_pool_size...........=.0

..db_block_buffers.........=.67372

..db_block_size............=.16384

..log_buffer...............=.163840

..log_checkpoint_interval..=.10000

..sort_area_size...........=.52428800

..sort_area_retained_size..=.52428800

..open_cursors.............=.300

..job_queue_processes......=.4

..job_queue_interval.......=.10

..max_dump_file_size.......=.10240

3 最大年夜并发用户数:100个阁下

二 故障征象:

....当用户数达到必然的数量时(30多)客户端连接办事器时报TNS-12500差错,此时已连接到办事器的用户能正常造访数据库。

....首先查看警告日志文件,未见到显着差错信息。

....查看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达到50多个。

....重启oracle办事后,能连接新的用户数,但当并发用户数达到15个以上时,再次报同样的差错

三 缘故原由阐发:

....系统资本耗竭,意味着系统分配给oracle的内存用尽了。虽然我们有2G的物理内存,但正常环境下系统只能给oracle分配1.3G的内存,这1.3G的内存中,包括了SGA、PGA等oracle必要应用的整个内存。在独有模式下,每一个用户将零丁分配50M(Sort_area_size)阁下的内存。在本例中,UGA分配了约2G,按每一个用户分配50M内存谋略,连接数达到15个时,总分配内存已达到2G,将不能再增添新的连接数。假如要办理这个问题,在不做大年夜的调剂的条件下,要么减小SGA大年夜小,要么减小为每一个会话分配的内存大年夜小,以能连接更多的用户。

四 办理历程:

....查阅了oracle文档,文档里提出来了几个办理的法子:

1 重置init.ora参数文件,调小以下四个参数的值:

....sort_area_size

....hash_area_size

....bitmap_merge_area_size

....create_bitmap_area_seze

....open_cursone

2 减小oracle Job行列步队数量(job_queue_processes)和并发行列步队数(parallel_max_servers)

3 重置并减小会话/线程应用的客栈大年夜小

4 将oracle改为mts模式

....结合本实例的详细环境,抉择调剂的主要目标为减小用户的PGA大年夜小。

....构成PGA的主要内容有sort_area_size, hash_area_size, open_cursor, 以及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办事,打开数据库,用户连接到办事器,经测试,用户数到50以上时数据库仍旧运行正常,办理了本实例存在的问题。

五 小结

....事实上,正如oracle文档所指出的那样,要增添用户连接数的道路很多,除了减小用户客栈之外,还可以减小SGA,或者是变动成MTS要领,或者是应用第三方对象增添oracle可用内存。在本安然利用中,宜将两者(减小用户客栈与增添oracle可用内存)结合起来应用,以前进数据库机能。然则,这种要领下,同样弗成能无限定地增添用户连接数。要想应用户连接数达到更大年夜,则应应用MTS要领。

您可能还会对下面的文章感兴趣: