當前位置:首頁 » 編程語言 » oraclesql死鎖語句
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

oraclesql死鎖語句

發布時間: 2023-03-12 19:22:19

1. 怎樣查詢引起死鎖的sql語句

elect 0 ,blocked
from (select * from sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sysprocesses where blocked>0 ) b
where a.blocked=spid)
union select spid,blocked from sysprocesses where blocked>0
OPEN s_cur
FETCH NEXT FROM s_cur INTO @spid,@bl
WHILE @@FETCH_STATUS = 0
begin
if @spid =0
select ' 引起資料庫死鎖的是: '+ CAST(@bl AS VARCHAR(10)) + ' 進程號, 其執行的SQL 語法如下'
else
select ' 進程號SPID :'+ CAST(@spid AS VARCHAR(10))+ ' 被' + ' 進程號SPID :'+ CAST(@bl AS VARCHAR(10)) +' 阻塞, 其當前進程執行的SQL 語法如下'
DBCC INPUTBUFFER (@bl )

2. 怎麼查看oracle是否有死鎖

-- 死鎖查詢語句
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;
查詢發生死鎖的select語句
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)
)

3. 如何查看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))

4. 如何檢查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用戶執行以下語句,可以查看到被死鎖的語句。 以下是代碼片段:

5. oracle 鎖表時,怎麼查出是哪些SQL語句導致了鎖表

SELECT /*+ rule */ lpad(' ',decode(l.xisn ,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,xisn DESC
執行此SQL即可,結果一看便知,適用於oracle, 其他不解釋~

6. oracle資料庫死鎖怎麼解決

Oracle資料庫出現死鎖的時候可以按照以下處理步驟加以解決:

第一步:嘗試在sqlplus中通過sql命令進行刪除,如果能夠刪除成功,則萬事大吉!但通常情況下,出現死鎖時,想通過命令行或者通過Oracle的管理工具刪除有死鎖的session,oracle只會將該session標記為killed,但無法清除掉,往往需要通過第二步在操作系統層級進行刪除!

.2.0.1.0
Connectedasquik
SQL>selectxisn,object_id,session_id,locked_modefromv$locked_object;--查死鎖的對象,獲取其SESSION_ID
XIDUSNOBJECT_IDSESSION_IDLOCKED_MODE
-----------------------------------------
1030724293
1030649293
SQL>selectusername,sid,serial#fromv$sessionwheresid=29;--根據上步獲取到的sid查看其serial#號
USERNAMESIDSERIAL#
--------------------------------------------------
QUIK2957107
SQL>altersystemkillsession'29,57107';--刪除進程,如已經刪除過,則會報ora-00031的錯誤;否則oracle會將該session標記為killed狀態,等待一段時間看能否會自動消失,如長時間消失不掉,則需要做後續步驟
altersystemkillsession'29,57107'
ORA-00031:sessionmarkedforkill
SQL>selectpro.spidfromv$sessionses,v$processprowhereses.sid=29andses.paddr=pro.addr;--查看spid號,以便在操作系統中根據該進程號刪除進程
SPID
------------
2273286

第二步:進入操作系統進行刪除進程,本示例的操作系統是IBM aix。

login:root--錄入用戶名
root'sPassword:--錄入密碼
*******************************************************************************
**
**
*WelcometoAIXVersion5.3!*
**
**
*PleaseseetheREADMEfilein/usr/lpp/bosforinformationpertinentto*
*.*
**
**
*******************************************************************************
Lastunsuccessfullogin:FriApr2314:42:57BEIDT2010on/dev/pts/1from10.73
.52.254
Lastlogin:FriApr2315:27:50BEIDT2010on/dev/pts/2from10.73.52.254
#ps-ef|grep2273286--查看進程詳情
root22898642494636017:07:15pts/10:00grep2273286
oracle22732861014:38:24-0:21oracleQUIK(LOCAL=NO)
#kill-92273286--刪除進程,小心操作,別寫錯進程號,如果oracle的關鍵進程被刪,資料庫會崩潰的!
#ps-ef|grep2273286--再次查看
root22898642494636017:07:15pts/10:00grep2273286
ForWindows,attheDOSPrompt:orakillsidspid
ForUNIXatthecommandline>kill–9spid