ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 查出引起等待的sql,并kill该引起等待的sql

查出引起等待的sql,并kill该引起等待的sql

原创 Linux操作系统 作者:mengzhaoliang 时间:2009-04-27 18:15:06 0 删除 编辑

/*
*时间:2009-04-27  Monday
*环境:AIX5.3   Oracle10g10.2.0.1.0
*标题:查出引起等待的sql,并kill该引起等待的sql
*/
这是由数据库的触发器没有及时提交导致简单的sql进行漫长的等待。

执行简单的sql语句:
update comm_coding_sort_detail t
set t.coding_name='6厂水平井'
where t.coding_code_id='0300100011000001278'

但一直处于等待状态。


--1查询出哪些session在等待。
select sid,username,blocking_session,blocking_session_status,blocking_instance from v$session where username='DQOMSWAS';

        SID USERNAME BLOCKING_SESSION BLOCKING_SESSION_STATUS BLOCKING_INSTANCE
1 454 DQOMSWAS                  NO HOLDER 
2 455 DQOMSWAS                  NO HOLDER 
3 456 DQOMSWAS                  NO HOLDER 
4 457 DQOMSWAS                  NOT IN WAIT 
5 464 DQOMSWAS                  NO HOLDER 
6 465 DQOMSWAS                  NO HOLDER 
7 472 DQOMSWAS 489                 VALID 1
8 473 DQOMSWAS                  NO HOLDER 
9 474 DQOMSWAS                  NO HOLDER 
 
可以查看出Blocking_session为489 的sql导致了session为472的等待。

--2
select * from dba_waiters;

  WAITING_SESSION HOLDING_SESSION LOCK_TYPE MODE_HELD MODE_REQUESTED LOCK_ID1 LOCK_ID2
 513          472             Transaction    Exclusive Exclusive 458791         28659

session 513等待导致了472的等待

--3
select * from dba_blockers;

HOLDING_SESSION
472

--4
select sid,username,blocking_session,event,wait_time
from v$session where username='DQDT';

    SID USERNAME BLOCKING_SESSION EVENT WAIT_TIME
1 461 DQDT  SQL*Net message from client 0
2 483 DQDT  SQL*Net message from client 0
3 485 DQDT  SQL*Net message from client 0
4 488 DQDT  SQL*Net message from client 0
5 498 DQDT  SQL*Net message from client 0
6 513 DQDT 472 enq: TX - row lock contention 0
7 514 DQDT  SQL*Net message from client 0

可以看出用户DQDT用户的sid 513 一直在等待,导致sid 472不能执行

--5根据sid查出具体的sql
select sql_text from v$session a,v$sqltext_with_newlines b
  where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value)=b.hash_value
  and a.sid=&sid order by piece

  sid 472为:
  update comm_coding_sort_detail t
set t.coding_name='6厂水平井'
where t.coding_code_id='0300100011000001278'

 sid 513为:
update dqomswas.COMM_CODING_SORT_DETAIL set END_IF=:1,CREATOR_ID
=:2,SPARE2=:3,CITE_IF=:4,LOCKED_IF=:5,CODING_SHOW_ID=:6,CREATOR=
:7,CREATE_DATE=:8,SPARE1=:9,CODE_AFFORD_ORG_ID=:10,MODIFI_DATE=:
11,CODING_SORT_ID=:12,CODING_MNEMONIC_ID=:13,CODING_CODE=:14,COD
ING_NAME=:15,NOTE=:16,SUPERIOR_CODE_ID=:17,BSFLAG=:18,EDITION_NA
MEPLATE=:19,CODING_CODE_ID=:20 where CODING_CODE_ID='03001000110
00001278'
这个sid 513语句是由于数据库中的数据传输时执行了一个触发器,但一直没有提交。

--6 查询等待中的sid,serial#
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;

       username sid    serial#  logon_time
1 DQDT 513 5 2009-4-15 6:57:41
2 DQDT 513 5 2009-4-15 6:57:41
3 DQOMSREAD 489 5406 2009-4-27 15:43:11
4 DQOMSWAS 472 39620 2009-4-27 16:06:11

(确定如果删除sid 513的sql语句,不会影响数据库的数据,则可以执行下面的kill操作。)
--7 kill sid 513
alter system kill session '513,5';

刚才的更新sql就可以执行了。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12778571/viewspace-591986/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2008-01-30

  • 博文量
    335
  • 访问量
    2914588