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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29371470/viewspace-1067786/