http://blog.csdn.net/tianlesoftware/article/details/6822321
2. 查一个session的状态
- SELECT distinct S.SID SESSION_ID,
- S.STATUS,
- S.USERNAME,
- DECODE (LMODE,
- 0, ' None ',
- 1, ' Null ',
- 2, ' Row-S(SS) ',
- 3, ' Row-X(SX) ',
- 4, ' Share',
- 5, 'S/Row-X (SSX) ',
- 6, 'Exclusive ',
- TO_CHAR (LMODE))
- MODE_HELD,
- DECODE (REQUEST,
- 0, ' None ',
- 1, ' Null ',
- 2, ' Row-S(SS) ',
- 3, ' Row-X(SX) ',
- 4, ' Share',
- 5, 'S/Row-X (SSX) ',
- 6, 'Exclusive ',
- TO_CHAR (REQUEST))
- MODE_REQUESTED,
- O.OWNER || ' . ' || O.OBJECT_NAME || ' ( ' || O.OBJECT_TYPE || ' ) '
- AS OBJECT_NAME,
- S.TYPE LOCK_TYPE,
- L.ID1 LOCK_ID1,
- L.ID2 LOCK_ID2,
- S2.SQL_TEXT
- FROM V$LOCK L,
- SYS.DBA_OBJECTS O,
- V$SESSION S,
- V$ACCESS A,
- V$SQL S2
- WHERE L.SID = S.SID
- AND L.ID1 = O.OBJECT_ID
- AND S.SID = A.SID
- AND S2.HASH_VALUE = S.SQL_HASH_VALUE
- AND A.OBJECT = 'PROC_VALIDATE_RULE_V3';
3. 确认killed 状态的session是否使用回滚段
- SELECT s.username,
- s.sid,
- s.serial#,
- t.used_ublk,
- t.used_urec,
- rs.segment_name,
- r.rssize,
- r.status
- FROM v$transaction t,
- v$session s,
- v$rollstat r,
- dba_rollback_segs rs
- WHERE s.saddr = t.ses_addr
- AND t.xidusn = r.usn
- AND rs.segment_id = t.xidusn
- AND s.sid IN
- (850, 968, 991, 1039, 968, 991, 1039, 1009, 732, 850, 732)
- ORDER BY t.used_ublk DESC;
4. 在OS 级别kill 进程
前面已经获取了对象上持有的session ID,这里根据Session ID 查出相关的系统SPID. Sql 语句如下:
- SELECT spid, osuser, s.program
- FROM v$session s, v$process p
- WHERE s.paddr = p.addr
- AND s.sid IN
- (850, 968, 991, 1039, 968, 991, 1039, 1009, 732, 850, 732);
[oracle@qs-xezf-db1 ~]$ ps -ef|grep 6101
oracle 6101 1 0 May13 ? 00:01:06 oraclexezf (LOCAL=NO)
oracle 16790 16606 0 05:14 pts/2 00:00:00 grep 6101
[oracle@qs-xezf-db1 ~]$ kill -9 6101
[oracle@qs-xezf-db1 ~]$ ps -ef|grep 6279
oracle 6279 1 0 May13 ? 00:00:57 oraclexezf (LOCAL=NO)
oracle 16824 16606 0 05:14 pts/2 00:00:00 grep 6279
[oracle@qs-xezf-db1 ~]$ kill -9 6279
5. 检查
在OS级别kill 掉这些状态为killed 的session 之后,对象的Row-X(SX)全部释放,过程对象上的操作也顺利进行,没有出现等待。
这里注意的是,修改之后会导致一些对象的无效,需要查看并重新编译这些无效对象。