摘要:《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