Oracle无法删除当前连接用户,以及killed的处理

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 


Kiled的处理:

方法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的进程了。注意要避免杀系统进程,避免数据库宕机。



你可能感兴趣的:(oracle以及数据库问题汇总)