v$session描述的对象是一个会话。
v$session描述的对象是一个当前存在的会话(该会话不是包括当前连接到数据库的会话,这只是数据库前台服务器进程的会话,还有数据库后台进程的会话,它是没有连接的)。
下面对v$session里的字段进行分组说明:
用于标识确定唯一的一个会话:SID:SERIAL#或是SADDR
SADDR: session address
或是
SID: session identifier,常用于连接其它列。
SERIAL#: sid 会重用,但是同一个sid被重用时,serial#会增加,不会重复。
注释:
AUDSID: audit session id。
可以通过audsid查询当前session的sid。select sid from v$session where audsid=userenv('sessionid');
所以,SID和AUDSID两者值是一一对应的。
AUDSID用途不一样跟SID。
一个会话的与自身相关的属性:
COMMAND: session正在执行的SQL Id。1代表create table,3代表select。
TADDR: 当前的transaction address。可以用来关联v$transaction的addr字段。
STATUS: 用来判断session状态。Active:正执行SQL语句。Inactive:等待操作。Killed:被标注为删除。
SERVER: server type (dedicated or shared)
Server type:
-
DEDICATED
-
SHARED
-
PSEUDO (?)
-
POOLED (?)
-
NONE
TYPE: session type (background or user)
USER#: session's user id。等于dba_users中的user_id。Oracle内部进程(即后台进程)的user#为0。
USERNAME: session's username,即表示(服务端数据库里的)哪个数据库用户(而非服务端的操作系统的用户)在使用该会话。等于dba_users中的username。Oracle内部进程(即后台进程)的username为空。
SCHEMA#: schema user id。Oracle内部进程的schema#为0。
SCHEMANAME: schema username。Oracle内部进程的schemaname为sys。(??不是为空?对应于username?)
一个会话的所在的进程:
PADDR: process address(Address of the process that owns the session),关联v$process的addr字段,可以通过这个字段查处当前session对应操作系统的那个进程的id。
TYPE字段为background时,PROGRAM为服务端数据库里的oracle后台进程;TYPE字段为user时,PROGRAM为客户端(用于连接到服务端数据库的)应用程序(,例如,sqlplus.exe)。而以下除了PROGRAM外的字段都是用于描述PROGRAM的相关属性的:
PROGRAM: 客户端应用程序的程序名。这里说明一点,我们通过客户端连接到远程的服务端后,再在比如客户端的sqlplus窗口上使用v$session来查看的话,则v$session视图中PROGRAM字段里的值为比如ORACLE.EXE (PMON)这样子的是表示服务端的实例的后台进程们,那么此时v$session视图中PROCESS字段里的值表示为这些服务端的进程在服务端操作系统里的操作系统级别的进程ID号;而当v$session视图中PROGRAM字段里的值为比如sqlplus.exe或是sqldeveloperw.exe这样子的时才是表示这些进程是来自客户端的进程(即一个应用程序(静)的复制来运行(动))的程序名,那么此时v$session视图中PROCESS字段里的值才表示为这些来自客户端的进程在客户端操作系统里的操作系统级别的进程ID号;
总之,TYPE字段为background时,PROGRAM为服务端的oracle后台进程;TYPE字段为user时,PROGRAM为客户端的用户进程。
OSUSER: 客户端操作系统用户名。
PROCESS: 客户端应用程序在其操作系统级别上的process id。
MACHINE: 客户端machine name。(表示ip地址?) 即一般是客户端所在主机的主机名?
TERMINAL: 客户端执行的terminal name。即一般是客户端所在主机的主机名。与MACHINE区别,不清楚。????
附加:
当MACHINE=计算机名时,TERMINAL=unkown;当MACHINE=工作组/计算机名时,TERMINAL=计算机名。
注释:
类似ORACLE.EXE (PMON)这些实例的后台进程是没有和客户端存在连接的。
如果v$session视图中PROGRAM字段里的值所表示的一个进程是来自服务端的,则v$session视图中:
OSUSER: 服务端操作系统用户名。
PROCESS: 服务端在操作系统级别上的process id。
MACHINE: 服务端machine name。
TERMINAL: 服务端执行的terminal name。表示服务端所在主机的主机名。
以上几个字段表示的是服务端的操作系统上的意义。
如果v$session视图中PROGRAM字段里的值所表示的一个进程是来自客户端的,则以上几个字段表示的是客户端的操作系统上的意义。
在会话中执行的SQL语句的相关信息:
COMMAND: session正在执行的SQL Id。1代表create table,3代表select。
SQL_ADDRESS, SQL_HASH_VALUE, SQL_ID, SQL_CHILD_NUMBER: session正在执行的sql statement,和v$sql中的address, hash_value, sql_id, child_number相对应。
PREV_SQL_ADDR, PREV_HASH_VALUE, PREV_SQL_ID, PREV_CHILD_NUMBER: 上一次执行的sql statement。
用于SQL语句跟踪的会话属性:
MODULE, MODULE_HASH, ACTION, ACTION_HASH, CLIENT_INFO: 应用通过DBMS_APPLICATION_INFO设置的一些信息。
FIXED_TABLE_SEQUENCE: 当session完成一个user call后就会增加的一个数值,也就是说,如果session inactive,它就不会增加。因此可以根据此字段的值变化来监控某个时间点以来的session的性能情况。例如,一个小时以前,某个session的FIXED_TABLE_SEQUENCE是10000,而现在是20000,则表明一个小时内其user call比较频繁,可以重点关注此session的performance statistics。
LOCKWAIT: 可以通过这个字段查询出当前正在等待的锁的相关信息。sid & lockwait与v$lock中的sid & kaddr相对应。
ROW_WAIT_OBJ#: 被锁定行所在table的object_id。和dba_objects中的object_id关联可以得到被锁定的table name。
ROW_WAIT_FILE#: 被锁定行所在的datafile id。和v$datafile中的file#关联可以得到datafile name。
ROW_WAIT_BLOCK#: Identifier for the block containing the row specified in ROW_WAIT_ROW#
ROW_WAIT_ROW#: session当前正在等待的被锁定的行。
LOGON_TIME: session logon time
说明:
1、V$SESSION中AUDSID字段的产生原理及含义
Oracle的V$SESSION视图中有一列AUDSID,一直不知其含义,在MetaLink上看到一篇文章How Sessions get Their AUDSID Identifier [ID 122230.1],详细讲述了AUDSID的产生原理和含义,大致内容总结如下:
- AUDSID由SYS.AUDSES$这个SEQUENCE产生,当有一个新的会话产生,其AUDSID的值即为这个SEQUENCE的NEXTVAL。
- Oracle 10g之前,在会话为’CONNECT INTERNAL’ 或为oracle进程是Oracle后台进程这两种情况的时候,AUDSID的值为0。’CONNECT INTERNAL’即指以AS SYSDBA和AS SYSOPER连接的会话。
- 10g及之后,AUDSID在’CONNECT INTERNAL’ 时为UB4MAX(4294967295), 在Oracle后台进程连接时为0。具体如下:
If AUDSID=0, then就是 Oracle后台进程产生的一个会话。
If AUDSID=4294967295, then说明是sys用户产生的一个会话。If 0<AUDSID<4294967295,then说明是普通用户产生的一个会话。
注:UB4=UNSIGNED INT,取值范围为0-(2^32-1=4294967295)
由此可以看出,AUDSID与V$SESSION视图中的SID不同的是,AUDSID主要是用于区分Oracle中的一般用户连接和Internal/后台连接这两类的。所以对于唯一的确定一个应用用户(即一般用户)会话来说,除了使用SID和SERIAL的组合,还可以使用AUDSID,来进行区别。
注释:
AUDSID由SYS.AUDSES$这个SEQUENCE(即序列,这种数据库对象)产生, 由desc SYS.AUDSES$提示证明他是个SEQUENCE(即序列,这种数据库对象)。
2、看到一个会话,我们首先要区分该会话的类型是什么,即查看v$session视图时首先要看TYPE字段,因为v$session视图中字段PROGRAM、PROCESS、OSUSER、MACHINE、TERMINAL在TYPE字段为不同值时有不同意义:
当TYPE字段为background时,以上几个字段表示的是服务端的操作系统上的意义;
当TYPE字段为user时,以上几个字段表示的是客户端的操作系统上的意义。
3、select type,program from v$sessionwheretype =‘background’;或是select audsid,program from v$session whereaudsid=0;所得结果例如:
SQL>select type,program from v$session where type =‘background’;
type program
------- -------------
background oracle.exe(LGWR)
或者
SQL>select audsid,program from v$session where audsid=0;
audsid program
------- -------------
0 oracle.exe(LGWR)
由上述语句有结果,可以说明一个后台进程产生是,至少会(伴随)自动启动一个属于自己的会话。
4、V$SESSION中 process字段的值为XX:XX形式时的解释
假设我们现在已知的条件为:sid=424,paddr=070000012A6DC150。
那么,
SQL> select spid from v$process where addr='070000012A6DC150';
SPID
------------
1318950
这里的1318950就是AIX(server端)上fork出来的进程号。
/home/guest/dxhibm>ps -ef | grep 1318950
oracle 1318950 1 0 10:00:05 - 0:00 oracleora92 (LOCAL=NO)
dxhibm 3711144 1138788 0 10:02:48 pts/1 0:00 grep 1318950
SQL> select process from v$session where sid=424 ;
PROCESS
------------
2856:3260
这个就是在windows(client端)对应的sqlplus这个进程的进程号和线程号。
明白了,WINDWOW和PLSQL DEVELOPE等有线程的概念,所以把线程写出来,如果是UNIX下,没有线程的概念,就没有这个XX:XX的东东了
注释:
实验环境还是,我在一个windows操作系统的主机上,用sqlplus去远程连接到AIX服务器上的oracle数据库系统。接着,我在sqlplus窗口上,执行 select s.type,s.process,p.spid from v$session s,v$process p where s.paddr=p.addr;语句,结果发现:
type为background时,s.process值和p.spid值相同,因为此时两者都是表示同一个进程(即位于服务端的oracle后台进程)的进程号;
p.spidp.spidp.spidp.spid
type为user时,s.process值和p.spid值不一样,因为此时前者表示用户进程(位于客户端)的进程号,后者依然表示同一个进程(位于服务端)的进程号表示同一个进程(位于服务端)的进程号表示服务器进程(也即oracle前台进程,位于服务端)的进程号。
参考:http://www.itpub.NET/thread-736652-2-1.html
5、type为background时,字段OSUSER一般为SYSTEM(位于服务端的操作系统的操作系统用户)。由此看出,在window下,oracle实例的后台进程,都是在该用户下运行的,而不是我们登陆该window操作系统的用户。
关于window下的SYSTEM用户,参考:
《WINDOWS下system用户至高无上的权限》
====================================================================================================================================
v$process
前言:v$process所查看的进程都是服务端里(oracle系统)的进程。
ADDR: process address。可以和v$session的paddr字段关联。
PID: Oracle进程identifier,即表示该进程在其所在的oracle数据库系统里的进程ID号。
SERIAL#:: process serial number。类似于v$session中的SERIAL#是配合SID的一样,这里的SERIAL#是配合PID的,SERIAL#不是一个独立字段,即pid 会重用,但是同一个pid被重用时,serial#会增加,不会重复。
SPID: 操作系统进程identifier,即表示该进程在其所在的操作系统里的进程ID号。
PROGRAM: 进程正在执行的程序(e.g., ORACLE.EXE (ARC0)),和v$session中的program类似。它表示的是该进程在操作系统中的名称。
PNAME: 它表示的是该进程在oracle数据库系统中的名称。
BACKGROUND: 1代表oracle background process,null代表normal process。
TERMINAL: 操作系统terminal identifier(e.g., computer name)。表示该进程所在操作系统的主机名。
USERNAME: 操作系统进程的用户名。并非Oracle用户名。它表示的是该进程所在的属于操作系统的用户名。如,在window操作系统下,PROGRAM为 ORACLE.EXE (LGWR)的进程,是属于操作系统用户system的。
注释:v$process中的username字段和v$session中的osuser字段一样表示操作系统的用户,而v$session中的username字段表示oracle系统的用户。
=====================================================================================================
附加:
1、v$process
这个视图提供的信息,都是oracle服务进程的信息,没有客户端程序相关的信息
服务进程分两类,一是后台的,一是dedicate/shared server
pid, serial# 这是oracle分配的PID
spid 这才是操作系统的pid
program 这是服务进程对应的操作系统进程名
v$session:
这个视图主要提供的是一个数据库connect的信息,
主要是client端的信息,比如以下字段:
machine 在哪台机器上
terminal 使用什么终端
osuser 操作系统用户是谁
program 通过什么客户端程序,比如TOAD
process 操作系统分配给TOAD的进程号
logon_time 在什么时间
username 以什么oracle的帐号登录
command 执行了什么类型的SQL命令
sql_hash_value SQL语句信息
有一些是server端的信息:
paddr 即v$process中的server进程的addr
server 服务器是dedicate/shared
还有其它一些信息,可以理解为是client/server共享的信息,主要是针对这个session而言的
2、
至于sid和audsid的区别,自己也没太搞明白,网上摘了一段:
--from asktom
the audsid column is populated via a sequence and for normal
sessions is the same as "userenv('sessionid')" -- but for some background sessions -- it is not set
(it comes back as "0" making the view not work.
So, I'd just ignore "audsid" for now and use SID.
3、关于Oracle10g里v$session.audsid字段的解释
In 10g we make a further distinction for SYS sessions:If AUDSID=0, then it is an internally generated SYS session.
If AUDSID=UB4MAX(4294967295), then it is a direct SYS session. 比如Dataguard里备库的连接进程.
refer: How Sessions get Their AUDSID Identifier [ID 122230.1]