针对于这两个视图中的部分信息,其实一直都搞不明白,oracle的contents中描述的也不是非常详细,在仔细查阅了部分资料,并咨询了同事后,大体掌握了一些内容,v$session.process是连接数据库的客户端程序的进程号,而v$process.spid是Oracle process的进程号(这是属于操作系统级的sid号),比如你在另外一台机器用sqlplus连接数据库,你用ps -ef|grep sqlplus看到的进程号就是v$session.process,下面详细分析这两个视图。

v$process:

这个视图提供的信息,都是oracle服务进程的信息,没有客户端程序相关的信息

pid, serial# 这是oracle分配的PID

spid 这才是操作系统的pid

v$session:

这个视图主要提供的是一个数据库connect的信息,可以提供客户端的连接信息,比如以下字段:

machine 在哪台机器上

terminal 使用什么终端

osuser 操作系统用户是谁

program 通过什么客户端程序

process 操作系统分配的客户端进程号

logon_time 在什么时间

username 以什么oracle的帐号登录

command 执行了什么类型的SQL命令

sql_hash_value SQL语句信息

 

有一些是server端的信息:

paddr 即v$process中的server进程的addr,而通过这两个字段,我们又可以将这两张表进行关联。

 

而我们在终止进程的时候,更多的是选择终止v$process中的spid

一下通过一个之前的实验说明,

如下为实验过程(以之前一篇文章的TM锁为例:):

实验环境不在多述:

TM锁信息:

SQL> select s.sid,s.serial#,s.username,s.logon_time from v$session s,v$locked_object l where s.sid=l.session_id;

       SID    SERIAL# USERNAME                       LOGON_TIM

———- ———- —————————— ———

       130      35326 SYS                            11-OCT-11

       148      48202 SYS                            11-OCT-11

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where sid in (130,148);

       SID TY        ID1        ID2      LMODE    REQUEST      BLOCK

———- — ———- ———- ———- ———- ———-

       148 TX     589842      12778          0          4          0

       130 TM      59577          0          3          0          2

       148 TM      59577          0          3          0          2

       130 TX     589842      12778          6          0          1

       148 TX      65570      12794          6          0          2

我们可以针对产生的锁信息找到具体的客户端连接的信息

SQL> select process from v$session where sid=130;

PROCESS

————

19274

通过process为19274我们可以去查询对应客户端信息:

SQL> !ps -ef | grep 19274

oracle   19274 19113  0 09:20 pts/1    00:00:00 sqlplus            

oracle   19275 19274  0 09:20 ?        00:00:00 oracledd1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

oracle   28682  8848  0 10:34 pts/2    00:00:00 /bin/bash -c ps -ef | grep 19274

我们可以看到进程号为19274对应为sqlplus客户端

 

下面我们来看对应的v$process中得信息:

SQL> select spid from v$process where addr=(select paddr from v$session where sid=130);

SPID

————

19275

SQL> !ps -ef | grep 19275

oracle   19275 19274  0 09:20 ?        00:00:00 oracledd1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

oracle   30022  8848  0 10:37 pts/2    00:00:00 /bin/bash -c ps -ef | grep 19275

oracle   30024 30022  0 10:37 pts/2    00:00:00 grep 19275

我们可以看到19275进程号对应于会话的进程号。

从上面所看,v$process的spid和v$session中的process还是有着本质的区别。实验中巧合的发现在TM锁对应下的v$session中的spid和v$session中的process,两者均是相差了1。不清楚是巧合还是有着具体算法支持,留待以后研究。




Related posts

coded by nessus
分享:  DeliciousGReader鲜果豆瓣CSDN网摘
Trackback

only 1 comment untill now

  1. conveniences@shelby.congresses” rel=”nofollow”>.…

    thanks!…

Add your comment now

无觅相关文章插件