oracle死鎖sql語句
1. Oracle 10g的死鎖解決辦法
大家通常會遇到這種現象,在自己web項目首頁使用用戶名,密碼登陸系統時,始終停留在本頁面,無法進入系統,或是在執行某些操作後,系統一直處在等待狀態,不出結果,後台也無任何錯誤提醒。此時,很大的可能就是資料庫鎖等待,所要查詢的包含用戶名和密碼的表或是用戶正操作的表正在被佔用造成的。鎖等待的現象:程序在執行的過程中,點擊確定或保存按鈕,程序沒有響應,也沒有出現報錯。網上有很多人把這種現象稱為死鎖,是不合理的。此時的oracle並未發生任何死鎖現象,只是它一直在等待使用者前一個操作的提交。產生鎖等待的原因:當對於資料庫某個表的某一列做更新或刪除等操作,執行完畢後該條語句不提交,另一條對於這一列數據做更新操作的語句在執行的時候就會處於等待狀態,此時的現象是這條語句一直在執行,但一直沒有執行成功,也沒有報錯。鎖等待定位方法:sql代碼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))Sql代碼SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESSFROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;以上兩種方法皆可以,不過查詢出來的屬性不同,可以根據個人需要選擇。其中有一種方法速度較快,但我忘記是哪一種了,您若遇到資料庫出現和鎖等待相符的現象,可以用這兩種方法查詢試一下,若得到結果,則說明確實發生鎖等待現象了。單個解決鎖等待的方法:Sql代碼alter system kill session 'sid, serial#'其中的sid和serial可以通過上面鎖等待定位方法的第二個方法得到,sid對應SESSION_ID,serial#對應SERIAL#。例如:Sql代碼alter system kill session '130,2';我通常會遇到上千個鎖,實在沒辦法一個一個的kill掉了,所以我通常使用下述批量解鎖方法。批量解鎖方法:註:此方法應在plsql中運行Sql代碼declare cursor mycur isselect b.sid,b.serial#from v$locked_object a,v$session bwhere a.session_id = b.sid group by b.sid,b.serial#;beginfor cur in mycur loopexecute immediate ( 'alter system kill session '''||cur.sid || ','|| cur.SERIAL# ||''' ');end loop;end;
2. 如何檢查oracle死鎖
oracle死鎖問題一直困擾著我們,下面就教您一個oracle死鎖的檢查方法,如果您之前遇到過oracle死鎖方面的問題,不妨一看。 一、資料庫死鎖的現象 程序在執行的過程中,點擊確定或保存按鈕,程序沒有響應,也沒有出現報錯。 二、oracle死鎖的原理 當對於資料庫某個表的某一列做更新或刪除等操作,執行完畢後該條語句不提交,另一條對於這一列數據做更新操作的語句在執行的時候就會處於等待狀態,此時的現象是這條語句一直在執行,但一直沒有執行成功,也沒有報錯。 三、oracle死鎖的定位方法 通過檢查資料庫表,能夠檢查出是哪一條語句被死鎖,產生死鎖的機器是哪一台。 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: 產生死鎖的語句主要來自哪個應用程序。 2)用dba用戶執行以下語句,可以查看到被死鎖的語句。 以下是代碼片段:
3. oracle 如何查看有沒有死鎖
--死鎖查詢語句
SELECTbs.username"BlockingUser",bs.username"DBUser",
ws.username"WaitingUser",bs.SID"SID",ws.SID"WSID",
bs.serial#"Serial#",bs.sql_address"address",
bs.sql_hash_value"Sqlhash",bs.program"BlockingApp",
ws.program"WaitingApp",bs.machine"BlockingMachine",
ws.machine"WaitingMachine",bs.osuser"BlockingOSUser",
ws.osuser"WaitingOSUser",bs.serial#"Serial#",
ws.serial#"WSerial#",
DECODE(wk.TYPE,
'MR','MediaRecovery',
'RT','RedoThread',
'UN','USERName',
'TX','Transaction',
'TM','DML',
'UL','PL/SQLUSERLOCK',
'DX','DistributedXaction',
'CF','ControlFILE',
'IS','InstanceState',
'FS','FILESET',
'IR','InstanceRecovery',
'ST','DiskSPACETransaction',
'TS','TempSegment',
'IV','LibraryCacheInvalidation',
'LS','LOGSTARTORSwitch',
'RW','ROWWait',
'SQ','SequenceNumber',
'TE','ExtendTABLE',
'TT','TempTABLE',
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,'NOTBlocking',/**//*Notblockinganyotherprocesses*/
1,'Blocking',/**//*Thislockblocksotherprocesses*/
2,'Global',/**//*Thislockisglobal,sowecan'ttell*/
TO_CHAR(hk.BLOCK)
)blocking_others
FROMv$lockhk,v$sessionbs,v$lockwk,v$sessionws
WHEREhk.BLOCK=1
ANDhk.lmode!=0
ANDhk.lmode!=1
ANDwk.request!=0
ANDwk.TYPE(+)=hk.TYPE
ANDwk.id1(+)=hk.id1
ANDwk.id2(+)=hk.id2
ANDhk.SID=bs.SID(+)
ANDwk.SID=ws.SID(+)
AND(bs.usernameISNOTNULL)
AND(bs.username<>'SYSTEM')
AND(bs.username<>'SYS')
ORDERBY1;
查詢發生死鎖的select語句
selectsql_textfromv$sqlwherehash_valuein(
selectsql_hash_valuefromv$sessionwheresidin(selectsession_idfromv$locked_object)
)
4. 如何殺死oracle死鎖進程
oracle死鎖時殺進程的方法:
第一步:嘗試在sqlplus中通過sql命令進行刪除,如果能夠刪除成功,則萬事大吉。但通常情況下,出現死鎖時,想通過命令行或者通過oracle的管理工具刪除有死鎖的session,oracle只會將該session標記為killed,但無法清除掉,往往需要通過第二步在操作系統層級進行刪除。
第二步:
1、select xisn, object_id, session_id, locked_mode from v$locked_object; --查死鎖的對象,獲取其SESSION_ID。
2、select username,sid,serial# from v$session where sid=29; --根據上步獲取到的sid查看其serial#號。
3、alter system kill session '29,57107'; --刪除進程,如已經刪除過,則會報ora-00031的錯誤;否則oracle會將該session標記為killed狀態,等待一段時間看能否會自動消失,如長時間消失不掉,則需要做後續步驟。
一些ORACLE中的進程被殺掉後,狀態被置為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟資料庫。現在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。
5. oracle 鎖表時,怎麼查出是哪些SQL語句導致了鎖表
SELECT S.SID SESSION_ID, S.USERNAME, DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(REQUEST)) MODE_REQUESTED, O.OWNER||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')', S.TYPE LOCK_TYPE, L.ID1 LOCK_ID1, L.ID2 LOCK_ID2
FROM V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION S
WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID;
執行上記SQL語句,可以查尋到資料庫中的鎖的情報.
SESSION_ID, USERNAME, MODE_HELD, MODE_REQUESTED, OBJECT_NAME, LOCK_TYPE, LOCK_ID
分別是 擁有鎖的SESSION_ID,擁有鎖的USERNAME,鎖的執行模式MODE_HELD,鎖的請求MODE_REQUESTED,鎖所在的資料庫對象名
,鎖的類型,鎖的ID
還有你問的應該是資料庫中表出現死鎖情況吧,是哪些sql過程導致了表死鎖:
解決方案如下:
1.查哪個過程被鎖:
查V$DB_OBJECT_CACHE視圖:
SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='過程的所屬用戶' AND CLOCKS!='0';
2. 查是哪一個SID,通過SID可知道是哪個SESSION:
查V$ACCESS視圖:
SELECT * FROM V$ACCESS WHERE OWNER='過程的所屬用戶' AND NAME='剛才查到的過程名';
3. 查出SID和SERIAL#:
查V$SESSION視圖:
SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='剛才查到的SID';
查V$PROCESS視圖:
SELECT SPID FROM V$PROCESS WHERE ADDR='剛才查到的PADDR';
4. 殺進程:
(1)先殺ORACLE進程:
ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';
(2)再殺操作系統進程: (linux)
KILL -9 剛才查出的SPID或ORAKILL 剛才查出的SID 剛才查出的SPID。
6. 如何查看oracle 中某條sql阻塞了某個sql
死鎖的定位方法
通過檢查資料庫表,能夠檢查出是哪一條語句被死鎖,產生死鎖的機器是哪一台。
1)用dba用戶執行以下語句
selectusername,lockwait,status,machine,programfromv$sessionwheresidin
(selectsession_idfromv$locked_object)
如果有輸出的結果,則說明有死鎖,且能看到死鎖的機器是哪一台。欄位說明:
Username:死鎖語句所用的資料庫用戶;
Lockwait:死鎖的狀態,如果有內容表示被死鎖。
Status: 狀態,active表示被死鎖
Machine: 死鎖語句所在的機器。
Program: 產生死鎖的語句主要來自哪個應用程序。
2)用dba用戶執行以下語句,可以查看到被死鎖的語句。
selectsql_textfromv$sqlwherehash_valuein
(selectsql_hash_valuefromv$sessionwheresidin
(selectsession_idfromv$locked_object))
7. 如何查詢oracle的死鎖
下面查詢可以查到死鎖,但是注意其實查詢到的不是真正的死鎖,查詢到的只是是死鎖發生前的等待條件,真正的死鎖在10G中會被系統所阻止掉
select t2.username||' '||t2.sid||' '||t2.serial#||' '||t2.logon_time||' '||t3.sql_text
from v$locked_object t1,v$session t2,v$sqltext t3
where t1.session_id=t2.sid
and t2.sql_address=t3.address
order by t2.logon_time ;
此外,從V$LOCK的BLOCK欄位可以看到,BLOCK>0表示有等待發生了,注意是行級等待,而在表級沒有死鎖或等待
select * from v$lock where block>0 ;