TNS-00510 Internal limit restriction exceeded

wuyuanyong發表於2010-07-22

TNS-00510 Internal limit restriction exceededCause 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-12500 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 re-execute the operation. Verify that the Oracle Server executable is present and has execute permissions enabled. Ensure that the Oracle environment is specified correctly in LISTENER.ORA. 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-12540 TNS:internal limit restriction exceeded
Cause Too many TNS connections open simultaneously.
Action Wait for connections to close and retry.
TNS-12560 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 errors.For further details, turn on tracing and re-execute the operation. Turn off tracing when the operation is complete.
問:程式的數量會引起監聽器錯誤嗎?TNS-12500: TNS:listener failed to start a dedicated server process
TNS-12540: TNS:internal limit restriction exceeded
TNS-12560: TNS:protocol adapter error
TNS-00510: Internal limit restriction exceeded
IBM/AIX RISC System/6000 Error: 11: Resource temporarily unavailable
我們在監聽器日誌中發現如上的錯誤資訊。伺服器上每個使用者的最大程式數量被設定600 Oracle中的最大程式數量為600。程式最大的利用率是482,每個會話的最大利用率是490。會話的數量設定為840
根據我所瞭解的,看起來程式的數量是沒有問題的。我們透過在這個機器上無法正確建立記憶體分頁空間而對此進行了證實,然而,一些人仍然告訴我們要在起始的時候增加程式的數量。我不同意這個觀點。我遺漏了什麼嗎?
答:TNS-510錯誤資訊顯示了有太多的檔案或者socket同時開放了(或者是其他一些資源耗盡了)。這是作業系統的限制,不是Oracle的限制。你需要確認你的AIX平臺可以處理你在伺服器上開放的這麼多的檔案。這是全部檔案,並不僅僅是Oracle資料庫檔案。並且,你還需要確認你的AIX伺服器可以正確處理全部數量的Oracle程式,而不僅僅是專用的伺服器程式。Oracle的起始引數PROCESSES限制了專用的伺服器程式數量。但是還有後臺的程式(SMON, PMON, LGWR等),以及支援並行語句的程式,更不用說你的監聽器等了。我覺得你應該配置AIX來允許每個Unix使用者擁有更多的程式。總結:TNS-12500TNS-12540TNS-12560TNS-00510解決過程
 

環境:1 平臺: IBM AX360,4G記憶體 windows 2k advServer sp3 + oracle 816 獨佔模式
2
記憶體分配相關引數 ..processes................=.1000
..shared_pool_size.........=.240000000
………………………………..
..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的記憶體中,包括了SGAPGAoracle需要使用的全部記憶體。在獨佔模式下,每一個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
使用intelESMA硬體支援,即使用大記憶體
..1)
intel系統上使用 /3G 開關
2)
使用PSE36記憶體
..
結合本例項的具體情況,決定調整的主要目標為減小使用者的PGA大小。
..
構成PGA的主要內容有short_area_size, hash_area_size, open_cursone, 以及oracle 堆疊和TNS 堆疊。在本例項中,排序區為64Khash區為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服務,開啟資料庫,使用者連線到伺服器,經測試,使用者數到1350以上時資料庫仍然執行正常,解決了本例項存在的問題。


小結事實上,正如oracle文件所指出的那樣,要增加使用者連線數的途徑很多,除了減小使用者堆疊之外,還可以減小SGA,或者是更改成MTS方式,或者是使用第三方工具增加oracle可用記憶體。本人前面小結過如何讓oracle32位的windows作業系統上使用超過2G記憶體的方法( http://www.itpub.net/showthread.php...15&pagenumber=1 ),在本安全應用中,宜將兩者(減小使用者堆疊與增加oracle可用記憶體)結合起來使用,以提高資料庫效能。但是,這種方式下,同樣不可能無限制地增加使用者連線數。要想使使用者連線數達到更大,則應使用MTS方式。

上一條:

下一條:

本文出自:

[@more@]

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

相關文章