Oracle / RAC
Oracle会话阻塞链与Kill语句生成诊断查询
通过v$wait_chains等视图递归展示会话等待链、阻塞源及对应SQL,并为每个会话生成KILL SESSION终止语句,便于快速定位和处理数据库阻塞。
SQL#阻塞会话#等待链#KILL SESSION#性能诊断#RAC
适用版本:Oracle 10g R2及以上(需v$wait_chains视图)
上生产前,先在测试库跑一遍,确认版本、权限和影响范围。涉及数据或配置变更时,先备份,备好回退方案。
脚本使用说明
这些脚本供学习和日常运维参考。执行前请自行验证脚本是否适合你的环境,做好必要备份,并承担执行风险。因使用脚本造成的损失,本站在法律允许的范围内不承担责任。依法应承担的责任仍由本站承担。
oracle-session-block-chain-kill-diagnosis.sql
环境与权限
需要SELECT权限访问v$wait_chains、gv$session、dba_objects、v$sql视图;RAC环境下需具备gv$视图访问权限;若使用诊断包特性可能需相应授权。
使用方式
- 下载脚本,在具备会话与等待视图查询权限的环境启动 SQL*Plus。
使用方式 · bash
sqlplus -L /nolog- 按现场认证方式连接目标库,再执行下载的文件。
使用方式 · sql
@oracle-session-block-chain-kill-diagnosis.sql完整脚本
Oracle · sql
SET LINESIZE 2222
SET PAGESIZE 1000
COLUMN serial# FORMAT 999999
COLUMN object_name FORMAT A30
COLUMN sql_text FORMAT A50
COLUMN session_detail FORMAT A30
SELECT RPAD('+',
LEVEL,
'-') || sid || ' ' || sess.module AS session_detail,
sid,
serial#,
'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ',@' || sess.inst_id || ''' IMMEDIATE;' AS kill_sql,
blocker_sid,
sess.inst_id,
wait_event_text,
object_name,
RPAD(' ', LEVEL) || sql_text AS sql_text
FROM v$wait_chains c
LEFT OUTER JOIN dba_objects o
ON row_wait_obj# = object_id
JOIN gv$session sess
USING (sid)
LEFT OUTER JOIN v$sql sql
ON sql.sql_id = sess.sql_id
AND sql.child_number = sess.sql_child_number
CONNECT BY PRIOR sid = blocker_sid
AND PRIOR sess_serial# = blocker_sess_serial#
AND PRIOR instance = blocker_instance
START WITH blocker_is_valid = 'FALSE';