由于疫情,過完春節(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'?


在我沒有任何活動(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;

至此修改完畢。