v$session中LAST_CALL_ET引數的理解

zhanglei_itput發表於2009-05-06

    在實際的資料庫應用中,我們經常遇到這樣一個問題,連線到Oracle資料庫的使用者在作了一次操作後,再也沒有後續操作,但卻長時間沒有和資料庫斷開連線。最近在研究一箇中介軟體到資料庫中的長連線異常問題,查詢到v$session中LAST_CALL_ET引數,覺得這個引數很有用,下面是自己的一點理解:
   
    1. 引數定義
       
LOGON_TIME 是一個日期型(Date)欄位,為使用者登陸時間;
        LAST_CALL_ET是一個數字型(Number)欄位,其含義是使用者最後一條語句執行完畢後到sysdate的時間,單位為秒。每次使用者執行一個新的語句後,該欄位復位為0,重新開始記數。我們可以透過該欄位來獲得一個連線使用者最後一次運算元據庫後的空閒時間。
        針對這兩個引數定義的測試:
        SQL> conn system/oracle@devdb2;
        已連線。
        SQL> select ses.SID,ses.username,ses.machine,ses.program,ses.last_call_et,sql.hash_value,sql.sql_text
                   from v$session ses, v$sql sql
                   where ses.sql_hash_value = sql.hash_value(+)
                   and ses.PROGRAM = 'sqlplus.exe'
        

SID USERNAME MACHINE PROGRAM LAST_CALL_ET HASH_VALUE SQL_TEXT
132 SYSTEM ZDC\BEILEI sqlplus.exe 3(登陸後的時間)    

        SQL> select count(*) from user_object_size;
SID USERNAME MACHINE PROGRAM LAST_CALL_ET HASH_VALUE SQL_TEXT
132 SYSTEM ZDC\BEILEI sqlplus.exe 24(sql執行的時間) 178228611 select count(*) from user_object_size

        SQL> select count(*) from user_object_size;
                   COUNT(*)
                   ----------
                           20
SID USERNAME MACHINE PROGRAM LAST_CALL_ET HASH_VALUE SQL_TEXT
132 SYSTEM ZDC\BEILEI sqlplus.exe 1(sql執行完,引數復位0,重新開始計算到sysdate的時間/s)    

    2. 識別超過一定空閒時間的連線
         select username,logon_time,last_call_et,
         to_char(sysdate-(last_call_et/(60*60*24)),'hh24:mi:ss') last_work_time
         from v$session
         where username is not null;
         
         select ses.username,ses.machine,ses.program,ses.last_call_et,sql.hash_value,sql.sql_text
         from v$session ses, v$sql sql
         where ses.sql_hash_value = sql.hash_value
         and ses.last_call_et > 600
         and ses.type = 'USER'

          SELECT s.username 使用者名稱稱, s.status 狀態,s.machine 機器名稱,
        osuser 作業系統使用者名稱稱,spid UNIX程式號,
          'kill -9 '||spid UNIX級斷開連線,
          'alter system kill session ' ||''''||s.sid||',
          '||s.serial# || ''';' Oracle級斷開連線,
          TO_CHAR (logon_time, 'dd/mm/yyyy hh24:mi:ss') 登陸時間,
           last_call_et 空閒時間秒,
           TO_CHAR (TRUNC (last_call_et / 3600, 0))||' '||' HRS '||
       TO_CHAR (TRUNC ((last_call_et - TRUNC(last_call_et / 3600, 0) * 3600) / 60, 0)  ) ||' MINS' 空閒時間小時分鐘,
           module 模組
          FROM v$session s, v$process p
          WHERE TYPE = 'USER'
          AND p.addr = s.paddr
         AND status != 'KILLED'
          -- AND SUBSTR (machine, 1, 19) NOT IN ('機器名')
         AND last_call_et > 60 * 60 * 1-- 空閒時間超過1小時的連線
         ORDER BY last_call_et desc;

        select  sid,username,status,
                     to_char(logon_time,'dd-mm-yy hh:mi:ss') "LOGON",
                     floor(last_call_et/3600)||':'||
                     floor(mod(last_call_et,3600)/60)||':'||
                     mod(mod(last_call_et,3600),60) "IDLE",
                    program
         from v_$session
        where type='USER'
         order by last_call_et;

        select s.process, s.sid,  t.sql_text
        from gv$session s, gv$sql t
        where s.sql_address =t.address  
         and s.sql_hash_value =t.hash_value
         --and s.program like '%JDBC%'
         and s.last_call_et > 600
         and s.status = 'ACTIVE'

個人認為還是查清楚這些異常連線的原因,不要輕易的kill掉這些會話。
參考文獻:
                   

Subject: Removing Sessions in Killed Status on Unix
  : 274216.1 Type: BULLETIN
  Modified Date : 11-NOV-2008 Status: PUBLISHED

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

相關文章