oracle8i ora 12500,ORA-12500案例分析

在群里面看到大虾们在讨论,突然一人蹦出来,,询问了12500错误的问题,

风已吹过(95348508) 13:38:53

现在我的Oracle报错ORA-12500

风已吹过(95348508) 13:39:46

查的结果是SGA和PGA方面有问题,我的SGA设置为2G,物理内存为8G,现在就是不知道PGA是不是也要修改?

然后去网上查寻了下有关这个错误的分析,,总结出以下几个案例....本人悉数转载,,,,著名,,,非本人所写,仅仅供同仁们交流学习,

案例1:

上星期天晚上10点,同事打电话到家了,反映数据库的TNS时通时断,严重影响生产。判断应该是内存用完造成用户无发连接造成。可是我在星期天上午才将内存由1.5G增加到4G。无论如何没办法在家解决,只好告诉上夜班的同事每半小时将网卡中断一次,以便让产线可以使用。

星期一上班,打开boot.ini,发现在内存增加后没有加/3G开关。加上/3G参数,重新启动电脑,过了约半小时,产线反应问题复现---Ora-012500错误。看来没有彻底解决。在网上查找异常原因,发现原因是虽然内存有4G,但Oracle能用的只有2G(需要做一些修改才能超越此限制,但时间不允许),而我的SGA用了1.5G,在独占模式下,每一个session将单独分配2M左右的内存,300个Session需要600M,显然,内存已经不够用了。

根据以上分析,解决方法当然有3种,一是修改系统参数,让Oracle能够使用超过2G的内存,这需要在测试环境测过才可在正式环境进行,解决问题优先,这个以后再试。第二是减小为每一个会话分配的内存大小,以能连接更多的用户。三是减小SGA的大小。第二个方法其实很简单,先停止oracle服务和TNS服务,再运行以上命令C:oracleora81bin>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 = 500000C:oracleora81bin>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服务,打开数据库。不过这个也没做过,需要测试。看来降低SGA最简单。打开init.ora文件,将SGA降低到1G,Shutdown Database,再Startup,问题解决。

案例2

一环境:

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:oracleora81bin>orastack oracle.exe 500000

Couldn't open file with CreateFile()

GetLastError() == 32

....停止oracle服务和TNS服务,再运行以上命令

D:oracleora81bin>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:oracleora81bin>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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13994314/viewspace-1005582/,如需转载,请注明出处,否则将追究法律责任。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值