Oracle Session達(dá)到最大連接數(shù),無法提供服務(wù)問題的解決

由于疫情,過完春節(jié)回來,遠(yuǎn)程辦公,連接公司oracle數(shù)據(jù)庫做開發(fā)。做了一段時(shí)間,發(fā)現(xiàn)后臺(tái)服務(wù)無法訪問數(shù)據(jù)庫,用navicat連接,也是提示無法連接,所以登錄服務(wù)器,查看情況;

su -oracle?

sqlplus?

看到提示達(dá)到了最大連接數(shù):

ORA-00018:maximum number of sessions exceeded

索性關(guān)閉數(shù)據(jù)庫重啟

shutdown immediately;

startup;

問題短暫解決

過了大約一個(gè)小時(shí)以后,這個(gè)問題又出現(xiàn)了,應(yīng)該是有oracle client一直在獲取連接,致使oracle實(shí)例達(dá)到了最大連接數(shù)。

經(jīng)過搜索,找到了原因,記錄一下過程:

sqlplus執(zhí)行如下語句:

select machine,STATUS from v$session ORDER BY STATUS;

結(jié)果:


可以看到,cluster1是我的服務(wù)器,這個(gè)連接是ACTIVE,是正常的,WorkGroup\P27JJZ這個(gè)machine是我不知道的一個(gè)機(jī)器,連接狀態(tài)也基本都是INACTIVE的,查看一下它的連接數(shù):

select count (machine) from v$session where machine='WorkGroup\P27JJZDLSK21AR0'?

連接數(shù)102
連接數(shù)105

在我沒有任何活動(dòng)的情況下,一會(huì)功夫這臺(tái)機(jī)器又建立了三個(gè)連接,所以終于水落石出了,就是這臺(tái)不知道哪來的機(jī)器一直在連接數(shù)據(jù)庫,而且連接一會(huì)狀態(tài)就會(huì)INACTIVE了。

所以接下來就是兩種方案:

方案一、和同事問一下,這臺(tái)機(jī)器是誰的,在干嘛

在v$session中能得到這臺(tái)機(jī)器的機(jī)器名稱和登錄的用戶名,在公司群問了一下,沒人知道這臺(tái)機(jī)器是誰的,看來必須找到這臺(tái)機(jī)器的ip地址

在 v$session 中不能直接獲得客戶端 IP(亂碼),網(wǎng)上說在數(shù)據(jù)庫中創(chuàng)建一個(gè)追蹤客戶端IP地址的觸發(fā)器:

create or replace trigger on_logon_trigger after logon on database

begin

??? dbms_application_info.set_client_info(sys_context('userenv', 'ip_address'));

end;

/

這樣試了也沒找到ip地址,又通過v$session中的USERNAME字段,知道了oracle登錄的用戶,就再問了同事,找到了是哪臺(tái)機(jī)器,原來是超圖的IServer發(fā)布的oracle型數(shù)據(jù)庫數(shù)據(jù)源,iserver會(huì)定期連接oracle數(shù)據(jù)庫,但是卻沒有釋放無用的連接,所以致使數(shù)據(jù)庫連接數(shù)達(dá)到最大值,所以尋求第二方案。

方案二、實(shí)現(xiàn)ORACLE定時(shí)清理不活動(dòng)的Session

因?yàn)楹苌偻ㄟ^IServer去查oracle數(shù)據(jù)庫,所以對(duì)于IServer建立的session,可以短期就清理掉。

登錄?

sqlplus /nolog

conn sys as sysdba

SQL> show parameter resource;

說明資源限制已經(jīng)打開;

創(chuàng)建一個(gè)允許3分鐘IDLE時(shí)間的PROFILE:

  SQL> CREATE PROFILE KILLIDLE LIMIT IDLE_TIME 3;

查看新創(chuàng)建PROFILE的內(nèi)容:

  SQL> col limit for a10

  SQL> select * from dba_profiles where profile='KILLIDLE';

  查看給IServer登錄使用的用戶的PROFILE:

  SQL> select username,profile from dba_users where username='CHINA_MAP';

顯示為DEFAULT

 修改CHINA_MAP用戶的PROFILE使用新建的PROFILE:

  SQL> alter user eygle profile killidle;


修改PROFILE

至此修改完畢。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容