讲到Oracle的会话,就必须首先对V$SESSION这个视图中的每个列都非常熟悉,下面作者以表格的形式对这个视图中的重要列详细说明。
表 3-26 V$SESSION视图
列 |
数据类型 |
说明 |
ACTION |
VARCHAR2(32) |
包含当前执行活动的名称。 |
AUDSID |
NUMBER |
审计会话的ID,审查SESSION ID唯一性,通常也用于寻找并行查询模式,SQL如下: SELECT SID, OSUSER, USERNAME, MACHINE, PROCESS FROM V$SESSION WHERE AUDSID = USERENV('SESSIONID'); |
CLIENT_INFO |
VARCHAR2(64) |
由DBMS_APPLICATION_INFO.SET_CLIENT_INFO过程设置的信息。 |
COMMAND |
NUMBER |
正在执行的SQL语句的类型,有关值所代表的含义,请参阅V$SQLCOMMAND视图。 |
LAST_CALL_ET |
NUMBER |
用户最后一条语句执行完毕后到SYSDATE的时间,单位为秒。每次用户执行一个新的语句后,该字段复位为0,重新开始记数。可以通过该字段来获得一个连接用户最后一次操作数据库后的空闲时间。 |
LOCKWAIT |
VARCHAR2(8) |
等待锁的地址;如果没有,那么值为NULL。 |
LOGON_TIME |
DATE |
用户的登录时间。 |
MACHINE |
VARCHAR2(64) |
操作系统机器名。 |
MODULE |
VARCHAR2(48) |
包含当前正在执行的模块名。 |
OSUSER |
VARCHAR(15) |
操作系统用户名。 |
OWNERID |
NUMBER |
如果值为2147483644,那么此列的内容无效。否则此列包含拥有可移植会话的用户标符。对于利用并行从服务器的操作,将这个值解释为一个48字节的值。其低位两字节表示会话号,而高位字节表示查询协调程序的实例ID。 |
PADDR |
RAW(4) |
拥有这个会话的进程地址。 |
PDML_ENABLED |
VARCHAR2(3) |
此列已被PDML_STATUS所替代。 |
PDML_STATUS |
VARCHAR2(8) |
如果ENABLED,那么会话正处于PARALLEL DML启用方式。如果DISABLED,那么此会话不支持PARALLEL DML启用方式。如果FORCED,那么会话已经更改为强制PARALLEL DML。 |
PROCESS |
VARCHAR2(9) |
操作系统客户机进程ID。 |
PROGRAM |
VARCHAR(48) |
操作系统程序名。 |
ROW_WAIT_BLOCK# |
NUMBER |
包含ROW_WAIT_ROW#中指定的ROWID的数据文件的标识符。 |
ROW_WAIT_FILE# |
NUMBER |
包含ROW_WAIT_ROW#中指定的ROWID的数据文件的标识符。此列仅在会话当前正在等待其它事务处理提交并且ROW_WAIT_OBJ#不为-1时有效。 |
ROW_WAIT_OBJ# |
NUMBER |
包含ROW_WAIT_ROW#中指定的ROW#的表的对象ID。 |
ROW_WAIT_ROW# |
NUMBER |
被锁定的当前ROWID。此列仅在会话当前正在等待其它事务处理提交并且ROW_WAIT_OBJ#不为-1时有效。 |
SADDR |
RAW(4) |
会话地址,对应于V$TRANSACTION.SES_ADDR列。 |
SCHEMA# |
NUMBER |
模式用户标识符。 |
SCHEMANANME |
VARCHAR2(30) |
模式用户名。 |
SERIAL# |
NUMBER |
会话序列号。用来唯一地标识会话对象。如果该会话结束且其它会话以相同的会话ID开始,那么保证会话级的命令被应用到正确会话对象。 |
SERVER |
VARCHAR2(9) |
表示服务器类型:DEDICATED、SHARED、PSEUDO、POOLED、NONE。若显示的结果中有NONE或SHARED,则说明当前数据库启动了共享服务器模式。其中,状态为NONE的会话表示空闲的共享服务器连接,说明当前会话没有处理任务;若进程正在执行某些任务则会表现为SHARED状态。PSEUDO和“ALTER SYSTEM KILL SESSION sid,serial#;”相关,如果发出ALTER SYSTEM去终止一个会话,被标记为终止的SESSION在V$SEESSION的STATUS为KILLED,对应的SERVER值为PSEUDO。POOLED和Oracle 11g推出的驻留连接池(Database Resident Connection Pool)特性相关,驻留连接池提供了数据库层面上的连接池管理机制,为应对高并发、短会话前端应用进行有益的尝试,POOLED表示使用驻留连接池技术的连接。 |
SID |
NUMBER |
会话标识符。 |
SQL_ADDRESS |
RAW(4) |
与SQL_HASH_VALUE一起使用,标识当前正在执行的SQL语句。 |
SQL_HASH_VALUE |
NUMBER |
与SQL_ADDRESS一起使用,标识当前正在执行的SQL语句。 |
STATUS |
VARCHAR2(8) |
会话的状态: ACTIVE:当前正在执行SQL语句; INACTIVE:等待操作(即等待需要执行的SQL语句); KILLED:会话已经被删除; SNIPED:会话不活动,在客户机上等待。 |
TADDR |
VARCHAR2(8) |
事务处理状态对象的地址。 |
TERMINAL |
VARCHAR2(10) |
操作系统终端名。 |
TYPE |
VARCHAR2(10) |
会话类型。 |
USER# |
NUMBER |
Oracle用户标识符。 |
USERNAME |
VARCHAR(30) |
Oracle用户名。 |
CREATOR_ADDR |
RAW(8) |
对应V$PROCESS的ADDR列,若当前会话为KILLED状态的话,则可以使用该列来返回会话的地址。 |
EVENT |
VARCHAR2(64) |
等待事件的名称,若为空则表示ON CPU。 |
原文地址:Oracle 11g中v$session视图server列的含义 作者:hoegh
原文地址:v$session中LAST_CALL_ET参数的理解 作者:zhanglei_itput
在实际的数据库应用中,我们经常遇到这样一个问题,连接到Oracle数据库的用户在作了一次操作后,再也没有后续操作,但却长时间没有和数据库断开连接。最近在研究一个中间件到数据库中的长连接异常问题,查询到v$session中LAST_CALL_ET参数,觉得这个参数很有用,下面是自己的一点理解:
1. 参数定义
LOGON_TIME 是一个日期型(Date)字段,为用户登陆时间;
LAST_CALL_ET是一个数字型(Number)字段,其含义是用户最后一条语句执行完毕后到sysdate的时间,单位为秒。每次用户执行一个新的语句后,该字段复位为0,重新开始记数。我们可以通过该字段来获得一个连接用户最后一次操作数据库后的空闲时间。
针对这两个参数定义的测试:
SQL> conn system/oracle@devdb2;
已连接。
SQL> select ses.SID,ses.username,ses.machine,ses.program,ses.last_call_et,sql.hash_value,sql.sql_text
from v$session ses, v$sql sql
where ses.sql_hash_value = sql.hash_value(+)
and ses.PROGRAM = 'sqlplus.exe'
SID | USERNAME | MACHINE | PROGRAM | LAST_CALL_ET | HASH_VALUE | SQL_TEXT |
132 | SYSTEM | ZDC/BEILEI | sqlplus.exe | 3(登陆后的时间) |
SID | USERNAME | MACHINE | PROGRAM | LAST_CALL_ET | HASH_VALUE | SQL_TEXT |
132 | SYSTEM | ZDC/BEILEI | sqlplus.exe | 24(sql执行的时间) | 178228611 | select count(*) from user_object_size |
SID | USERNAME | MACHINE | PROGRAM | LAST_CALL_ET | HASH_VALUE | SQL_TEXT |
132 | SYSTEM | ZDC/BEILEI | sqlplus.exe | 1(sql执行完,参数复位0,重新开始计算到sysdate的时间/s) |
2. 识别超过一定空闲时间的连接
select username,logon_time,last_call_et,
to_char(sysdate-(last_call_et/(60*60*24)),'hh24:mi:ss') last_work_time
from v$session
where username is not null;
select ses.username,ses.machine,ses.program,ses.last_call_et,sql.hash_value,sql.sql_text
from v$session ses, v$sql sql
where ses.sql_hash_value = sql.hash_value
and ses.last_call_et > 600
and ses.type = 'USER'
SELECT s.username 用户名称, s.status 状态,s.machine 机器名称,
osuser 操作系统用户名称,spid UNIX进程号,
'kill -9 '||spid UNIX级断开连接,
'alter system kill session ' ||''''||s.sid||',
'||s.serial# || ''';' Oracle级断开连接,
TO_CHAR (logon_time, 'dd/mm/yyyy hh24:mi:ss') 登陆时间,
last_call_et 空闲时间秒,
TO_CHAR (TRUNC (last_call_et / 3600, 0))||' '||' HRS '||
TO_CHAR (TRUNC ((last_call_et - TRUNC(last_call_et / 3600, 0) * 3600) / 60, 0) ) ||' MINS' 空闲时间小时分钟,
module 模块
FROM v$session s, v$process p
WHERE TYPE = 'USER'
AND p.addr = s.paddr
AND status != 'KILLED'
-- AND SUBSTR (machine, 1, 19) NOT IN ('机器名')
AND last_call_et > 60 * 60 * 1-- 空闲时间超过1小时的连接
ORDER BY last_call_et desc;
select sid,username,status,
to_char(logon_time,'dd-mm-yy hh:mi:ss') "LOGON",
floor(last_call_et/3600)||':'||
floor(mod(last_call_et,3600)/60)||':'||
mod(mod(last_call_et,3600),60) "IDLE",
program
from v_$session
where type='USER'
order by last_call_et;
select s.process, s.sid, t.sql_text
from gv$session s, gv$sql t
where s.sql_address =t.address
and s.sql_hash_value =t.hash_value
--and s.program like '%JDBC%'
and s.last_call_et > 600
and s.status = 'ACTIVE'
个人认为还是查清楚这些异常连接的原因,不要轻易的kill掉这些会话。
参考文献:http://www.weste.net/2006/8-7/11352794038.html
Subject: | Removing Sessions in Killed Status on Unix | |||
Doc ID: | 274216.1 | Type: | BULLETIN | |
Modified Date : | 11-NOV-2008 | Status: | PUBLISHED |
V$SESSION是基础信息视图,用于找寻用户SID或SADDR。不过,它也有一些列会动态的变化,可用于检查用户。在该视图中,每一个连接到数据库实例中的session都拥有一条记录,包括用户session及后台进程如DBWR,LGWR,arcchiver等等。About Me
...............................................................................................................................
● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
● 本文在itpub(http://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新
● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/
● 本文博客园地址:http://www.cnblogs.com/lhrbest
● 本文pdf版及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/
● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/
● QQ群:230161599 微信群:私聊
● 联系我请加QQ好友(646634621),注明添加缘由
● 于 2017-07-01 09:00 ~ 2017-07-31 22:00 在魔都完成
● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
...............................................................................................................................
拿起手机使用微信客户端扫描下边的左边图片来关注小麦苗的微信公众号:xiaomaimiaolhr,扫描右边的二维码加入小麦苗的QQ群,学习最实用的数据库技术。
在实际的数据库应用中,我们经常遇到这样一个问题,连接到Oracle数据库的用户在作了一次操作后,再也没有后续操作,但却长时间没有和数据库断开连接。最近在研究一个中间件到数据库中的长连接异常问题,查询到v$session中LAST_CALL_ET参数,觉得这个参数很有用,下面是自己的一点理解:
1. 参数定义
LOGON_TIME 是一个日期型(Date)字段,为用户登陆时间;
LAST_CALL_ET是一个数字型(Number)字段,其含义是用户最后一条语句执行完毕后到sysdate的时间,单位为秒。每次用户执行一个新的语句后,该字段复位为0,重新开始记数。我们可以通过该字段来获得一个连接用户最后一次操作数据库后的空闲时间。
针对这两个参数定义的测试:
SQL> conn system/oracle@devdb2;
已连接。
SQL> select ses.SID,ses.username,ses.machine,ses.program,ses.last_call_et,sql.hash_value,sql.sql_text
from v$session ses, v$sql sql
where ses.sql_hash_value = sql.hash_value(+)
and ses.PROGRAM = 'sqlplus.exe'
SID | USERNAME | MACHINE | PROGRAM | LAST_CALL_ET | HASH_VALUE | SQL_TEXT |
132 | SYSTEM | ZDC/BEILEI | sqlplus.exe | 3(登陆后的时间) |
SID | USERNAME | MACHINE | PROGRAM | LAST_CALL_ET | HASH_VALUE | SQL_TEXT |
132 | SYSTEM | ZDC/BEILEI | sqlplus.exe | 24(sql执行的时间) | 178228611 | select count(*) from user_object_size |
SID | USERNAME | MACHINE | PROGRAM | LAST_CALL_ET | HASH_VALUE | SQL_TEXT |
132 | SYSTEM | ZDC/BEILEI | sqlplus.exe | 1(sql执行完,参数复位0,重新开始计算到sysdate的时间/s) |
2. 识别超过一定空闲时间的连接
select username,logon_time,last_call_et,
to_char(sysdate-(last_call_et/(60*60*24)),'hh24:mi:ss') last_work_time
from v$session
where username is not null;
select ses.username,ses.machine,ses.program,ses.last_call_et,sql.hash_value,sql.sql_text
from v$session ses, v$sql sql
where ses.sql_hash_value = sql.hash_value
and ses.last_call_et > 600
and ses.type = 'USER'
SELECT s.username 用户名称, s.status 状态,s.machine 机器名称,
osuser 操作系统用户名称,spid UNIX进程号,
'kill -9 '||spid UNIX级断开连接,
'alter system kill session ' ||''''||s.sid||',
'||s.serial# || ''';' Oracle级断开连接,
TO_CHAR (logon_time, 'dd/mm/yyyy hh24:mi:ss') 登陆时间,
last_call_et 空闲时间秒,
TO_CHAR (TRUNC (last_call_et / 3600, 0))||' '||' HRS '||
TO_CHAR (TRUNC ((last_call_et - TRUNC(last_call_et / 3600, 0) * 3600) / 60, 0) ) ||' MINS' 空闲时间小时分钟,
module 模块
FROM v$session s, v$process p
WHERE TYPE = 'USER'
AND p.addr = s.paddr
AND status != 'KILLED'
-- AND SUBSTR (machine, 1, 19) NOT IN ('机器名')
AND last_call_et > 60 * 60 * 1-- 空闲时间超过1小时的连接
ORDER BY last_call_et desc;
select sid,username,status,
to_char(logon_time,'dd-mm-yy hh:mi:ss') "LOGON",
floor(last_call_et/3600)||':'||
floor(mod(last_call_et,3600)/60)||':'||
mod(mod(last_call_et,3600),60) "IDLE",
program
from v_$session
where type='USER'
order by last_call_et;
select s.process, s.sid, t.sql_text
from gv$session s, gv$sql t
where s.sql_address =t.address
and s.sql_hash_value =t.hash_value
--and s.program like '%JDBC%'
and s.last_call_et > 600
and s.status = 'ACTIVE'
个人认为还是查清楚这些异常连接的原因,不要轻易的kill掉这些会话。
参考文献:http://www.weste.net/2006/8-7/11352794038.html
Subject: | Removing Sessions in Killed Status on Unix | |||
Doc ID: | 274216.1 | Type: | BULLETIN | |
Modified Date : | 11-NOV-2008 | Status: | PUBLISHED |