《TNS-12500 - Part 1》

摘要:《TNS-12500 - Part 1》

TNS-12500 是存在listener.log裡的錯誤訊息。

part 1 講述的是我還在當程式設計師時遇到的經驗,

也因此跨入oracle DBA這角色 (職務不變,工作加重 >"<),

沒有這次的經驗應該一輩子不會考慮這條路吧!

約略是2006年左右,當時公司內部資料庫十分不穩,

經常出現 TNS-12500 的錯誤,線上新的session都無法連到資料庫,

每天幾乎都要重開機個一至兩次,當時的DBA經驗也不足,

資料庫以外的工作已經讓他忙翻,無法分身仔細的觀察資料庫的變化。

因為資料庫連線不穩定已經影響線上使用者的情緒及我們的程式,

偏偏 DBA 在這時候離職,事情總要解決,就利用空閒的時間觀察了資料庫的變化,

當然不小心解決 TNS-12500 無法連線的問題,也因緣際會踏入 DBA 的領域。

講了一些枯燥的歷史背景,但是都是筆者人生旅程中最重要的一步。

那就揭曉謎底吧!原因是筆者當時公司 oracle 所有使用者都用同一個 profile,

每個 session 都設定了 idle 時間 45 分鐘,同時有一外包商用 java 寫的程式,

斷線後會不斷重新連線,因為筆者對 java 不熟,不知道是否是 java 還是該

外包商的程式編寫問題,不過當時觀察 v$session 會看出每每在開始出現

TNS-12500 時的總 session 數,會一次比一次少,舉例來說就是第一次出現時,

假設是 500 個 session,過一陣子後 480 個 session 就會無法連線,

再過一陣子 450 個 session,一次比一次少,到最後不得已就只能重開機處理。

google 一陣子之後才知道還有個 v$process,除了 v$session,一併連 v$process

一起列入觀察名單中;這次中頭獎囉!

v$session 的總數雖然一次比一次少,但是 v$process 卻是一次比一次多,

每次資料庫重新開機後, v$session 的總數與 v$process 的總數都差不多,

大約是 1:1 但是重開機前的 v$session 與 v$process 的總數完全不成比例,

猜測該 java 程式在 idle 時間到被斷線後, server process 看起來將 user process

切斷了,但是 process 卻一直仍在連線的狀態;久而久之就超過了參數中設定的

processes 數量,所以嘗試將該外包商帳號的 idle time 設成 unlimit,

出乎意料之外的解決了;一戰成名卻還是十足毛頭小子,不知是幸還是不幸。

-----------------------

既然是 part 1 當然還有 part 2囉! 因為有了第二次 TNS-12500 的經驗,

也就順便將第一次遇到的問題寫出來,也因此覺得日常的觀察及見微知著的重要,

part 2就是要介紹第二種 TNS-12500 的原因囉。