认识一下oracle中session、connection、process三者间的关系

一、connection

connection:就是从客户端到ORACLE实例的一条物理路径。他实际上是和session描述的是同一件事,只是描述的层次不一样,当创建了session,同时也会创建connection。connection可以在网络上建立,或者在本机通过IPC机制建立。通常会在客户端进程与一个专用服务器或一个调度器之间建立连接。

二、session

session:在计算机专业术语中,Session是指一个客户端用户与服务器系统间进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。通俗来讲,会话(Session) 是通信双方从开始通信到通信结束期间的一个上下文(Context)。这个上下文是一段位于服务器端的内存:记录了本次连接的客户端机器、通过哪个应用程序、哪个用户登录等信息。

会话(Session) 是和连接(Connection)是同时建立的,两者是对同一件事情不同层次的描述。简单讲,连接(Connection)是物理上的客户端同服务器的通信链路,会话(Session)是逻辑上的用户同服务器的通信交互

三、process

process:是操作系统层面的概念。在专有服务模式下,一个session对应一个process。

四、用户进程和会话间的关系(专有服务模式下,二者是一一对应的)

4.1、无连接、无会话,只有用户进程:sqlplus  /nolog  ---> 只有用户进程,表示没有人登录,只是打开了sqlplus工具          

# ps -elf |grep oracle<SID> |grep -v grep |wc -l               统计服务进程有多少个 (wc -l 做一个统计)

4.2、单个连接,单个会话,单个服务进程

$ sqlplus scott/tiger

4.3、无连接,无会话,单个服务进程 (异常断开,资源未释放)

4.4、单连接(物理连接),多会话,使用一个服务进程   在会话中开启autotrace功能

 

五、关于session和process两个视图

V$SESSION 显示每个当前会话的会话信息。

数据类型描述
SADDRRAW(4 | 8)会话地址
SIDNUMBER会话标识符
SERIAL#NUMBER会话序列号。用于唯一标识会话的对象。如果会话结束且另一个会话以相同的会话ID开始,则保证会话级命令应用于正确的会话对象。
AUDSIDNUMBER审核会话ID
PADDRRAW(4 | 8)拥有会话的进程的地址
USER#NUMBEROracle用户标识符
USERNAMEVARCHAR2(30)Oracle用户名
COMMANDNUMBER正在进行的命令(解析最后一条语句); 有关值列表,请参阅表9-2。这些值也出现在AUDIT_ACTIONS表格中。
OWNERIDNUMBER拥有可迁移会话的用户的标识符; 如果值为列,则列内容无效2147483644

对于使用Parallel Slaves的操作,将此值解释为4字节值。低位2字节表示会话编号,高位字节表示查询协调器的实例ID。

TADDRVARCHAR2(8)事务状态对象的地址
LOCKWAITVARCHAR2(8)会话等待的锁的地址; 如果没有则为NULL
STATUSVARCHAR2(8)会议现状:
  • ACTIVE - 当前正在执行SQL的会话

  • INACTIVE

  • KILLED - 标记为被杀的会话

  • CACHED - 会话临时缓存以供Oracle * XA使用

  • SNIPED - 会话无效,等待客户端

SERVERVARCHAR2(9)服务器类型:
  • DEDICATED

  • SHARED

  • PSEUDO

  • POOLED

  • NONE

SCHEMA#NUMBER架构用户标识符
SCHEMANAMEVARCHAR2(30)架构用户名
OSUSERVARCHAR2(30)操作系统客户端用户名
PROCESSVARCHAR2(24)操作系统客户端进程ID
MACHINEVARCHAR2(64)操作系统机器名称
PORTNUMBER客户端端口号
TERMINALVARCHAR2(30)操作系统终端名称
PROGRAMVARCHAR2(48)操作系统程序名称
TYPEVARCHAR2(10)会话类型
SQL_ADDRESSRAW(4 | 8)用于SQL_HASH_VALUE标识当前正在执行的SQL语句
SQL_HASH_VALUENUMBER用于SQL_ADDRESS标识当前正在执行的SQL语句
SQL_IDVARCHAR2(13)当前正在执行的SQL语句的SQL标识符
SQL_CHILD_NUMBERNUMBER当前正在执行的SQL语句的子编号
SQL_EXEC_STARTDATE此会话当前执行的SQL执行开始的时间; 如果SQL_ID为NULL ,则为NULL
SQL_EXEC_IDNUMBERSQL执行标识符; NULL如果SQL_ID为NULL或者该SQL的执行尚未启动(请参阅参考资料V$SQL_MONITOR
PREV_SQL_ADDRRAW(4 | 8)用于PREV_HASH_VALUE标识最后执行的SQL语句
PREV_HASH_VALUENUMBER用于SQL_HASH_VALUE标识最后执行的SQL语句
PREV_SQL_IDVARCHAR2(13)执行的最后一个SQL语句的SQL标识符
PREV_CHILD_NUMBERNUMBER执行的最后一个SQL语句的子编号
PREV_EXEC_STARTDATESQL执行开始执行最后一次执行的SQL语句
PREV_EXEC_IDNUMBER最后执行的SQL语句的SQL执行标识符
PLSQL_ENTRY_OBJECT_IDNUMBER堆栈中最顶层PL / SQL子程序的对象ID; 如果堆栈上没有PL / SQL子程序,则为NULL
PLSQL_ENTRY_SUBPROGRAM_IDNUMBER堆栈中最顶层PL / SQL子程序的子程序ID; 如果堆栈上没有PL / SQL子程序,则为NULL
PLSQL_OBJECT_IDNUMBER当前正在执行的PL / SQL子程序的对象ID; 执行SQL时为NULL
PLSQL_SUBPROGRAM_IDNUMBER当前正在执行的PL / SQL对象的子程序ID; 执行SQL时为NULL
MODULE脚1 VARCHAR2(48)通过调用DBMS_APPLICATION_INFO.SET_MODULE过程设置的当前正在执行的模块的名称
MODULE_HASHNUMBERMODULE列的哈希值
ACTIONFootref 1VARCHAR2(32)通过调用DBMS_APPLICATION_INFO.SET_ACTION过程设置的当前正在执行的操作的名称
ACTION_HASHNUMBERACTION列的哈希值
CLIENT_INFOVARCHAR2(64)DBMS_APPLICATION_INFO.SET_CLIENT_INFO程序设置的信息
FIXED_TABLE_SEQUENCENUMBER这包含一个数字,每次会话完成对数据库的调用时都会增加,并且从动态性能表中进行了干预选择。性能监视器可以使用此列来监视数据库中的统计信息。每次性能监视器查看数据库时,它只需要查看当前活动的会话或此列中的值高于性能监视器上次查看的最高值。自上次性能监视器查看数据库以来,所有其他会话都处于空闲状态。
ROW_WAIT_OBJ#NUMBER包含指定行的表的对象ID ROW_WAIT_ROW#
ROW_WAIT_FILE#NUMBER包含指定行的数据文件的标识符ROW_WAIT_ROW#。仅当会话当前正在等待提交另一个事务且值ROW_WAIT_OBJ#不是时,此列才有效-1
ROW_WAIT_BLOCK#NUMBER包含指定行的块的标识符ROW_WAIT_ROW#。仅当会话当前正在等待提交另一个事务且值ROW_WAIT_OBJ#不是时,此列才有效-1
ROW_WAIT_ROW#NUMBER当前行被锁定。仅当会话当前正在等待提交另一个事务且值ROW_WAIT_OBJ#不是时,此列才有效-1
TOP_LEVEL_CALL#NUMBEROracle顶级电话号码
LOGON_TIMEDATE登录时间
LAST_CALL_ETNUMBER如果会话STATUS当前ACTIVE,则该值表示自会话变为活动以来经过的时间(以秒为单位)。

如果会话STATUS当前INACTIVE,则该值表示自会话变为非活动状态以来经过的时间(以秒为单位)。

PDML_ENABLEDVARCHAR2(3)此列已替换为该PDML_STATUS
FAILOVER_TYPEVARCHAR2(13)指示是否以及在何种程度上为会话启用透明应用程序故障转移(TAF):
  • NONE - 此会话禁用故障转移

  • SESSION - 客户端能够在断开连接后对其会话进行故障转移

  • SELECT - 客户端也可以对正在进行的查询进行故障转移

也可以看看:

FAILOVER_METHODVARCHAR2(10)表示会话的透明应用程序故障转移方法:
  • NONE - 此会话禁用故障转移

  • BASIC - 客户端本身在断开连接后重新连接

  • PRECONNECT - 备份实例可以支持备份它的每个实例的所有连接

FAILED_OVERVARCHAR2(3)指示会话是在故障转移模式下运行YES还是已发生故障转移()或不是(NO
RESOURCE_CONSUMER_GROUPVARCHAR2(32)会话的当前资源使用者组的名称
PDML_STATUSVARCHAR2(8)如果ENABLED,会话处于PARALLEL DML启用模式。如果DISABLEDPARALLEL DML会话不支持启用模式。如果FORCED,会话已被更改为强制PARALLEL DML
PDDL_STATUSVARCHAR2(8)如果ENABLED,会话处于PARALLEL DDL启用模式。如果DISABLEDPARALLEL DDL会话不支持启用模式。如果FORCED,会话已被更改为强制PARALLEL DDL
PQ_STATUSVARCHAR2(8)如果ENABLED,会话处于PARALLEL QUERY启用模式。如果DISABLEDPARALLEL QUERY会话不支持启用模式。如果FORCED,会话已被更改为强制PARALLEL QUERY
CURRENT_QUEUE_DURATIONNUMBER如果是queued(1),则会话已排队的当前时间量。如果当前没有排队,则值为0
CLIENT_IDENTIFIERVARCHAR2(64)会话的客户端标识符
BLOCKING_SESSION_STATUSVARCHAR2(11)阻止会话状态:
  • VALID

  • NO HOLDER

  • GLOBAL

  • NOT IN WAIT

  • UNKNOWN

BLOCKING_INSTANCENUMBER阻塞会话的实例标识符
BLOCKING_SESSIONNUMBER阻塞会话的会话标识符
SEQ#NUMBER唯一标识当前或最后等待的数字(每次等待递增)
EVENT#NUMBER活动编号
EVENTVARCHAR2(64)会话正在等待的资源或事件

另请参阅: 附录C,“Oracle等待事件”

P1TEXTVARCHAR2(64)第一个等待事件参数的描述
P1NUMBER第一个等待事件参数(十进制)
P1RAWRAW(8)第一个等待事件参数(十六进制)脚2 
P2TEXTVARCHAR2(64)第二个等待事件参数的描述
P2NUMBER第二个等待事件参数(十进制)
P2RAWRAW(8)第二个等待事件参数(十六进制)Footref 2
P3TEXTVARCHAR2(64)第三个等待事件参数的描述
P3NUMBER第三个等待事件参数(十进制)
P3RAWRAW(8)第三个等待事件参数(十六进制)Footref 2
WAIT_CLASS_IDNUMBER等待事件类的标识符
WAIT_CLASS#NUMBER等待事件的类的编号
WAIT_CLASSVARCHAR2(64)等待事件的类的名称
WAIT_TIMENUMBER如果会话当前正在等待,则值为0。如果会话未处于等待状态,则值如下:
  • 0- 值是最后一次等待的持续时间,以百分之一秒为单位

  • -1 - 最后一次等待的持续时间不到百分之一秒

  • -2- 参数TIMED_STATISTICS设置为false

此列已被弃用,以支持列WAIT_TIME_MICROSTATE

SECONDS_IN_WAITNUMBER如果会话当前正在等待,则该值是等待当前等待的时间量。如果会话未处于等待状态,则该值是自上次等待开始以来的时间量。

此列已被弃用,以支持列WAIT_TIME_MICROTIME_SINCE_LAST_WAIT_MICRO

STATEVARCHAR2(19)等待状态:
  • WAITING - 会话目前正在等待

  • WAITED UNKNOWN TIME - 上次等待的持续时间未知; 这是参数TIMED_STATISTICS设置为的值false

  • WAITED SHORT TIME - 最后等待不到百分之一秒

  • WAITED KNOWN TIMEWAIT_TIME列中指定了最后一次等待的持续时间

WAIT_TIME_MICRONUMBER等待的时间量(以微秒为单位)。如果会话当前正在等待,则该值是当前等待所花费的时间。如果会话当前未处于等待状态,则该值是在上次等待中等待的时间量。
TIME_REMAINING_MICRONUMBER值解释如下:
  • 0- 当前等待的剩余时间(以微秒为单位)

  • 0 - 当前等待已经超时

  • -1 - 会话可以无限期地等待当前的等待

  • NULL - 会话当前不在等待

TIME_SINCE_LAST_WAIT_MICRONUMBER自上次等待结束后经过的时间(以微秒为单位)。如果会话当前处于等待状态,则值为0
SERVICE_NAMEVARCHAR2(64)会话的服务名称
SQL_TRACEVARCHAR2(8)指示SQL跟踪是启用(ENABLED)还是禁用(DISABLED
SQL_TRACE_WAITSVARCHAR2(5)指示是否启用等待跟踪(TRUE)或不启用(FALSE
SQL_TRACE_BINDSVARCHAR2(5)指示是否启用绑定跟踪(TRUE)或不启用(FALSE
SQL_TRACE_PLAN_STATSVARCHAR2(10)在每个游标的跟踪文件中转储行源统计信息的频率:
  • never

  • first_execution

  • all_executions

SESSION_EDITION_IDNUMBER显示会话中报告的值 sys_context('USERENV', 'SESSION_EDITION_ID')
CREATOR_ADDRRAW(4 | 8)创建过程或电路的地址
CREATOR_SERIAL#NUMBER创建过程或电路的序列号
ECIDVARCHAR2(64)执行上下文标识符(由Application Server发送)

 

脚注1 此列的数据类型VARCHAR2(64)从Oracle Database 11g第2版​​(11.2.0.2)开始。

脚注2 的P1RAWP2RAWP3RAW列显示相同的值作为P1P2P3列,不同之处在于数字以16进制显示。

 

V$PROCESS显示有关当前活动进程的信息。当LATCHWAIT列指示进程正在等待的锁存时,该LATCHSPIN列指示进程正在旋转的锁存器。在多处理器机器上,Oracle进程会在等待它之前旋转一个锁存器。

数据类型描述
ADDRRAW(4 | 8)进程状态对象的地址
PIDNUMBEROracle进程标识符
SPIDVARCHAR2(24)操作系统进程标识符
PNAMEVARCHAR2(5)此过程的名称
USERNAMEVARCHAR2(15)操作系统进程用户名

注意:任何来自网络的双任务用户都会在用户名后附加“-T”。

SERIAL#NUMBER处理序列号
TERMINALVARCHAR2(30)操作系统终端标识符
PROGRAMVARCHAR2(48)正在制定计划
TRACEIDVARCHAR2(255)跟踪文件标识符
TRACEFILEVARCHAR2(513)跟踪进程的文件名
BACKGROUNDVARCHAR2(1)1用于后台进程; 正常进程为NULL
LATCHWAITVARCHAR2(8)进程正在等待的锁存器的地址; 如果没有则为NULL
LATCHSPINVARCHAR2(8)进程正在旋转的锁存器的地址; 如果没有则为NULL
PGA_USED_MEMNUMBERPGA内存当前由进程使用
PGA_ALLOC_MEMNUMBER当前由进程分配的PGA内存(包括服务器进程尚未释放到操作系统的免费PGA内存)
PGA_FREEABLE_MEMNUMBER分配的PGA内存可以释放
PGA_MAX_MEMNUMBER过程分配的最大PGA内存

示例:

查看当前会话对应的spid:

select spid from v$process p, v$session s where s.sid=userenv('sid') and s.paddr=p.addr;

如:

 

根据USERNAME获取操作系统标识符:spid

select s.SADDR,s.SID,s.SERIAL#,s.PADDR,s.USERNAME,p.addr,p.pid,p.spid,p.SERIAL# from v$session s,v$process p where s.PADDR=p.ADDR and s.USERNAME='SYS';

如:

获得了spid后,查看当前正在执行或最近一次执行的SQL:

select /*+ordered*/ sql_text from v$sqltext sql where (sql.hash_value,sql.address) in (select decode(sql_hash_value,0,prev_hash_value,sql_hash_value),decode(sql_hash_value,0,prev_sql_addr,sql_address) from v$session s where s.paddr = (select addr from v$process p where p.spid = to_number('&pid')));

如:

 

 

六、附录

6.1、关于Oracle userenv()函数介绍

 参数

功能

CLINET_INFO                                     

返回最高可达64个字节存储的用户会话信息,可由应用程序使用DBMS_APPLICATION_INFO包。

ENTRYID

返回当前审计条目编号。审计的EntryID序列细粒度的审计记录和定期审计记录之间共享。在分布式SQL语句不能使用这个属性。

ISDBA

如果用户已经被认证为dba;或者是通过操作系统或口令文件具有DBA特权的,返回“TRUE",否则返回"FALSE"

LANG

返回ISO缩写语言名称,一个比现有的“语言”参数较短的形式

LNAGUAGE

返回数据库当前会话的语言、地域和字符集

SESSIONID

返回审计会话标识符。在分布式SQL语句不能指定此参数

SID

返回数据库当前会话ID

TERMINA

返回当前会话的终端操作系统的标识符。在分布式SQL语句,此参数返回了标识符为本地会话。在分布式环境中,此参数只支持远程SELECT语句,不用于远程INSERT,UPDATE或DELETE操作。

其中标红部分是比较常用的功能:

返回数据库当前会话的语言、地域和字符集:

select userenv('language') from dual;

如果想快速确认当前用户是否拥有DBA权限:

select userenv('isdba') from dual;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值