《TNS-12500 Part 2》

摘要:《TNS-12500 Part 2》

最近公司又發生TNS-12500的錯誤訊息,因為每到上班的巔峰時間就會開始出現無法連線的訊息,

直覺研判應該是資源不足導致,但是到底是什麼資源不足?如何解決呢?

調整記憶體配置?參數設定?OS問題?程式開發習慣?還是乾脆走到 Oracle MTS?

因為筆者公司資訊化初期缺乏完整的規劃就急著要快速開發,程式設計師短時間為了達成目標,

都是一人衝峰陷陣,像是一群soho個人工作室各自獨立開發作業。協同開發經驗一直沒有提升,

對資料庫的存取也是隨心所欲,而筆者也是隨著對oracle的了解越來越深之後,

才發現資料庫程式不是只要寫好程式,資料庫的存取、設計是牽涉到整個系統的品質。

在無法明確得知問題所在的情形之下,又有不甚完善的設計模式及資源濫用的情形,

只得發佈資料庫連線數的極限;宣佈這令人難過的消息後,筆者還是試圖想找出除此之外的原因,

總算皇天不負苦心人,原因找到了。

先說明筆者公司的資料庫環境,之前的文章有提到,但為了新來的讀者,還是老話重提一遍吧!

Windows 2000 server + 5GB 記憶體 + boot.ini設定PAE

Oracle 9.2.0.8

SGA 1.7G

pga_aggregate_target 500MB

processes 800

sessions 885

之前也發生過一次類似的情形,筆者甚至還在網路上找了 orastack 的解法。

現在看起來當初的解法不是正解!

筆者對oracle記憶體的使用還是不甚了解,所以一直苦思資源是在那一方面不足?

筆者公司的server給 Oracle 的記憶體配置不過僅 2.2G而已,平時Server還有近2G的記憶體閒置,

怎麼想也不可能是記憶體不足!

google 到一篇關鍵性文章,在講述 pga 的觀念。

在Client Server 架構下,當 session 建立時,oracle會提供 pga 空間使用;

因為筆者公司的Server是windows 2000 server,windows 提供給每一個process 最高記憶體使用量

據說是 1.7G 左右,可能因為 Server有設置 PAE 的關係,筆者估計應該可以使用到 2G多的記憶體,

所以當連線數增加,總 pga 的使用量一直在增加,終於到了 OS 限制的最高記憶體使用量,

TNS-12500 就伴隨出現了。

好了,原因知道了,但是筆者還有話說!以筆者公司的資料庫而言,380 個session用近 600 MB

的pga空間,好像有點合理又不太合理;據觀察新的session連線後,初始配置約 200 KB,

使用最多 pga 的程式雖然有到 10 MB,但是畢竟不是多數;

兼且筆者習慣用 OEM (oracle enterprise manager) 觀察 session 的變化,

沒想到這變成一個盲點所在; OEM 並未顯示被標示為kill的session,而這些session也並未釋放

占用的資源;先前筆者為了查些問題,動用了logminer而且查了許多archivelog的資料,

因為載入過久所以逕行中斷運作中的logminer,沒想到這些從OEM主機發出的session還在占用pga,

而且還占用了近200MB的記憶體。

在重新開啟OEM資料庫後,這些session總算釋出記憶體。

筆者用了以下的 sql 觀察每個session占用的 pga 空間,才得以完整窺視真正的 pga 使用量,

所以不要完整接受OEM提供的資訊,因為那並不完整。

SELECT round(a.value/1024/1024,4) "PGA Size MB",c.*

from v$sesstat a,v$statname b,v$session c

where a.statistic#=b.statistic#

and b.name='session pga memory'

and a.sid=c.sid

order by a.value

提供關鍵性的文章來源:

菩提老祖的博客:Oracle9i中的PGA

http://yaanzy.itpub.net/post/1263/42085