分类
Oracle数据库中Kill session的研究‖
法结构为:
| alter system kill se | ssion 'sid,serial#' ; |
| 被kill掉的session,状 程. | 态会被标记为killed,Oracle会 | 在该用户下一次touch时清除该进 |
| 我们发现当一个session被kill掉以 被kill,那么多个session的paddr都被更 | 后,该session的paddr被修改,如果有多个session 改为相同的进程地址: |
| SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null; |
| SADDR SID SERIAL# P | ADDR USERNAME STATUS |
| -------- ---------- - | ---------- -------- -------- | ---------------------- ------- |
| 542E0E6C 11 314 5 E | 42B70E8 EYGLE INACTIV |
| 542E5044 18 | 662 542B6D38 SYS | ACTIVE |
| SQL> alter system kill session '11,314'; |
| System altered. |
| SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null; |
| SADDR SID | SERIAL# PADDR USERNAM | E STATUS |
| -------- ---------- - | ---------- -------- -------- | ---------------------- ------- |
| 542E0E6C 11 314 5 | 42D6BD4 EYGLE KILLED |
| 542E5044 18 662 5 | 42B6D38 SYS ACTIVE |
| SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null; |
| SADDR SID | SERIAL# PADDR USERNAM | E STATUS |
| -------- ---------- - | ---------- -------- -------- | ---------------------- ------- |
| 542E0E6C 11 314 5 | 42D6BD4 EYGLE KILLED |
| 542E2AA4 14 INACTIVE | 397 542B7498 EQSP | |
| 542E5044 18 | 662 542B6D38 SYS | ACTIVE |
| SQL> alter system kill session '14,397'; |
| System altered. |
| SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null; |
| SADDR SID SERIAL# P | ADDR USERNAME STATUS |
| -------- ---------- - | ---------- -------- -------- | ---------------------- ------- |
| 542E0E6C 11 314 5 | 42D6BD4 EYGLE KILLED |
| 542E2AA4 14 D | 397 542D6BD4 EQSP | KILLE |
| 542E5044 18 | 662 542B6D38 SYS | ACTIVE |
| 在这种情况下,很多时候,资源是无 这些进程. | 法释放的,我们需要查询spid,在操作系统级来kill |
| 但是由于此时v$sessio 得spid | n.paddr已经改变,我们无法通 | 过v$session和v$process关联来获 |
| 那还可以怎么办呢? |
| 我们来看一下下面的查询: |
| SQL> SELECT s.username,s.status, |
| 2 x.ADDR,x.KSLLAPSC,x.KSLLAPS | N,x.KSLLASPO,x.KSLLID1R,x.KSLLRTYP, |
| 3 decode(bitand (x.ksuprflg,2 | ),0,null,1) |
| 4 FROM x$ksupr x,v$session s |
| 5 WHERE s.paddr(+)=x.addr |
| 6 and bitand(ksspaflg,1)!=0; |
| USERNAME KSLLASPO KSLLID1R | STATUS ADDR KS D | KSLLAPSC KSLLAPSN |
| -------------------- ------------ ---------- | ---------- -------- -------- -- - | ---------- ---------- |
| 0 | 542B44A8 0 0 |
| A 0 1 | CTIVE 542B4858 1 14 24069 |
| 0 1 | ACTIVE 542B4C08 | 26 16 15901 |
| 0 1 | ACTIVE 542B4FB8 | 7 46 24083 |
| 0 1 | ACTIVE 542B5368 | 12 15 24081 |
| 0 1 | ACTIVE 542B5718 | 15 46 24083 |
| 0 1 | ACTIVE 542B5AC8 | 79 4 15923 |
| A 0 1 | CTIVE 542B5E78 50 16 24085 |
| 0 1 | ACTIVE 542B6228 | 754 15 24081 |
| 0 1 | ACTIVE 542B65D8 | 1 14 24069 |
| A 0 1 | CTIVE 542B6988 2 30 14571 |
| USERNAME KSLLASPO KSLLID1R | STATUS ADDR KS D | KSLLAPSC KSLLAPSN |
| ------------------------------ - ------------ ---------- -- - | ------- -------- ---------- ---------- |
| SYS 0 | ACTIVE 542B6D3 | 8 2 8 24071 |
| 195 EV | 542B70E8 | 1 15 24081 |
| 195 EV | 542B7498 1 15 24081 |
| SYS 0 | INACTIVE 542B784 | 8 0 0 |
| SYS I 195 EV | NACTIVE 542B7BF8 1 15 24081 |
| 16 rows selected. |
| 简化一点,其实就是如下概念: |
| SQL> select p.addr from v$process p where pid < > 1 2 minus 3 select s.paddr from v$session s; |
| ADDR |
| -------- |
| 542B70E8 |
| 542B7498 |
| 现在我们获得了进程地址,就可以在 orakill在系统级来杀掉这些进程. | v$process中找到spid,然后可以使用Kill或者 |
| 当在Oracle中kill ses 虚拟地址. | sion以后, Oracle只是简单的把 | 相关session的paddr 指向同一个 |
| 此时v$process和v$session失去关联,进程就此中断. |
| 然后Oracle就等待PMON去清除这些Se 退出需要花费很长的时间. | ssion.所以通常等待一个被标记为Killed的Session |
| 如果此时被Kill的process,重新尝 process退出,此时Oracle会立即启动PMO | 试执行任务,那么马上会收到进程中断的提示, N来清除该session.这被作为一次异常中断处理. |