日期:2014-05-16  浏览次数:20556 次

Oracle强杀进程,解决表锁死等问题

1、找到sid,serial#;

SELECT?/*+?rule?*/?s.username,?l.type,
decode(l.type,'TM','TABLE?LOCK',?
???????????????'TX','ROW?LOCK',?
???????????????NULL)?LOCK_LEVEL,?
o.owner,o.object_name,o.object_type,?
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser,s.status?
FROM?v$session?s,v$lock?l,dba_objects?o?
WHERE?l.sid?=?s.sid?
AND?l.id1?=?o.object_id(+)?
AND?s.username?is?NOT?NULL?order?by?l.type;

2、根据找到的sid,serial#,执行以下语句,清除进程。
alter?system?kill?session?'~sid~,~serial#~';
例如: alter?system?kill?session?'14,4820';

如果死锁不能自动释放,就需要我们手工的kill session。 步骤如下:
?
1. ? ? ? 查看有无死锁对象,如有kill session
?
SELECT ? 'alter system kill session ''' || sid || ',' || serial# || ''';' ?"Deadlock"
??FROM ? v$session
?WHERE ? sid IN (SELECT ? sid
?? ? ? ? ? ? ? ? ? FROM ? v$lock
?? ? ? ? ? ? ? ? ?WHERE ? block = 1);
如果有,会返回类似与如下的信息:
alter system kill session '132,731';
alter system kill session '275,15205';
alter system kill session '308,206';
alter system kill session '407,3510';
?
kill session:
执行alter system kill session '391,48398'(sid为391);
注意:应当注意对于sid在100以下的应当谨慎,可能该进程对应某个application,如对应某个事务,可以kill.
?
?
2. ? ? ? 查看导致死锁的SQL
?
??SELECT ? s.sid, q.sql_text
?? ?FROM ? v$sqltext q, v$session s
?? WHERE ? q.address = s.sql_address AND s.sid = &sid ?-- 这个&sid 是第一步查询出来的
ORDER BY ? piece;
?
返回:
?? ? ? ?SID SQL_TEXT
---------- ----------------------------
?? ? ? 77 UPDATE PROFILE_USER SET ID=1,COMPANY_ID=2,CUSTOMER_ID=3,NAMED ?
?? ? ? 77 _INSURED_ID=4,LOGIN=5,ROLE_ID=6,PASSWORD=7,EMAIL=8,TIME_ZON
?? ? ? 77 E=9 WHERE PROFILE_USER.ID=:34
3 rows selected.
?
?
3. 查看谁锁了谁
SELECT ? ? ?s1.username
?? ? ? ? || '@'
?? ? ? ? || s1.machine
?? ? ? ? || ' ( SID='
?? ? ? ? || s1.sid
?? ? ? ? || ' ) ?is blocking '
?? ? ? ? || s2.username
?? ? ? ? || '@'
?? ? ? ? || s2.machine
?? ? ? ? || ' ( SID='
?? ? ? ? || s2.sid
?? ? ? ? || ' ) '
?? ? ? ? ? ?AS blocking_status
??FROM ? v$lock l1,
?? ? ? ? v$session s1,
?? ? ? ? v$lock l2,
?? ? ? ? v$session s2
?WHERE ? ? ? s1.sid = l1.sid
?? ? ? ? AND s2.sid = l2.sid
?? ? ? ? AND l1.BLOCK = 1
?? ? ? ? AND l2.request > 0
?? ? ? ? AND l1.id1 = l2.id1
?? ? ? ? AND l2.id2 = l2.id2;
?
或者
?
??SELECT ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ? ? ?LPAD (' ', DECODE (l.xidusn, 0, 3, 0))
?? ? ? ? ? || l.oracle_username
?? ? ? ? ? ? ?User_name,
?? ? ? ? ? o.owner,
?? ? ? ? ? o.object_name,
?? ? ? ? ? o.object_type,
?? ? ? ? ? s.sid,
?? ? ? ? ? s.serial#
?? ?FROM ? v$locked_object l, dba_objects o, v$session s
?? WHERE ? l.object_id = o.object_id AND l.session_id = s.sid
ORDER BY ? o.object_id, xidusn DESC
?
?
?
三.锁 和 阻塞
?
3.1 相关概念
?
?? ? ? ? 通常来讲,系统如果平时运行正常,突然会停止不动,多半是被阻塞(Blocked)住了。 我们可以通过v$lock 这张视图,看查看阻塞的信息。
?
SQL> desc v$lock;
?名称 ? ? ? ? ? ? ? ? ? ? ?是否为空? 类型
?----------------------------------------- -------- -----------------
?ADDR ? ? ? ? ? ? ? ? ? ? RAW(4)
?KADDR ? ? ? ?