Oracle session串連數和inactive的問題記錄

來源:互聯網
上載者:User

http://timnity.javaeye.com/blog/280383 

從上周起,伺服器Oracle資料庫出現問題,用不到半天,就會報maxsession(150)的問題,肯定是資料庫的會話超過最大數了。
  由於伺服器跑的是檔案傳輸應用,佔用的請求和會話肯定很大,因此使用者數不大就已經讓oracle的會話數達到最大值。
  處理方式不外乎兩種:擴大oracle最大session數以及清除inactive會話,當然還有,就是從資料庫連接池和程式bug上面下手。

從各處收集了一些查看當前會話的語句,記錄一下:

1.select count(*) from v$session;
  select count(*) from v$process;
  查看當前總會話數和進程數,這兩個視圖就是跟會話及進程有關的重要視圖啦,資訊都是從這裡面取的。

2.查詢那些應用的串連數此時是多少
select  b.MACHINE, b.PROGRAM , count(*) from v$process a, v$session b where a.ADDR = b.PADDR and  b.USERNAME is not null   group by  b.MACHINE  , b.PROGRAM order by count(*) desc;

3.查詢是否有死結
select * from v$locked_object;
如果查詢結果為no rows selected,說明資料庫中沒有死結。否則說明資料庫中存在死結。

接下來說明一下會話的狀態:
1.active 處於此狀態的會話,表示正在執行,處於活動狀態。
2.killed 處於此狀態的會話,表示出現了錯誤,正在復原,當然,也是佔用系統資源的。還有一點就是,killed的狀態一般會持續較長時間,而且用windows下的工具pl/sql developer來kill掉,是不管用的,要用命令:alter system kill session 'sid,serial#' ;
3.inactive 處於此狀態的會話表示不是正在執行的,比如select語句已經完成。我一開始以為,只要是inactive狀態的會話,就是該殺,為什麼不釋放呢。其實,inactive對資料庫本身沒有什麼影響,但是如果程式沒有及時commit,那麼就會造成佔用過多會話。解決inactive的方法最好的就是在oracle中直接設定逾時時間,也是有兩種方法,區別暫時還不清楚:

1.修改sqlnet.ora檔案,新增expire_time=x(單位是分鐘)  
我的sqlnet.ora位置在D:\oracle\ora92\network\admin

2.通過ALTER PROFILE DEFAULT LIMIT IDLE_TIME 10; 命令修改,記得重啟下oracle。

 

===============

另外一種解決方案:

select A.SID,B.SPID,A.SERIAL#,a.lockwait,A.USERNAME,A.OSUSER,a.logon_time,a.last_call_et/3600 LAST_HOUR,A.STATUS,
'orakill '||sid||' '||spid HOST_COMMAND,
'alter system kill session '''||A.sid||','||A.SERIAL#||'''' SQL_COMMAND
from v$session A,V$PROCESS B where A.PADDR=B.ADDR AND SID>6

 

================

 

一個自動殺 的job
CREATE OR REPLACE PROCEDURE "KILL_SESSION" AS
        v_sid number;
        v_serial number;
                killer varchar2(1000);
        CURSOR cursor_session_info is select sid,serial# from v$session where type!='BACKGROUND' and status='INACTIVE' and last_call_et>2700 and username='ICWEB' and machine='orc';
BEGIN
        open cursor_session_info;
        loop
                fetch cursor_session_info into v_sid,v_serial;
                exit when cursor_session_info%notfound;
                               
                                killer:='alter system disconnect session '''||v_sid||','||v_serial||''' post_transaction immediate';
                                                                execute immediate killer;
                                        end loop;
                dbms_output.PUT_LINE(cursor_session_info%rowcount||' users with idle_time>2700s have been killed!');
                close cursor_session_info;
END;
/

這樣做其實還是治標不治本,最好能夠解決串連池自動釋放idle進程的問題

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.