我们知道 在Oracle数据库中 可以通过kill session的方式来终止一个进程 其基本语法结构为:alter system kill session sid serial# 被kill掉的session 状态会被标记为killed Oracle会在该用户下一次touch时清除该进程 我们发现当一个session被kill掉以后 该session的paddr被修改 如果有多个session被kill 那么多个session的paddr都被更改为相同的进程地址:SQL>select saddr sid serial# paddr username status from v$session where username is not nullSADDR SIDSERIAL# PADDRUSERNAME STATUS E E C B E EYGLE INACTIVE E B D SYSACTIVESQL>alter system kill session System altered SQL>select saddr sid serial# paddr username status from v$session where username is not nullSADDR SIDSERIAL# PADDRUSERNAME STATUS E E C D BD EYGLE KILLED E B D SYSACTIVESQL>select saddr sid serial# paddr username status from v$session where username is not nullSADDR SIDSERIAL# PADDRUSERNAME STATUS E E C D BD EYGLE KILLED E AA B EQSP INACTIVE E B D SYSACTIVESQL>alter system kill session System altered SQL>select saddr sid serial# paddr username status from v$session where username is not nullSADDR SIDSERIAL# PADDRUSERNAME STATUS E E C D BD EYGLE KILLED E AA D BD EQSP KILLED E B D SYSACTIVE在这种情况下 很多时候 资源是无法释放的 我们需要查询spid 在 *** 作系统级来kill这些进程 但是由于此时v$session paddr已经改变 我们无法通过v$session和v$process关联来获得spid那还可以怎么办呢?我们来看一下下面的查询: SQL>SELECT s username s status x ADDR x KSLLAPSC x KSLLAPSN x KSLLASPO x KSLLID R x KSLLRTYP decode(bitand (x ksuprflg ) null ) FROM x$ksupr x v$session s WHERE s paddr(+)=x addr and bitand(ksspaflg )!= USERNAME STATUS ADDR KSLLAPSC KSLLAPSN KSLLASPO KSLLID R KS D B A ACTIVE B ACTIVE B C ACTIVE B FB ACTIVE B ACTIVE B ACTIVE B AC ACTIVE B E ACTIVE B ACTIVE B D ACTIVE B USERNAME STATUS ADDR KSLLAPSC KSLLAPSN KSLLASPO KSLLID R KS D SYSACTIVE B D B E EV B EVSYSINACTIVE B SYSINACTIVE B BF EV rows selected 简化一点 其实就是如下概念:SQL>select p addr from v$process p where pid <>minus select s paddr from v$session sADDR B E B 现在我们获得了进程地址 就可以在v$process中找到spid 然后可以使用Kill或者orakill在系统级来杀掉这些进程 当在Oracle中kill session以后 Oracle只是简单的把相关session的paddr 指向同一个虚拟地址 此时v$process和v$session失去关联 进程就此中断 然后Oracle就等待PMON去清除这些Session 所以通常等待一个被标记为Killed的Session退出需要花费很长的时间 如果此时被Kill的process 重新尝试执行任务 那么马上会收到进程中断的提示 process退出 此时Oracle会立即启动PMON来清除该session 这被作为一次异常中断处理 lishixinzhi/Article/program/Oracle/201311/11195
在9i参考手册中只查到BITAND函数,没有bitor。
BITOR好像要自己弄,网上资料:
BITOR(x,y) = (x + y) - BITAND(x, y)
BITXOR(x,y) = BITOR(x,y) - BITAND(x,y) = (x + y) - BITAND(x, y) * 2
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)