最近一次数据维护的时候 ,kill session 总结,中间出了一点小插曲 , 所以总结一下
数据库杀session 有两种方式, 第一种是通过 sid 和 serial# ,这是在我们可以在 系统 v$session
里面可以获取到这两个参数。我们可以通过 username, 登录时间, machine 等条件进行过滤。
然后生成我们的alter system kill session 脚本
1. 通过oracle视图获取 已知的 sid ,serail#
ALTER SYSTEM KILLSESSION ' sid , serial#' ;
A. 杀掉对于的应用程序的链接:
select 'alter systemkill session '''||sid||','||SERIAL#||''' ;' from v$session where machine like 'xxtrade%' and username like 'xxTRP%' andstatus<>'KILLED';
B. 通过用户来杀应用
select 'alter systemkill session '''||sid||','||SERIAL#||''' ;' from v$session where username like 'TRADEAPP%' and machine not like ‘本机’ ;
C. 通过时间来杀死一段时间内的session
select 'alter systemkill session '''||sid||','||SERIAL#||''' ;' from v$session where username='TRADsdd' and LOGON_TIME <to_date('2013050606','yyyymmddhh24')and STATUS <> 'ACTIVE';
D. 根据时间和前一次执行时间来确定
where username='TRADExxx002'
and LOGON_TIME<to_date('2013050606','yyyymmddhh24')
and PREV_EXEC_START<sysdate-1/24;
第二种情况是在我们db中没有源信息的进程,就是 我们无法通过v$session,v$process.
2. 通过kill 命令杀进程
Kill pid
A. 如果process中满了,但是v$session 中没有对于的进程(账务就是这个情况)
selecta.spid,a.username from v$process a,v$session b where a.addr = b.paddr(+) andb.paddr is null ;
之后通过spid 杀掉
B. 杀特定的进程
select a.spid,a.username from v$process a,v$session b wherea.addr = b.paddr and b.machine = ‘XXXX’ ;
kill -9 spid