一、Oracle死鎖查看和解決辦法匯總
由于生產的tomcat 經常有假死問題,困擾很久,最后發現有死鎖,解決辦法分享
1.1、查看死鎖
1.1.1、用dba用戶執行以下語句
select username,lockwait,status,machine,program from v$session where sid in
?(select session_id from v$locked_object)
如果有輸出的結果,則說明有死鎖,且能看到死鎖的機器是哪一臺。字段說明:
Username:死鎖語句所用的數據庫用戶;
Lockwait:死鎖的狀態,如果有內容表示被死鎖。
Status: 狀態,active表示被死鎖
Machine: 死鎖語句所在的機器。
Program: 產生死鎖的語句主要來自哪個應用程序
1.1.2、用dba用戶執行以下語句,可以查看到被死鎖的語句。
select sql_text from v$sql where hash_value in
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))
1.2、死鎖的解決方法
1.2.1、查找死鎖的進程:
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;
1.2.2、kill掉這個死鎖的進程:
alter system kill session ‘sid,serial#’; (其中sid=l.session_id)
1.2.3、如果還不能解決:
select pro.spid from v$session ses,
v$process pro
where
ses.sid=XX
and ?ses.paddr=pro.addr;
其中sid用死鎖的sid替換:
--ORACLE 就是查表,需要SYSTEM,SYS(有相應權限的用戶)執行下面的SQL語句就可以了查看鎖代碼
SELECT sn.username,
? ? ? ?m.SID,
? ? ? ?sn.SERIAL#,
? ? ? ?m.TYPE,
? ? ? ?DECODE(m.lmode,
? ? ? ? ? ? ? 0,
? ? ? ? ? ? ? 'None',
? ? ? ? ? ? ? 1,
? ? ? ? ? ? ? 'Null',
? ? ? ? ? ? ? 2,
? ? ? ? ? ? ? 'Row Share',
? ? ? ? ? ? ? 3,
? ? ? ? ? ? ? 'Row Excl.',
? ? ? ? ? ? ? 4,
? ? ? ? ? ? ? 'Share',
? ? ? ? ? ? ? 5,
? ? ? ? ? ? ? 'S/Row Excl.',
? ? ? ? ? ? ? 6,
? ? ? ? ? ? ? 'Exclusive',
? ? ? ? ? ? ? lmode,
? ? ? ? ? ? ? LTRIM(TO_CHAR(lmode, '990'))) lmode,
? ? ? ?DECODE(m.request,
? ? ? ? ? ? ? 0,
? ? ? ? ? ? ? 'None',
? ? ? ? ? ? ? 1,
? ? ? ? ? ? ? 'Null',
? ? ? ? ? ? ? 2,
? ? ? ? ? ? ? 'Row Share',
? ? ? ? ? ? ? 3,
? ? ? ? ? ? ? 'Row Excl.',
? ? ? ? ? ? ? 4,
? ? ? ? ? ? ? 'Share',
? ? ? ? ? ? ? 5,
? ? ? ? ? ? ? 'S/Row Excl.',
? ? ? ? ? ? ? 6,
? ? ? ? ? ? ? 'Exclusive',
? ? ? ? ? ? ? request,
? ? ? ? ? ? ? LTRIM(TO_CHAR(m.request, '990'))) request,
? ? ? ?m.id1,
? ? ? ?m.id2
? FROM v$session sn, v$lock m
?WHERE (sn.SID = m.SID AND m.request != 0) --存在鎖請求,即被阻塞
? ? OR (sn.SID = m.SID --不存在鎖請求,但是鎖定的對象被其他會話請求鎖定
? ? ? ?AND m.request = 0 AND lmode != 4 AND
? ? ? ?(id1, id2) IN (SELECT s.id1, s.id2
? ? ? ? ? ? ? ? ? ? ? ? ?FROM v$lock s
? ? ? ? ? ? ? ? ? ? ? ? WHERE request != 0
? ? ? ? ? ? ? ? ? ? ? ? ? AND s.id1 = m.id1
? ? ? ? ? ? ? ? ? ? ? ? ? AND s.id2 = m.id2))
?ORDER BY id1, id2, m.request;
?1.3、解鎖代碼
alter system kill session 'sid,SERIAL#';
1.4、查看死鎖信息
SELECT ? ?bs.username "Blocking User", bs.username "DB User",
? ? ? ? ? ws.username "Waiting User", bs.SID "SID", ws.SID "WSID",
? ? ? ? ? bs.serial# "Serial#", bs.sql_address "address",
? ? ? ? ? bs.sql_hash_value "Sql hash", bs.program "Blocking App",
? ? ? ? ? ws.program "Waiting App", bs.machine "Blocking Machine",
? ? ? ? ? ws.machine "Waiting Machine", bs.osuser "Blocking OS User",
? ? ? ? ? ws.osuser "Waiting OS User", bs.serial# "Serial#",
? ? ? ? ? ws.serial# "WSerial#",
? ? ? ? ? DECODE (wk.TYPE,
? ? ? ? ? ? ? ? ? 'MR', 'Media Recovery',
? ? ? ? ? ? ? ? ? 'RT', 'Redo Thread',
? ? ? ? ? ? ? ? ? 'UN', 'USER Name',
? ? ? ? ? ? ? ? ? 'TX', 'Transaction',
? ? ? ? ? ? ? ? ? 'TM', 'DML',
? ? ? ? ? ? ? ? ? 'UL', 'PL/SQL USER LOCK',
? ? ? ? ? ? ? ? ? 'DX', 'Distributed Xaction',
? ? ? ? ? ? ? ? ? 'CF', 'Control FILE',
? ? ? ? ? ? ? ? ? 'IS', 'Instance State',
? ? ? ? ? ? ? ? ? 'FS', 'FILE SET',
? ? ? ? ? ? ? ? ? 'IR', 'Instance Recovery',
? ? ? ? ? ? ? ? ? 'ST', 'Disk SPACE Transaction',
? ? ? ? ? ? ? ? ? 'TS', 'Temp Segment',
? ? ? ? ? ? ? ? ? 'IV', 'Library Cache Invalidation',
? ? ? ? ? ? ? ? ? 'LS', 'LOG START OR Switch',
? ? ? ? ? ? ? ? ? 'RW', 'ROW Wait',
? ? ? ? ? ? ? ? ? 'SQ', 'Sequence Number',
? ? ? ? ? ? ? ? ? 'TE', 'Extend TABLE',
? ? ? ? ? ? ? ? ? 'TT', 'Temp TABLE',
? ? ? ? ? ? ? ? ? wk.TYPE
? ? ? ? ? ? ? ? ?) lock_type,
? ? ? ? ? DECODE (hk.lmode,
? ? ? ? ? ? ? ? ? 0, 'None',
? ? ? ? ? ? ? ? ? 1, 'NULL',
? ? ? ? ? ? ? ? ? 2, 'ROW-S (SS)',
? ? ? ? ? ? ? ? ? 3, 'ROW-X (SX)',
? ? ? ? ? ? ? ? ? 4, 'SHARE',
? ? ? ? ? ? ? ? ? 5, 'S/ROW-X (SSX)',
? ? ? ? ? ? ? ? ? 6, 'EXCLUSIVE',
? ? ? ? ? ? ? ? ? TO_CHAR (hk.lmode)
? ? ? ? ? ? ? ? ?) mode_held,
? ? ? ? ? DECODE (wk.request,
? ? ? ? ? ? ? ? ? 0, 'None',
? ? ? ? ? ? ? ? ? 1, 'NULL',
? ? ? ? ? ? ? ? ? 2, 'ROW-S (SS)',
? ? ? ? ? ? ? ? ? 3, 'ROW-X (SX)',
? ? ? ? ? ? ? ? ? 4, 'SHARE',
? ? ? ? ? ? ? ? ? 5, 'S/ROW-X (SSX)',
? ? ? ? ? ? ? ? ? 6, 'EXCLUSIVE',
? ? ? ? ? ? ? ? ? TO_CHAR (wk.request)
? ? ? ? ? ? ? ? ?) mode_requested,
? ? ? ? ? TO_CHAR (hk.id1) lock_id1, TO_CHAR (hk.id2) lock_id2,
? ? ? ? ? DECODE
? ? ? ? ? ? ?(hk.BLOCK,
? ? ? ? ? ? ? 0, 'NOT Blocking', ? ? ? ? ?/**//* Not blocking any other processes */
? ? ? ? ? ? ? 1, 'Blocking', ? ? ? ? ? ? ?/**//* This lock blocks other processes */
? ? ? ? ? ? ? 2, 'Global', ? ? ? ? ? /**//* This lock is global, so we can't tell */
? ? ? ? ? ? ? TO_CHAR (hk.BLOCK)
? ? ? ? ? ? ?) blocking_others
? ? ?FROM v$lock hk, v$session bs, v$lock wk, v$session ws
? ? WHERE hk.BLOCK = 1
? ? ? AND hk.lmode != 0
? ? ? AND hk.lmode != 1
? ? ? AND wk.request != 0
? ? ? AND wk.TYPE(+) = hk.TYPE
? ? ? AND wk.id1(+) = hk.id1
? ? ? AND wk.id2(+) = hk.id2
? ? ? AND hk.SID = bs.SID(+)
? ? ? AND wk.SID = ws.SID(+)
? ? ? AND (bs.username IS NOT NULL)
? ? ? AND (bs.username <> 'SYSTEM')
? ? ? AND (bs.username <> 'SYS')
ORDER BY 1;
二、MySql? 死鎖如何排查? ? ??
2.1、查看正在進行中的事務
SELECT * FROM information_schema.INNODB_TRX
2.2、查看正在鎖的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
2.3、查看等待鎖的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
?
2.4、查詢是否鎖表
SHOW OPEN TABLES where In_use > 0;
2.5、查詢最近死鎖的日志
show engine innodb status
2.6、查看當前正在進行中的進程
show processlist
// 也可以使用
SELECT * FROM information_schema.INNODB_TRX;
2.7、解除死鎖
kill
?
?
?