v$process视图包含当前系统oracle运行的所有进程信息
每一个连接到数据库实例中的session都拥有一条记录。包括用户session及后台进程如DBWR,LGWR,arcchiver等等。
V$SESSION中的常用列
V$SESSION是基础信息视图,用于找寻用户SID或SADDR。
(1)查看用户的连接状况
select username,sid,serial# from v$session
或者
select saddr,sid,serial#,paddr,username,status from v$session where username is not null
----------------------------------------
如下结果:
username sid serial#
----------------------------------------
NETBNEW 513 22974
NETBNEW 514 18183
NETBNEW 516 21573
NETBNEW 531 9
WUZHQ 532 4562
(2)找到要删除用户的sid,和serial,并删除
------------------------------------------
如:你要删除用户'WUZHQ',可以这样做:
alter system kill session'532,4562'
(3)删除用户
--------------------------------------------
drop user username cascade
方法1:
首先通过下面sql查找在v$process中存在而不在v$session中存在的进程:
select p.addr from v$process p where pid <> 1
minus
select s.paddr from v$session s;
查询显示结果如下:
ADDR
----------------
C0000005C32975D8
C0000005C3297AE0
C0000005C3297FE8
确认这些进程是否为重要的后台进程:
select spid, username, terminal, program, background from v$process where addr in ('C0000005C32975D8', 'C0000005C3297AE0', 'C0000005C3297FE8');
查询结果:
SPID USERNAME TERMINAL PROGRAM BACKGROUND
------------ -------- ------------------------------ ----------------------------------- ---------------------
6857 oracle UNKNOWN oracle@mgdev (S000)
6859 oracle UNKNOWN oracle@mgdev (D000)
9370 oracle UNKNOWN oracle@mgdev (TNS V1-V3)
可以看到都不是重要的后台进程,前两个是和共享服务器相关的进程,第3个就是要找的进程了,它正好也是通过TNS连上的,执行:
kill -9 9370,然后查询:对手
select sid, username, program, machine, status from v$session where status='KILLED';
方法2:
--下面这个sql语句,可以列出来各个脚本,需要录入sid,这个sid可以从pl/sql developer的session中查到。
SELECT 'alter system kill session ''' || ta.sid || ',' || ta.serial# || ''';',
'alter system disconnect session ''' || ta.sid || ',' || ta.serial# || ''' immediate;',
'host orakill ' || tc.instance_name || ' ' || tb.spid,
'kill -9 ' || tb.spid,
tb.spid,
ta.osuser,
tb.program,
ta.terminal,
ta.program
FROM v$session ta, v$process tb, v$instance tc
WHERE tb.addr = ta.paddr
AND ta.sid = &yoursid;
-- 也可以用这个Metalink提供的脚本,其中的os thread就是在orakill 时写的spid
select p.spid "OS Thread", b.name "Name-User", s.osuser, s.program
from v$process p, v$session s, v$bgprocess b
where p.addr = s.paddr
and p.addr = b.paddr UNION ALL
select p.spid "OS Thread", s.username "Name-User", s.osuser, s.program
from v$process p, v$session s
where p.addr = s.paddr
and s.username is not null;
然后执行c:/>orakill oracle_sid os_thread,就可以杀掉killed的进程了。注意要避免杀系统进程,避免数据库宕机。