記一次Oracle死鎖/阻塞排查
1. 檢查資料庫確定 是否 真實存在死鎖,若有 哪臺機器哪個程式。
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. 確定死鎖後,還可以檢查是哪個語句產生死鎖等待。
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. 查詢未提交事務的SQL,大概率是其引起。
select s.sid,
s.username,
s.osuser,
s.program,
to_char(s.LOGON_TIME, 'yyyymmdd hh24:mi:ss') as LOGON_TIME,
to_char(t.START_DATE, 'yyyymmdd hh24:mi:ss') as START_DATE,
s.status,
(select q.SQL_TEXT from v$sql q where q.LAST_ACTIVE_TIME = t.START_DATE
and rownum <= 1) as SQL_TEXT
from v$session s,
v$transaction t
where s.sADDR = t.SES_ADDR;
4. 若找不到對應的User,則可以通過kill掉死鎖的session程式
SELECT l.SESSION_ID, l.OS_USER_NAME, s.USERNAME, l.OBJECT_ID, l.ORACLE_USERNAME
FROM v$locked_object l,
v$session s
WHERE l.SESSION_ID = s.SID;
5. 根據SessionID查詢鎖表語句
select sql_text
from v$sql
where hash_value in
(select sql_hash_value from v$session where sid in (208));
6. 檢視死鎖
select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode, SESS.machine
from v$locked_object lo,
dba_objects ao,
v$session sess
where ao.object_id = lo.object_id
and lo.session_id = sess.sid;
alter system kill session '208,207';
對v$locked_object被鎖物件進行查詢:
SELECT l.session_id sid,
s.serial#,
l.locked_mode,
l.oracle_username,
l.os_user_name,
s.machine,
s.terminal,
o.object_name,
s.logon_time
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id AND l.session_id = s.sid
ORDER BY sid, s.serial#;
分析上圖結果:
第1個Session的id為139對LN_DUE進行了鎖表操作,第2個session的id為141對LN_DUE進行了鎖表操作,於是死鎖產生了。一般為程式碼中使用了兩個Connection,前一個Connection執行完update語句未提交,導致行級鎖未釋放,第2個Connection又去對同一個表進行update,於是只能等待前一個connection釋放行級鎖。
相關文章
- 記一次神奇的Mysql死鎖排查MySql
- MySQL死鎖系列-線上死鎖問題排查思路MySql
- 記一次線上mysql死鎖MySql
- 記一次排查線上MySQL死鎖過程,不能只會curd,還要知道加鎖原理MySql
- 線上問題排查:記一次 Redis Cluster Pipeline 導致的死鎖問題Redis
- 面試官:什麼是死鎖?怎麼排查死鎖?怎麼避免死鎖?面試
- SpringBoot Seata 死鎖問題排查Spring Boot
- [翻譯]:SQL死鎖-阻塞探測SQL
- JAVA死鎖排查-效能測試問題排查思路Java
- 檢視oracle死鎖程式並結束死鎖Oracle
- 記一次 MySQL select for update 死鎖問題MySql
- 併發程式設計之臨界區\阻塞\非阻塞\死鎖\飢餓\活鎖程式設計
- 一次線上死迴圈的排查
- golang 執行時死鎖排查和檢測Golang
- 一次死鎖導致CPU異常飄高的整個故障排查過程
- 一次詭異的線上資料庫的死鎖問題排查過程資料庫
- 資料庫死鎖排查思路分享(糾正篇)資料庫
- 線上併發事務死鎖問題排查
- 記一次 .NET 某裝置監控系統 死鎖分析
- Oracle死鎖一例(ORA-00060),鎖表導致的業務死鎖問題Oracle
- 記一次鎖使用不當導致Dubbo執行緒阻塞問題執行緒
- 死鎖問題排查過程-間隙鎖的復現以及解決
- 解決Oracle死鎖問題步驟Oracle
- 【Oracle】死鎖的產生與處理Oracle
- 死磕阻塞佇列佇列
- 一次 MySQL 線上死鎖分析實戰MySql
- 記錄一次問題排查
- 記一次oom問題排查OOM
- 記錄一次木馬排查
- 記一次axios原始碼排查iOS原始碼
- 記一次公司倉庫資料庫伺服器死鎖過程資料庫伺服器
- Oracle 阻塞Oracle
- Redis阻塞問題排查方向Redis
- 記一次 .NET 某電商無貨源後端服務 死鎖分析後端
- 死鎖
- 記一次 Laravel MethodNotAllowedHttpException 問題排查LaravelHTTPException
- 【網易雲商】記一次實遇的 MySQL--index merge 死鎖歷程MySqlIndex
- 故障解析丨一次死鎖問題的解決