benxiong 发表于 2011-12-23 01:30

如何杀掉被锁的Session.sql

<DIV>--如何快速的杀掉Oracle的Session <BR>/*============================================================================== <BR>本资料经网络收集整理,已经验证,但对使用资料所造成的后果及影响不负任何责任 <BR>==============================================================================*/ <BR><BR>--1.如何查看session级的等待事件? <BR>/*============================================================================== <BR>当我们对数据库的性能进行调整时,一个最重要的参考指标就是系统等待事 件。 <BR>$system_event,v$session_event,v$session_wait这三个视图里记录的就是系统级和session级的等待 事件, <BR>通过查询这些视图你可以发现数据库的一些操作到底在等待什么?是磁盘I/O,缓冲区忙,还是插锁等等。 <BR><BR>通过如下sql你可以查询你的每个应用程序到底在等待什么,从而针对这些信息对数据库的性能进行调整。 <BR>==============================================================================*/ <BR>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 <BR>/*============================================================================== <BR>2.oracle中查询被锁的表并释放session <BR>==============================================================================*/ <BR>SELECT A.OWNER, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.OBJECT_NAME, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B.XIDUSN, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B.XIDSLOT, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B.XIDSQN, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B.SESSION_ID, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B.ORACLE_USERNAME, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B.OS_USER_NAME, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B.PROCESS, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B.LOCKED_MODE, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.MACHINE, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.STATUS, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.SERVER, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.SID, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.SERIAL#, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.PROGRAM <BR>&nbsp; FROM ALL_OBJECTS A, V$LOCKED_OBJECT B, SYS.GV_$SESSION C <BR>WHERE (A.OBJECT_ID = B.OBJECT_ID) <BR>&nbsp;&nbsp; AND (B.PROCESS = C.PROCESS) <BR>ORDER BY 1, 2 <BR><BR>--释放session Sql: <BR>alter system kill session 'sid, serial#' <BR><BR>alter system kill session '30, 2412'; <BR>/*============================================================================== <BR>如: <BR>alter system kill session '379, 21132' <BR>alter system kill session '374, 6938' <BR>==============================================================================*/ <BR><BR>/*============================================================================== <BR>3.查看占用系统io较大的session <BR>==============================================================================*/ <BR>SELECT se.sid, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; se.serial#, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pr.SPID, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; se.username, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; se.status, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; se.terminal, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; se.program, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; se.MODULE, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; se.sql_address, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st.event, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st.p1text, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; si.physical_reads, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; si.block_changes <BR>&nbsp; FROM v$session se,  v$session_wait st, v$sess_io si, v$process pr <BR>WHERE st.sid = se.sid  AND st.sid = si.sid <BR>&nbsp;&nbsp; AND se.PADDR = pr.ADDR <BR>&nbsp;&nbsp; AND se.sid &gt; 6 AND st.wait_time = 0 <BR>&nbsp;&nbsp; AND st.event NOT LIKE '%SQL%' <BR>ORDER BY physical_reads DESC <BR><BR>/*============================================================================== <BR>4.找出耗cpu较多的session <BR>==============================================================================*/ <BR>select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value <BR>from v$session a,v$process b,v$sesstat c <BR>where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc; <BR><BR>/*============================================================================== <BR>5.查询session被锁的sql可以用一下语句 <BR>==============================================================================*/ <BR>select sys.v_$session.osuser,sys.v_$session.machine,v$lock.sid, <BR>  sys.v_$session.serial#, <BR>  decode(v$lock.type, <BR>  'MR', 'Media Recovery', <BR>  'RT','Redo Thread', <BR>  'UN','User Name', <BR>  'TX', 'Transaction', <BR>  'TM', 'DML', <BR>  'UL', 'PL/SQL User Lock', <BR>  'DX', 'Distributed Xaction', <BR>  'CF', 'Control File', <BR>  'IS', 'Instance State', <BR>  'FS', 'File Set', <BR>  'IR', 'Instance Recovery', <BR>  'ST', 'Disk Space Transaction', <BR>  'TS', 'Temp Segment', <BR>  'IV', 'Library Cache Invalida-tion', <BR>  'LS', 'Log Start or Switch', <BR>  'RW', 'Row Wait', <BR>  'SQ', 'Sequence Number', <BR>  'TE', 'Extend Table', <BR>  'TT', 'Temp Table', <BR>  'Unknown') LockType, <BR>  rtrim(object_type) || ' ' || rtrim(owner) || '.' || object_name object_name, <BR>  decode(lmode, 0, 'None', <BR>  1, 'Null', <BR>  2, 'Row-S', <BR>  3, 'Row-X', <BR>  4, 'Share', <BR>  5, 'S/Row-X', <BR>  6, 'Exclusive', 'Unknown') LockMode, <BR>  decode(request, 0, 'None', <BR>  1, 'Null', <BR>  2, 'Row-S', <BR>  3, 'Row-X', <BR>  4, 'Share', <BR>  5, 'S/Row-X', <BR>  6, 'Exclusive', 'Unknown') RequestMode, <BR>  ctime, block b <BR>  from v$lock, all_objects, sys.v_$session <BR>  where v$Lock.sid &gt; 6 and sys.v_$session.sid = v$lock.sid <BR>  and v$lock.id1 = all_objects.object_id; <BR>   <BR>/*============================================================================== <BR>OS一级for kill 处理Oracle中杀不掉的锁 <BR>如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放, <BR>那么可以在os一级再杀死相应 <BR>==============================================================================*/ <BR>--1 查询session被锁的sql,简要查询,得到SID <BR>select object_name,machine,s.sid,s.serial# <BR>from v$locked_object l,dba_objects o ,v$session s <BR>where l.object_id = o.object_id and l.session_id=s.sid; <BR><BR>--2 使用alter system kill session '24,111'; (其中24,111分别是上面查询出的sid,serial#)进行释放 <BR>alter system kill session '30, 2412' <BR><BR>--3 执行下面的语句获得进程(线程)号,sid为第一步查询出的sid号: <BR>select spid, osuser, s.program <BR>from v$session s,v$process p <BR>where s.paddr=p.addr and s.sid=30; <BR>/*============================================================================== <BR>4.在OS上杀死这个进程(线程): <BR>1)在unix上,用root身份执行命令: <BR>#kill -9 12345(即第3步查询出的spid) <BR>2)在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为: <BR>orakill sid thread <BR>其中: <BR>sid:表示要杀死的进程属于的实例名 <BR>thread:是要杀掉的线程号,即第3步查询出的spid。 <BR>例:c:&gt;orakill orcl 12345 <BR>==============================================================================*/ </DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>转自:<a href="http://jzgl-javaeye.iteye.com/blog/829274" target="_blank">http://jzgl-javaeye.iteye.com/blog/829274</A></DIV>
页: [1]
查看完整版本: 如何杀掉被锁的Session.sql