oracle session process 区别,Oracle session 和 process的区别:

session 和 process的区别:

连接connects,会话sessions和进程pocesses的关系 每个sql login称为一个连接(connection),而每个连接,可以产生一个或多个会话,如果数据库运行在专用服务器方式, 一个会话对应一个服务器进程(process),如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。 session 和 process的关系,tom在他的书里写的很清楚了 一个process可以有0个,1个或者多个session 一个session也可以存在这个或者那个process中 oracle中session跟process的研究 使用方法:

首先看看v$session跟v$process中主要的字段属性:

v$session(sid,serial#,paddr,username,status,machine,terminal,sql_hash_value,sql_address,,,)

v$process(addr,spid,,,)

可看到v$session中的paddr跟v$process中的addr对应,也即会话session在数据库主机上对应进程的进程地址.

这里我们要先定位该session正在执行的sql语句,此时我们可以查询如下的语句: select sql_text from v$sqltext_with_newlines where (hash_value,address) in (select sql_hash_value,sql_address from v$session where sid=&sid) order by address,piece;

若需手工kill一个session,可采用"alter system kill session 'sid,serial#' immediate",此时session的状态会标记为killed,该session对应进程地址指向相同的虚拟地址,见如下的查询:

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

SID SERIAL# PADDR STATUS ---------- ---------- ---------------- -------- 234 14409 C0000000B2BADB28 INACTIVE 245 14374 C0000000B2BAB748 INACTIVE

SQL> alter system kill session '234,14409' immediate;

System altered

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

SID SERIAL# PADDR STATUS ---------- ---------- ---------------- -------- 234 14409 C0000000B2C750B8 KILLED 245 14374 C0000000B2BAB748 INACTIVE

SQL> alter system kill session '245,14374' immediate;

System altered

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

SID SERIAL# PADDR STATUS ---------- ---------- ---------------- -------- 234 14409 C0000000B2C750B8 KILLED 245 14374 C0000000B2C750B8 KILLED

SQL>

我们知道很多时候被kill掉的session并不能马上释放资源,我们需要从os上kill掉对应的进程,但由于session的paddr被修改为虚拟地址了,导致无法关联v$process,找不到进程的spid进程号.此时我们可以执行如下查询:

SQL> SELECT s.username,s.status, 2 x.ADDR,x.KSLLAPSC,x.KSLLAPSN,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 7 and s.status is null;

USERNAME STATUS ADDR KSLLAPSC KSLLAPSN KSLLASPO KSLLID1R KSLLRTYP DECODE(BITAND(X.KSUPRFLG,2),0, ------------------------------ -------- ---------------- ---------- ---------- ------------ ---------- -------- ------------------------------ C0000000B2B58D08 0 0 0  C0000000B2BA4688 298 9 4669 0  C0000000B2BAB748 1 16 4675 197 EV  C0000000B2BADB28 1 16 4675 197 EV

SQL>

或查询如下的语句:

SQL> select p.addr from v$process p where pid <> 1 2 minus 3 select s.paddr from v$session s;

ADDR ---------------- C0000000B2BA4688 C0000000B2BAB748 C0000000B2BADB28

SQL>

从查询结果中可发现被kill掉的session对应的进程地址.然后通过进程地址来查询对应的进程号,见如下的查询:

SQL> select spid from v$process where addr in ('C0000000B2BAB748','C0000000B2BADB28');

SPID ------------ 13013 13015

最后在操作系统上执行"kill -9 13013"和"kill -9 13015"即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值