2009-01-14 12:37 【轉】TNS-12516問題重現及預防處理

ljm0211發表於2012-06-20
作者: Tomac(http://tomac.itpub.net)
發表於: 2008.09.04 10:53
分類: 資料庫
出處: http://tomac.itpub.net/post/8359/470150
---------------------------------------------------------------最近系統出現了TNS-12516問題,錯誤提示TNS:listener could not find available handler with matching protocol stack,
第一反應想到是listener出現了問題,於是把監聽停止,然後重新啟動。再從客戶端登入,錯誤依然。想到可能這個系統 , 沒有被釋放。好再系統為RAC配置,把該節點重新啟動,恢復正常。
總想再認真看一下此錯誤是如何發生的,於是在測試環境進行了測試。

(1)調小process引數
alter system process = 20 scope=spfile;
(2)重新啟動
shutdown immediate;
startup;
(3)從客戶端登入使用者。登入第5個的時候出現了錯誤的提示。
sqlplus tmp/tmp@db1

SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 9月 3 19:27:26 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

ERROR:
ORA-12516: TNS:監聽器找不到符合協定堆疊的可用處理程式


輸入使用者名稱:

(4) 檢視登入情況。此時從主機登入也無法進行,process已經完全被使用。退出一個客戶端,
方可登入。檢視情況如下:

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select count(*) from v$session;

COUNT(*)
----------
18

SQL> select count(*) from v$process;

COUNT(*)
----------
19

SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options

[oracle@T2 log]$ ps -ef | grep LOCAL
oracle 19371 1 0 16:56? 00:00:00 oraclendg(LOCAL=NO)
oracle 19893 1 0 17:01? 00:00:00 oraclendg(LOCAL=NO)
oracle 24865 1 0 17:54? 00:00:00 oraclendg(LOCAL=NO)
oracle 30558 1 1 18:52? 00:00:00 oraclendg(LOCAL=NO)
oracle 30593 18342 0 18:52 pts/0 00:00:00 grep LOCAL
[oracle@T2 log]$ ps -ef | grep ora_
oracle 18915 1 0 16:52? 00:00:00 ora_pmon_ndg
oracle 18917 1 0 16:52? 00:00:00 ora_psp0_ndg
oracle 18919 1 0 16:52? 00:00:00 ora_mman_ndg
oracle 18921 1 0 16:52? 00:00:00 ora_dbw0_ndg
oracle 18923 1 0 16:52? 00:00:00 ora_lgwr_ndg
oracle 18925 1 0 16:52? 00:00:00 ora_ckpt_ndg
oracle 18927 1 0 16:52? 00:00:01 ora_smon_ndg
oracle 18929 1 0 16:52? 00:00:00 ora_reco_ndg
oracle 18931 1 0 16:52? 00:00:00 ora_cjq0_ndg
oracle 18933 1 0 16:52? 00:00:01 ora_mmon_ndg
oracle 18935 1 0 16:52? 00:00:00 ora_mmnl_ndg
oracle 18968 1 0 16:52? 00:00:00 ora_qmnc_ndg
oracle 18978 1 0 16:52? 00:00:00 ora_q000_ndg
oracle 18980 1 0 16:52? 00:00:00 ora_q001_ndg
oracle 30595 18342 0 18:52 pts/0 00:00:00 grep ora_

(5) 結論,TNS-12516的確是process不足引起的。v$process比v$session多1在於PSEUDO程式。

(6) 引申問題:process 為20,而 v$process 中的資料為 19,並且PSEUDO沒有spid, 2個程式被什麼使用了呢?

(7) 雖然系統中process設定的足夠大,但是仍然會出現此問題。一些非正常退出系統的連線,會遺留在系統中佔用
process.可以使用下述sql檢查。

select t2.*
from v$sessioin t1, v$process t2
where t1.paddr(+) = t2.addr
and t1.paddr is null;

END.

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

相關文章