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