一、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
显示每个当前会话的会话信息。
柱 | 数据类型 | 描述 |
---|---|---|
SADDR | RAW(4 | 8) | 会话地址 |
SID | NUMBER | 会话标识符 |
SERIAL# | NUMBER | 会话序列号。用于唯一标识会话的对象。如果会话结束且另一个会话以相同的会话ID开始,则保证会话级命令应用于正确的会话对象。 |
AUDSID | NUMBER | 审核会话ID |
PADDR | RAW(4 | 8) | 拥有会话的进程的地址 |
USER# | NUMBER | Oracle用户标识符 |
USERNAME | VARCHAR2(30) | Oracle用户名 |
COMMAND | NUMBER | 正在进行的命令(解析最后一条语句); 有关值列表,请参阅表9-2。这些值也出现在AUDIT_ACTIONS 表格中。 |
OWNERID | NUMBER | 拥有可迁移会话的用户的标识符; 如果值为列,则列内容无效2147483644 对于使用Parallel Slaves的操作,将此值解释为4字节值。低位2字节表示会话编号,高位字节表示查询协调器的实例ID。 |
TADDR | VARCHAR2(8) | 事务状态对象的地址 |
LOCKWAIT | VARCHAR2(8) | 会话等待的锁的地址; 如果没有则为NULL |
STATUS | VARCHAR2(8) | 会议现状:
|
SERVER | VARCHAR2(9) | 服务器类型:
|
SCHEMA# | NUMBER | 架构用户标识符 |
SCHEMANAME | VARCHAR2(30) | 架构用户名 |
OSUSER | VARCHAR2(30) | 操作系统客户端用户名 |
PROCESS | VARCHAR2(24) | 操作系统客户端进程ID |
MACHINE | VARCHAR2(64) | 操作系统机器名称 |
PORT | NUMBER | 客户端端口号 |
TERMINAL | VARCHAR2(30) | 操作系统终端名称 |
PROGRAM | VARCHAR2(48) | 操作系统程序名称 |
TYPE | VARCHAR2(10) | 会话类型 |
SQL_ADDRESS | RAW(4 | 8) | 用于SQL_HASH_VALUE 标识当前正在执行的SQL语句 |
SQL_HASH_VALUE | NUMBER | 用于SQL_ADDRESS 标识当前正在执行的SQL语句 |
SQL_ID | VARCHAR2(13) | 当前正在执行的SQL语句的SQL标识符 |
SQL_CHILD_NUMBER | NUMBER | 当前正在执行的SQL语句的子编号 |
SQL_EXEC_START | DATE | 此会话当前执行的SQL执行开始的时间; 如果SQL_ID 为NULL ,则为NULL |
SQL_EXEC_ID | NUMBER | SQL执行标识符; NULL如果SQL_ID 为NULL或者该SQL的执行尚未启动(请参阅参考资料V$SQL_MONITOR ) |
PREV_SQL_ADDR | RAW(4 | 8) | 用于PREV_HASH_VALUE 标识最后执行的SQL语句 |
PREV_HASH_VALUE | NUMBER | 用于SQL_HASH_VALUE 标识最后执行的SQL语句 |
PREV_SQL_ID | VARCHAR2(13) | 执行的最后一个SQL语句的SQL标识符 |
PREV_CHILD_NUMBER | NUMBER | 执行的最后一个SQL语句的子编号 |
PREV_EXEC_START | DATE | SQL执行开始执行最后一次执行的SQL语句 |
PREV_EXEC_ID | NUMBER | 最后执行的SQL语句的SQL执行标识符 |
PLSQL_ENTRY_OBJECT_ID | NUMBER | 堆栈中最顶层PL / SQL子程序的对象ID; 如果堆栈上没有PL / SQL子程序,则为NULL |
PLSQL_ENTRY_SUBPROGRAM_ID | NUMBER | 堆栈中最顶层PL / SQL子程序的子程序ID; 如果堆栈上没有PL / SQL子程序,则为NULL |
PLSQL_OBJECT_ID | NUMBER | 当前正在执行的PL / SQL子程序的对象ID; 执行SQL时为NULL |
PLSQL_SUBPROGRAM_ID | NUMBER | 当前正在执行的PL / SQL对象的子程序ID; 执行SQL时为NULL |
MODULE 脚1 | VARCHAR2(48) | 通过调用DBMS_APPLICATION_INFO.SET_MODULE 过程设置的当前正在执行的模块的名称 |
MODULE_HASH | NUMBER | MODULE 列的哈希值 |
ACTION Footref 1 | VARCHAR2(32) | 通过调用DBMS_APPLICATION_INFO.SET_ACTION 过程设置的当前正在执行的操作的名称 |
ACTION_HASH | NUMBER | ACTION 列的哈希值 |
CLIENT_INFO | VARCHAR2(64) | 由DBMS_APPLICATION_INFO.SET_CLIENT_INFO 程序设置的信息 |
FIXED_TABLE_SEQUENCE | NUMBER | 这包含一个数字,每次会话完成对数据库的调用时都会增加,并且从动态性能表中进行了干预选择。性能监视器可以使用此列来监视数据库中的统计信息。每次性能监视器查看数据库时,它只需要查看当前活动的会话或此列中的值高于性能监视器上次查看的最高值。自上次性能监视器查看数据库以来,所有其他会话都处于空闲状态。 |
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# | NUMBER | Oracle顶级电话号码 |
LOGON_TIME | DATE | 登录时间 |
LAST_CALL_ET | NUMBER | 如果会话STATUS 当前ACTIVE ,则该值表示自会话变为活动以来经过的时间(以秒为单位)。 如果会话 |
PDML_ENABLED | VARCHAR2(3) | 此列已替换为该PDML_STATUS 列 |
FAILOVER_TYPE | VARCHAR2(13) | 指示是否以及在何种程度上为会话启用透明应用程序故障转移(TAF):
也可以看看:
|
FAILOVER_METHOD | VARCHAR2(10) | 表示会话的透明应用程序故障转移方法:
|
FAILED_OVER | VARCHAR2(3) | 指示会话是在故障转移模式下运行YES 还是已发生故障转移()或不是(NO ) |
RESOURCE_CONSUMER_GROUP | VARCHAR2(32) | 会话的当前资源使用者组的名称 |
PDML_STATUS | VARCHAR2(8) | 如果ENABLED ,会话处于PARALLEL DML 启用模式。如果DISABLED ,PARALLEL DML 会话不支持启用模式。如果FORCED ,会话已被更改为强制PARALLEL DML 。 |
PDDL_STATUS | VARCHAR2(8) | 如果ENABLED ,会话处于PARALLEL DDL 启用模式。如果DISABLED ,PARALLEL DDL 会话不支持启用模式。如果FORCED ,会话已被更改为强制PARALLEL DDL 。 |
PQ_STATUS | VARCHAR2(8) | 如果ENABLED ,会话处于PARALLEL QUERY 启用模式。如果DISABLED ,PARALLEL QUERY 会话不支持启用模式。如果FORCED ,会话已被更改为强制PARALLEL QUERY 。 |
CURRENT_QUEUE_DURATION | NUMBER | 如果是queued(1 ),则会话已排队的当前时间量。如果当前没有排队,则值为0 。 |
CLIENT_IDENTIFIER | VARCHAR2(64) | 会话的客户端标识符 |
BLOCKING_SESSION_STATUS | VARCHAR2(11) | 阻止会话状态:
|
BLOCKING_INSTANCE | NUMBER | 阻塞会话的实例标识符 |
BLOCKING_SESSION | NUMBER | 阻塞会话的会话标识符 |
SEQ# | NUMBER | 唯一标识当前或最后等待的数字(每次等待递增) |
EVENT# | NUMBER | 活动编号 |
EVENT | VARCHAR2(64) | 会话正在等待的资源或事件 另请参阅: 附录C,“Oracle等待事件” |
P1TEXT | VARCHAR2(64) | 第一个等待事件参数的描述 |
P1 | NUMBER | 第一个等待事件参数(十进制) |
P1RAW | RAW(8) | 第一个等待事件参数(十六进制)脚2 |
P2TEXT | VARCHAR2(64) | 第二个等待事件参数的描述 |
P2 | NUMBER | 第二个等待事件参数(十进制) |
P2RAW | RAW(8) | 第二个等待事件参数(十六进制)Footref 2 |
P3TEXT | VARCHAR2(64) | 第三个等待事件参数的描述 |
P3 | NUMBER | 第三个等待事件参数(十进制) |
P3RAW | RAW(8) | 第三个等待事件参数(十六进制)Footref 2 |
WAIT_CLASS_ID | NUMBER | 等待事件类的标识符 |
WAIT_CLASS# | NUMBER | 等待事件的类的编号 |
WAIT_CLASS | VARCHAR2(64) | 等待事件的类的名称 |
WAIT_TIME | NUMBER | 如果会话当前正在等待,则值为0 。如果会话未处于等待状态,则值如下:
此列已被弃用,以支持列 |
SECONDS_IN_WAIT | NUMBER | 如果会话当前正在等待,则该值是等待当前等待的时间量。如果会话未处于等待状态,则该值是自上次等待开始以来的时间量。 此列已被弃用,以支持列 |
STATE | VARCHAR2(19) | 等待状态:
|
WAIT_TIME_MICRO | NUMBER | 等待的时间量(以微秒为单位)。如果会话当前正在等待,则该值是当前等待所花费的时间。如果会话当前未处于等待状态,则该值是在上次等待中等待的时间量。 |
TIME_REMAINING_MICRO | NUMBER | 值解释如下:
|
TIME_SINCE_LAST_WAIT_MICRO | NUMBER | 自上次等待结束后经过的时间(以微秒为单位)。如果会话当前处于等待状态,则值为0 。 |
SERVICE_NAME | VARCHAR2(64) | 会话的服务名称 |
SQL_TRACE | VARCHAR2(8) | 指示SQL跟踪是启用(ENABLED )还是禁用(DISABLED ) |
SQL_TRACE_WAITS | VARCHAR2(5) | 指示是否启用等待跟踪(TRUE )或不启用(FALSE ) |
SQL_TRACE_BINDS | VARCHAR2(5) | 指示是否启用绑定跟踪(TRUE )或不启用(FALSE ) |
SQL_TRACE_PLAN_STATS | VARCHAR2(10) | 在每个游标的跟踪文件中转储行源统计信息的频率:
|
SESSION_EDITION_ID | NUMBER | 显示会话中报告的值 sys_context('USERENV', 'SESSION_EDITION_ID') |
CREATOR_ADDR | RAW(4 | 8) | 创建过程或电路的地址 |
CREATOR_SERIAL# | NUMBER | 创建过程或电路的序列号 |
ECID | VARCHAR2(64) | 执行上下文标识符(由Application Server发送) |
脚注1 此列的数据类型VARCHAR2(64)
从Oracle Database 11g第2版(11.2.0.2)开始。
脚注2 的P1RAW
,P2RAW
和P3RAW
列显示相同的值作为P1
,P2
和P3
列,不同之处在于数字以16进制显示。
V$PROCESS
显示有关当前活动进程的信息。当LATCHWAIT
列指示进程正在等待的锁存时,该LATCHSPIN
列指示进程正在旋转的锁存器。在多处理器机器上,Oracle进程会在等待它之前旋转一个锁存器。
柱 | 数据类型 | 描述 |
---|---|---|
ADDR | RAW(4 | 8) | 进程状态对象的地址 |
PID | NUMBER | Oracle进程标识符 |
SPID | VARCHAR2(24) | 操作系统进程标识符 |
PNAME | VARCHAR2(5) | 此过程的名称 |
USERNAME | VARCHAR2(15) | 操作系统进程用户名 注意:任何来自网络的双任务用户都会在用户名后附加“-T”。 |
SERIAL# | NUMBER | 处理序列号 |
TERMINAL | VARCHAR2(30) | 操作系统终端标识符 |
PROGRAM | VARCHAR2(48) | 正在制定计划 |
TRACEID | VARCHAR2(255) | 跟踪文件标识符 |
TRACEFILE | VARCHAR2(513) | 跟踪进程的文件名 |
BACKGROUND | VARCHAR2(1) | 1 用于后台进程; 正常进程为NULL |
LATCHWAIT | VARCHAR2(8) | 进程正在等待的锁存器的地址; 如果没有则为NULL |
LATCHSPIN | VARCHAR2(8) | 进程正在旋转的锁存器的地址; 如果没有则为NULL |
PGA_USED_MEM | NUMBER | PGA内存当前由进程使用 |
PGA_ALLOC_MEM | NUMBER | 当前由进程分配的PGA内存(包括服务器进程尚未释放到操作系统的免费PGA内存) |
PGA_FREEABLE_MEM | NUMBER | 分配的PGA内存可以释放 |
PGA_MAX_MEM | NUMBER | 过程分配的最大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;