Oracle 查看当前所有会话SQL和等待事件
定位会话、定位等待事件、定位SQL
select t2.sid, t2.SERIAL#, -- 库级唯一定位一个session
t1.SPID OS_PID, -- 操作系统的PID
t3.SQL_ID, t2.EVENT,-- SQLID和等待事件
t2.P1TEXT, t2.P1, -- 等待事件的P1信息
t2.p2TEXT, t2.P2, -- 等待事件的P2信息
t2.p3TEXT, t2.P3, -- 等待事件的P3信息
t3.SQL_FULLTEXT -- 被执行的SQL完整内容
from v$process t1, v$session t2, v$sql t3
where t1.ADDR = t2.PADDR
and t2.STATUS = 'ACTIVE'
-- 表示当前正在执行SQL的会话
-- and t2.STATUS = 'INACTIVE'
-- 表示当前等待执行SQL的会话
-- and t2.STATUS = 'KILLED'
-- 表示当前会话正在被杀掉,未提交事务强制回滚
and t2.SQL_ID = t3.SQL_ID;
-- t2.sid, t2.SERIAL# 可以用作库级杀死会话:alter system kill session 't2.sid, t2.SERIAL#';
-- t1.SPID OS_PID 可以用作系统级杀死会话:kill -9 t1.SPID
-- t2.EVENT 和 P1、P2、P3 不同的等待事件的P1、P2和P3的信息是不尽相同的,具体要查官档
-- t3.SQL_FULLTEXT 是一个CLOB类型的字段
去掉注释,较为清爽的ctrl+c版SQL:
select t2.sid, t2.SERIAL#, t1.SPID OS_PID,
t3.SQL_ID, t2.EVENT,
t2.P1TEXT, t2.P1, t2.p2TEXT, t2.P2,
t2.p3TEXT, t2.P3, t3.SQL_FULLTEXT
from v$process t1, v$session t2, v$sql t3
where t1.ADDR = t2.PADDR
and t2.STATUS = 'ACTIVE' -- 'INACTIVE'
and t2.SQL_ID = t3.SQL_ID;