Oracle的session和process的区别与分析


session 和 process的区别:
连接connects,会话sessions和进程pocesses的关系
每个 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正在执行的语句,此时我们可以查询如下的语句:

select sql_text from v$sqltext_with_newlines

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

> select sid,serial#,paddr,status from v$session where username='SHIYIHAI';
SID SERIAL# PADDR STATUS
———- ———- —————- ——–
234 14409 C0000000B2BADB28 INACTIVE
245 14374 C0000000B2BAB748 INACTIVE
> alter system kill session ‘234,14409' immediate;
System altered
> 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,
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
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

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《Oracle的session和process的区别与分析
本文地址:https://www.zhiletu.com/archives-468.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微