TNS-12500解決過程(zt)

xinxinhg發表於2005-02-22

 摘自:YCXW的博克

[@more@]

原文地址: http://blog.csdn.net/ycxw/archive/2004/12/20/223324.aspx

一 環境:
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可用記憶體)結合起來使用,以提高資料庫效能。但是,這種方式下,同樣不可能無限制地增加使用者連線數。要想使使用者連線數達到更大,則應使用MTS方式。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/166555/viewspace-790600/,如需轉載,請註明出處,否則將追究法律責任。

相關文章