Oracle杀session

来自ling
跳转至: 导航搜索

如何快速的杀掉Oracle的Session 2011-08-04 15:41 by Tracy., 1613 阅读, 0 评论, 收藏, 编辑 --如何快速的杀掉Oracle的Session /*============================================================================== 本资料经网络收集整理,已经验证,但对使用资料所造成的后果及影响不负任何责任 ==============================================================================*/

--1.如何查看session级的等待事件? /*============================================================================== 当我们对数据库的性能进行调整时,一个最重要的参考指标就是系统等待事 件。 $system_event,v$session_event,v$session_wait这三个视图里记录的就是系统级和session级的等待 事件, 通过查询这些视图你可以发现数据库的一些操作到底在等待什么?是磁盘I/O,缓冲区忙,还是插锁等等。

通过如下sql你可以查询你的每个应用程序到底在等待什么,从而针对这些信息对数据库的性能进行调整。 ==============================================================================*/

Select s.username,s.program,s.status,se.event,se.total_waits,se.total_timeouts,se.time_waited,se.average_wait from v$session s, v$session_event se Where s.sid=se.sid And se.event not like 'SQl*Net%' And s.status ='ACTIVE' And s.username is not null

/*============================================================================== 2.oracle中查询被锁的表并释放session ==============================================================================*/

SELECT A.OWNER,

A.OBJECT_NAME, B.XIDUSN, B.XIDSLOT, B.XIDSQN, B.SESSION_ID, B.ORACLE_USERNAME, B.OS_USER_NAME, B.PROCESS, B.LOCKED_MODE, C.MACHINE, C.STATUS, C.SERVER, C.SID, C.SERIAL#, C.PROGRAM FROM ALL_OBJECTS A, V$LOCKED_OBJECT B, SYS.GV_$SESSION C WHERE (A.OBJECT_ID = B.OBJECT_ID) AND (B.PROCESS = C.PROCESS) ORDER BY 1, 2

--释放session Sql:

alter system kill session 'sid, serial#'
alter system kill session '30, 2412';

/*============================================================================== 如:

alter system kill session '379, 21132'
alter system kill session '374, 6938'

==============================================================================*/

/*============================================================================== 3.查看占用系统io较大的session ==============================================================================*/

SELECT se.sid,
se.serial#,
pr.SPID,
se.username,
se.status,
se.terminal,
se.program,
se.MODULE,
se.sql_address,
st.event,
st.p1text,
si.physical_reads,
si.block_changes
FROM v$session se,  v$session_wait st, v$sess_io si, v$process pr
WHERE st.sid = se.sid  AND st.sid = si.sid
AND se.PADDR = pr.ADDR
AND se.sid > 6 AND st.wait_time = 0
AND st.event NOT LIKE '%SQL%'
ORDER BY physical_reads DESC

/*============================================================================== 4.找出耗cpu较多的session ==============================================================================*/

select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value
from v$session a,v$process b,v$sesstat c
where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc;

/*============================================================================== 5.查询session被锁的sql可以用一下语句 ==============================================================================*/

select sys.v_$session.osuser,sys.v_$session.machine,v$lock.sid,

  sys.v_$session.serial#,   decode(v$lock.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 Invalida-tion',   'LS', 'Log Start or Switch',   'RW', 'Row Wait',   'SQ', 'Sequence Number',   'TE', 'Extend Table',   'TT', 'Temp Table',   'Unknown') LockType,   rtrim(object_type) || ' ' || rtrim(owner) || '.' || object_name object_name,   decode(lmode, 0, 'None',   1, 'Null',   2, 'Row-S',   3, 'Row-X',   4, 'Share',   5, 'S/Row-X',   6, 'Exclusive', 'Unknown') LockMode,   decode(request, 0, 'None',   1, 'Null',   2, 'Row-S',   3, 'Row-X',   4, 'Share',   5, 'S/Row-X',   6, 'Exclusive', 'Unknown') RequestMode,   ctime, block b   from v$lock, all_objects, sys.v_$session   where v$Lock.sid > 6 and sys.v_$session.sid = v$lock.sid   and v$lock.id1 = all_objects.object_id;    /*============================================================================== OS一级for kill 处理Oracle中杀不掉的锁 如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放, 那么可以在os一级再杀死相应 ==============================================================================*/ --1 查询session被锁的sql,简要查询,得到SID

select object_name,machine,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;

--2 使用alter system kill session '24,111'; (其中24,111分别是上面查询出的sid,serial#)进行释放

alter system kill session '30, 2412'

--3 执行下面的语句获得进程(线程)号,sid为第一步查询出的sid号:

select spid, osuser, s.program 
from v$session s,v$process p
where s.paddr=p.addr and s.sid=30; 

/*============================================================================== 4.在OS上杀死这个进程(线程): 1)在unix上,用root身份执行命令:

#kill -9 12345(即第3步查询出的spid)

2)在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:

orakill sid thread

其中: sid:表示要杀死的进程属于的实例名 thread:是要杀掉的线程号,即第3步查询出的spid。

例:c:>orakill orcl 12345

==============================================================================*/

魔兽就是毒瘤,大家千万不要玩。