如何杀掉被锁的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> A.OBJECT_NAME, <BR> B.XIDUSN, <BR> B.XIDSLOT, <BR> B.XIDSQN, <BR> B.SESSION_ID, <BR> B.ORACLE_USERNAME, <BR> B.OS_USER_NAME, <BR> B.PROCESS, <BR> B.LOCKED_MODE, <BR> C.MACHINE, <BR> C.STATUS, <BR> C.SERVER, <BR> C.SID, <BR> C.SERIAL#, <BR> C.PROGRAM <BR> FROM ALL_OBJECTS A, V$LOCKED_OBJECT B, SYS.GV_$SESSION C <BR>WHERE (A.OBJECT_ID = B.OBJECT_ID) <BR> 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> se.serial#, <BR> pr.SPID, <BR> se.username, <BR> se.status, <BR> se.terminal, <BR> se.program, <BR> se.MODULE, <BR> se.sql_address, <BR> st.event, <BR> st.p1text, <BR> si.physical_reads, <BR> si.block_changes <BR> 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> AND se.PADDR = pr.ADDR <BR> AND se.sid > 6 AND st.wait_time = 0 <BR> 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 > 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:>orakill orcl 12345 <BR>==============================================================================*/ </DIV><DIV> </DIV>
<DIV> </DIV>
<DIV>转自:<a href="http://jzgl-javaeye.iteye.com/blog/829274" target="_blank">http://jzgl-javaeye.iteye.com/blog/829274</A></DIV>
页:
[1]