如何快速的杀掉Oracle的Session

1.如何查看session级的等待事件?

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

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';


 

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,
       n.NAME statname,
       value / 60 / 100 value
  from v$session a, v$process b, v$sesstat c, v$statname n
 where n.statistic# = c.STATISTIC#
   and c.statistic# = 14
   and c.sid = a.sid
   and a.paddr = b.addr
 order by value desc;
 

 

5.查询session被锁可以用一下语句

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;


 

4.在OS上杀死这个进程(线程):

 

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;


 

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

 

对于一个Oracle DBA来说,需要定期的检查shared pool中的sql语句占用的内存空间,对于严重占用shared pool,无法释放的sql语句必须要求程序员修改或优化sql语句。

Java代码

 
 
  1. select sql_text ,sharable_mem from v$sql where sharable_mem > '100000' order by sharable_mem ;   

上面的sql语句是查询shared pool中占用内存超过100K的sql语句。

这个sql可以非常有效的检查出Oracle shared pool中那些严重占用内存的sql,根据我的经验,绝大多数有问题的sql语句都会在这里留下痕迹,通过在这里找出有问题的sql语句并进行修改,再反复运行这个sql脚本,直到所以有问题的sql都处理完毕,这就是对Oracle数据库在sql上面的最好的优化,可以保证不会因为程序员的sql语句问题导致Oracle数据库的性能问题。

共享池主要由库缓冲区(共享SQL区和PL/SQL区)和数据字典缓冲区组成

 
 
  1. select * from v$sgastat; 

--显示SGA (系统全局区System Global Area) 的状态信息。有的人写的SQL语句非常复杂,嵌套了好几层,SQL语句本身写的很差,就有可能会占用很大的SQL区域。

这是我从Oracle Metalink里面摘下来的:

引用

If the SHARED_POOL_SIZE is large enough, most ORA-04031 errors are a result of dynamic sqlfragmenting the shared pool. This can be caused by:

1 Not sharing SQL 
2 Making unnecessary parse calls (soft) 
3 Not using bind variables



杀掉执行特定sql的session:

select q.SQL_TEXT, s.* from v$session s ,v$sql q where s.sql_id=q.SQL_ID

and lower(q.SQL_TEXT) like '%update dw_hotelorder_f%'


alter systemkill session'sid, serial#'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值