Oracle中診斷阻塞session的方法 blocking error
由於鎖的機制,當某一條DML或者DDL SQL語句執行被阻塞的時候,需要找出是什麼原因導致這條SQL被阻塞了,下面介紹一下通常的診斷方法:
假設有這樣一個表: table t(id int primary key,val int);資料為:
id val
1 1
2 2
1,在一個Session,這裡把它叫做Session A,做了如下的update語句,沒有提交或者回滾.
SQL> update t set val = 3 where id=1;
2,在一另一個Session,這裡把它叫做Session B,做了如下的update語句,Session B會被阻塞.
SQL> update t set val = 4 where id=1;
但有活動事務對物件加鎖的時候,會在v$locked_object檢視中有記錄如object_id,session_id等,通常被阻塞的session的XIDUSN,XIDSLOT,XIDSQN欄位都為空.下圖中session_id為139的是被阻塞的session.
select * from v$locked_object;
![Oracle中診斷阻塞session的方法 blocking error](https://i.iter01.com/images/10b74cf050684c75c66664d273fcb766a8c8c9f61ed8e69d63707d6014d34c3f.png)
select dbo.* from v$locked_object lo ,dba_objects dbo where lo.object_id = dbo.object_id and lo.xidusn=0
![Oracle中診斷阻塞session的方法 blocking error](https://i.iter01.com/images/6fb2740eaa502aa52cb6e513b6f7364d13aaf4434bb32a71fd1137cc851412a6.png)
![Oracle中診斷阻塞session的方法 blocking error](https://i.iter01.com/images/6fb2740eaa502aa52cb6e513b6f7364d13aaf4434bb32a71fd1137cc851412a6.png)
通過查詢v$lock可以看到是哪一個session阻塞了哪一個session:142阻塞了139
with blkedsess as (select * from v$lock where request !=0)
select blkingsess.sid blockingsid, blkedsess.sid blockedsid
from v$lock blkingsess,blkedsess
where blkingsess.id1 = blkedsess.id1
and blkingsess.id2 = blkedsess.id2
and blkingsess.sid != blkedsess.sid
![Oracle中診斷阻塞session的方法 blocking error](https://i.iter01.com/images/f3361949beb18ae590d31d5438c814abfbddf496b37ee4a863fba210d73cdb4b.png)
在通過v$session可以查到session相關的資訊,被阻塞的status一般為ACTIVE,還可以通過sql_address聯合v$sql找到被阻塞的SQL語句. www.2cto.com
select sid,serial#,status,sql_address from v$session where sid in(139,142)
![Oracle中診斷阻塞session的方法 blocking error](https://i.iter01.com/images/2e198d454342325f4bf1e14c1b8f25466ceac73b2d021cf991ef9318d3050d3f.png)
select * from V$sql where address='6BE7D33C'
or
select sql_text, sql_fulltext, sql_id from v$sqlarea where sql_id='6BE7D33C';
or
select sql_text from v$sqltext where sql_id = '6BE7D33C';
![Oracle中診斷阻塞session的方法 blocking error](https://i.iter01.com/images/dd68caa6780c9e5005af1ede3df574a792b8e78089520cdd66a4406158c46282.png)
這時候DBA可以聯絡造成阻塞的session結束事務或者根據情況用命令終止session
alter system kill session '142,7'; 其中142為sid,7為serial#
session 142會收到如下錯誤,而session139往下執行後續步驟.
ERROR:
ORA-03114: not connected to ORACLE
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24558279/viewspace-735147/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE診斷案例Oracle
- SQL Server阻塞blocking案例分析SQLServerBloC
- Oracle診斷事件列表(轉)Oracle事件
- SAP ABAP OData 服務診斷工具 /IWFND/ERROR_LOG 的使用方法Error
- oracle之 redo過高診斷Oracle
- 9 Oracle Data Guard 故障診斷Oracle
- Oracle診斷案例-Sql_traceOracleSQL
- 【ASK_ORACLE】ORA-04030診斷方法及預防措施Oracle
- Oracle 12.1.0.2 impdp匯入慢診斷Oracle
- oracle RAC 診斷叢集狀態命令Oracle
- 一次ORACLE IO效能診斷案例Oracle
- 一次Oracle診斷案例-Spfile案例Oracle
- 碰見一個BLOCKING_SESSION顯示不正確的BUGBloCSession
- Oracle EBS基礎學習:Oracle EBS啟用診斷功能Oracle
- oracle 12c 新增的診斷事件的初步嘗試Oracle事件
- Oracle診斷案例-Job任務停止執行Oracle
- 一次Oracle診斷案例-SGA與SwapOracle
- 吃透 JVM 診斷方法與工具使用JVM
- 【譯】.NET 5 中的診斷改進
- Oracle 阻塞Oracle
- ORACLE 如何診斷高水位爭用(enq: HW – contention)OracleENQ
- 9. Oracle常用分析診斷工具——9.3.ADDMOracle
- 9. Oracle常用分析診斷工具——9.2. ASHOracle
- 9. Oracle常用分析診斷工具——9.1. AWROracle
- 查殺oracle的阻塞Oracle
- Win10系統使用疑難解答診斷提示診斷策略服務已被禁用的解決方法Win10
- .Net Core中的診斷日誌DiagnosticSource講解
- oracle中的processes,session,transaction引數詳解OracleSession
- [JVM] 應用診斷工具之Fastthread(線上診斷)JVMASTthread
- Oracle session traceOracleSession
- oracle 會話(session)被鎖瞭解決方法Oracle會話Session
- 軟中斷訊號集與阻塞測試
- 網路診斷工具的使用
- Java 執行緒中斷(interrupt)與阻塞 (park)的區別Java執行緒
- MySQL故障診斷常用方法手冊(含指令碼、案例)MySql指令碼
- Java診斷利器ArthasJava
- SQL問題診斷SQL
- Blocking ElementsBloC
- win10系統下啟用診斷策略服務的方法Win10