ITPUB??ì3
2010数据库技术大会
ITPUB论坛 » Oracle数据库管理 » 我使用Alter System Kill Session 后发现V$session中的PADDR改变了,这是为什么?

您有 2 条公共消息
  • 来自: 公共消息 标题: 新开"PLM/PDM产品 ... 内容: 讨论范围包括:产品研发管理(PDM),产品生命周期管理(PLM),工艺/ ...
  • 来自: 公共消息 标题: 2010数据库技术大 ... 内容: “2010数据库技术大会”将于2010年4月2日~4月3日,在北京歌华开元大酒 ...

    标题: [精华] 我使用Alter System Kill Session 后发现V$session中的PADDR改变了,这是为什么?
    离线 hwlbigboy
    初级会员



    精华贴数 1
    个人空间 0
    技术积分 183 (11846)
    社区积分 0 (66371)
    注册日期 2002-4-4
    论坛徽章:0
          
          

    发表于 2004-6-25 13:45 
    我使用Alter System Kill Session 后发现V$session中的PADDR改变了,这是为什么?为什

    我使用Alter system kill session 'SID,SERIAL#' 将某个Session 删除后
    发现Server上的资源未被释放,于是我想找到Server上该Session的进程号,然后用Kill -9 SPID杀掉它

    我是这样通过SID去找SPID的:
    select p.spid from v$session s,v$process p
    where s.sid='sid' and s.paddr=p.addr
    但是我发现这样根本找不到SPID,因为在执行Alter system kill session
    后,这个Session的PADDR值会发生改变(而且在V$SESSION中所有STATUS为KILLED的PADDR 都会变为同一个值耶,真奇怪!)
    这是怎么回事呀?我怎么找到一个STATUS为KILLED的SPID呢(因为我要在脚本中自动杀死这些SPID)?哪位可以帮帮我?


    只看该作者    顶部
    离线 catherine9999
    中级会员


    精华贴数 0
    个人空间 0
    技术积分 456 (5060)
    社区积分 0 (107807)
    注册日期 2003-9-16
    论坛徽章:1
    在线时间     
          

    发表于 2004-6-25 15:02 
    想要判断出那些process为已经被kill掉可以通过视图x$ksupr


    __________________
    闲中好,尘务不萦心。坐对当窗木,看移三面阴。
    只看该作者    顶部
    离线 hwlbigboy
    初级会员



    精华贴数 1
    个人空间 0
    技术积分 183 (11846)
    社区积分 0 (66371)
    注册日期 2002-4-4
    论坛徽章:0
          
          

    发表于 2004-6-25 15:13 
    谢谢你的回答
    但是我用system用户登陆执行
    select * from x$ksupr
    时报错
    ORA-00942:table or view does not exist
    这是怎么回事啊?还请大虾指点!


    只看该作者    顶部
    离线 remen
    高级会员


    精华贴数 1
    个人空间 0
    技术积分 6998 (238)
    社区积分 5 (18639)
    注册日期 2003-9-12
    论坛徽章:13
    会员2007贡献徽章会员2006贡献徽章授权会员生肖徽章2007版:鸡生肖徽章2007版:马2009新春纪念徽章
    数据库板块每日发贴之星ERP板块每日发贴之星数据库板块每日发贴之星生肖徽章2007版:鸡ITPUB新首页上线纪念徽章数据库板块每日发贴之星

    发表于 2004-6-25 15:18 
    你需要用sys登陆进行查询!


    只看该作者    顶部
    离线 hwlbigboy
    初级会员



    精华贴数 1
    个人空间 0
    技术积分 183 (11846)
    社区积分 0 (66371)
    注册日期 2002-4-4
    论坛徽章:0
          
          

    发表于 2004-6-25 15:28 
    用SYS可以查到了
    但是这个视图好像是已经被Kill掉的Process
    我想要的是找在V$session中STATUS为KILLED的对应的PROCESS的SPID号(要知道这个主要是想通过SPID在OS上KILL掉进程释放资源),通过VSESSION和V$PROCESS关联PADDR和ADDR的方式找不到,因为KIll Session后V$session中的PADDR支会改变,不是原来的那个值了!

    怎么办?




    只看该作者    顶部
    离线 catherine9999
    中级会员


    精华贴数 0
    个人空间 0
    技术积分 456 (5060)
    社区积分 0 (107807)
    注册日期 2003-9-16
    论坛徽章:1
    在线时间     
          

    发表于 2004-6-25 15:46 
    你要得不就是被kill掉的吗?
    用下面的语句来看
    col username format a10

    SELECT s.username,s.status,
    x.ADDR,x.KSLLAPSC,x.KSLLAPSN,x.KSLLASPO,x.KSLLID1R,x.KSLLRTYP,
    decode(bitand(x.ksuprflg,2),0,null,1)
    FROM x$ksupr x,v$session s
    WHERE s.paddr(+)=x.addr
    and bitand(ksspaflg,1)!=0

    里面的x.addr应该就是会有已经被kill的session的paddr,你可以自己做实验验证


    __________________
    闲中好,尘务不萦心。坐对当窗木,看移三面阴。
    只看该作者    顶部
    离线 catherine9999
    中级会员


    精华贴数 0
    个人空间 0
    技术积分 456 (5060)
    社区积分 0 (107807)
    注册日期 2003-9-16
    论坛徽章:1
    在线时间     
          

    发表于 2004-6-25 15:48 
    根据x.addr可以在v$process中找到对应的spid


    __________________
    闲中好,尘务不萦心。坐对当窗木,看移三面阴。
    只看该作者    顶部
    离线 hwlbigboy
    初级会员



    精华贴数 1
    个人空间 0
    技术积分 183 (11846)
    社区积分 0 (66371)
    注册日期 2002-4-4
    论坛徽章:0
          
          

    发表于 2004-6-25 16:02 
    我验证过了,还是不行

    我KILL了三个Session(注意被KILL的Session在V$Session中的PADDR居然全部变成一样的了!)

    SQL> select sid,serial#,paddr,status from v$session where status='KILLED';

           SID    SERIAL# PADDR    STATUS
    ---------- ---------- -------- ----------------
            14         30 026B9EB0 KILLED
            15          7 026B9EB0 KILLED
            16         34 026B9EB0 KILLED

    SQL> select * from sys.x$ksupr where addr='026B9EB0';

    沒有任何資料列被選取

    这说明被KILLSession的PADDR(我是说变化后的)并不会出现在x$ksupr 视图中的ADDR中

    你觉得呢?

    还有别的办法吗??



    只看该作者    顶部
    离线 catherine9999
    中级会员


    精华贴数 0
    个人空间 0
    技术积分 456 (5060)
    社区积分 0 (107807)
    注册日期 2003-9-16
    论坛徽章:1
    在线时间     
          

    发表于 2004-6-25 16:19 
    你那么看不行,用我的语句试试。
    并不是说更改后的paddr能在x$ksupr中找到,而是从x$ksupr中能看出来有些prcocess没有username,没有status,再根据其他的字段一起判定改process已经被kill掉。


    __________________
    闲中好,尘务不萦心。坐对当窗木,看移三面阴。
    只看该作者    顶部
    离线 hwlbigboy
    初级会员



    精华贴数 1
    个人空间 0
    技术积分 183 (11846)
    社区积分 0 (66371)
    注册日期 2002-4-4
    论坛徽章:0
          
          

    发表于 2004-6-25 16:35 
    我还是不明白
    那到底怎么判断哪个ADDR是对应SESSION被KILLED的Process呢?

    下面是我执行的结果
    SELECT s.username,s.status,
    x.ADDR,x.KSLLAPSC,x.KSLLAPSN,x.KSLLASPO,x.KSLLID1R,x.KSLLRTYP,
    decode(bitand(x.ksuprflg,2),0,null,1)
    FROM x$ksupr x,v$session s
    WHERE s.paddr(+)=x.addr
    and bitand(ksspaflg,1)!=0

    1                        0269C854        0        0                0               
    2                ACTIVE        0269CB7C        2        28        11336        0                1
    3                ACTIVE        0269CEA4        8        32        10304        0                1
    4                ACTIVE        0269D1CC        86        4        11388        0                1
    5                ACTIVE        0269D4F4        7        14        11336        0                1
    6                ACTIVE        0269D81C        11        13        11136        0                1
    7                ACTIVE        0269DB44        1        10        10516        0                1
    8        MES1        INACTIVE        0269DE6C        8        13        11136        85        EV       
    9                        0269E194        0        0                0               
    10        MES1        INACTIVE        0269E4BC        0        0                0               
    按照你的判断哪一行是代表被KILL的Session呢??

    谢谢!


    只看该作者    顶部
    相关内容


    CopyRight 1999-2006 itpub.net All Right Reserved.
    北京皓辰网域网络信息技术有限公司. 版权所有
    E-mail:Webmaster@itpub.net
    网站律师 隐私政策 知识产权声明
    京ICP证:060528号 联系我们