您的位置:首页 > 数据库 > Oracle

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

2016-11-25 08:30 363 查看
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

------------ -------- ------------------
ca6a
------------ -----------------------------------  ---------------------

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: