oracle僵死會話鎖住buffer,導致資料庫hang住

datapeng發表於2014-01-07

1、問題描述

    今天早上,現資料庫有點異常,透過hanganalyze分析,使用hanganalyze請參閱《 資料庫hang住,分析處理》,發現2172這個會話產生了enqueue阻塞,,導到程式執行非常緩慢,快到hang住的地步,開啟會話視窗查詢
   
SQL> select a.sid,a.serial#,b.spid,a.status,a.machine,a.program from v$session a,v$process b
  2  where a.paddr = b.addr and a.sid = 2172
 
       SID    SERIAL# SPID         STATUS   MACHINE                             PROGRAM
---------- ---------- ------------ -------- ----------------------------------- -----------
      2172      51610 12649312     ACTIVE mytest.test.com                 JDBC Thin Client

由於這個會話產生了阻塞,首先我想到了直接查殺。

SQL> alter system kill session '2172,51610';
alter system kill session '2172,51610'
*
ERROR at line 1:
ORA-00030: User session ID does not exist.

發現,提示這個會話不存在。

2、問題分析

於是,我嘗試從作業系統上面查詢這個程式

[oracle@mydbtest:/oracle]$kill -9 12649312
kill: 13304684: 0403-003 The specified process does not exist.

從作業系統上,顯示沒有這個程式,所以,初步判斷,會話存在,由於某些意外產生,導致該會話的程式被作業系統清理掉了,但其在oracle的sga仍然佔有資源沒有被pmon\smon清理掉,未能釋放,導致其它程式無法使用,進而產生阻塞。

3、問題解決

從上面的查詢來看,該會話是活動狀態的。

所以看一下這個會話的情況:

SQL> select a.name,b.xacts,c.sid,c.serial#,c.username,d.sql_text
  2  from v$rollname a,v$rollstat b,v$session c,v$sqltext d,v$transaction e
  3  where a.usn = b.usn and b.usn = e.xidusn
  4  and c.taddr = e.addr and c.sql_address = d.address
  5  and c.sql_hash_value = d.hash_value and c.sid = 2172
  6  order by a.name,c.sid,d.piece;

NAME                                XACTS        SID    SERIAL# USERNAME         SQL_TEXT                                           
------------------------------ ---------- ---------- ---------- ---------------- ---------------------------------------------------
_SYSSMU22$                              1       2172      51610 mytest           update mytest_t set doc_subject = b1, doc_create_ti =
 
該會話正在進行修改,但由於某些原因,導致問題產生。由於該會話是佔用sga資源沒有釋放,所以只有清空buffer pool池,來清理掉該會話的資源

SQL> alter session set events 'immediate trace name flush_cache level 1';

Session altered.

再進去檢視,會話已經消失,阻塞已經消失了,業務立刻順暢起來。

oracle10g以後,提供了一種新的重新整理buffer的方法:

SQL> alter system flush BUFFER_CACHE;

System altered.

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

相關文章