Oracle v$session的blocking_session字段

以下一个小测试来说明blocking_session的含义

SQL> select sid from v$mystat where rownum=1;
       SID
----------
       129
SQL> insert into test.test01(id) values (2);
1 row created.
SQL> commit;
Commit complete.
SQL> update test.test01 set id=3 where id=2;
1 row updated.

启动另外一个session

SQL> select sid from v$mystat where rownum=1;
       SID
----------
       128
SQL> update test.test01 set id=4 where id=2;
 
在前面的sid=129的session上查询
SQL> select sid,blocking_session from v$session where blocking_session is not null;
       SID BLOCKING_SESSION
---------- ----------------
       128              129
      
SQL> select sid,blocking_session ,event from v$session where blocking_session is not null;
       SID BLOCKING_SESSION EVENT
---------- ---------------- ------------------------------
       128              129 enq: TX - row lock contention

以上测试不难看出blocking_session字段表示了128这个session被blocking_session字段的值即129session阻塞了。

<think>我们正在详细解释Oracle数据库中的一条SQL查询语句:`SELECT sid, serial#, username, status FROM v$session`。 这个查询用于从动态性能视图`v$session`中获取会话信息。下面将逐步解释每个部分。 1. **v$session视图**: - `v$session`是Oracle数据库中的一个动态性能视图(Dynamic Performance View),它提供了当前数据库中所有会话(session)的信息。 - 每个连接到Oracle数据库的客户端都会创建一个会话。该视图可以显示这些会话的详细状态和属性。 - 这个视图对于监控数据库活动、诊断性能问题以及管理会话非常有用。 2. **查询的字段**: - `sid`:会话标识符(Session Identifier),是分配给每个会话的唯一数字标识。注意,同一个用户的不同连接会有不同的sid。 - `serial#`:序列号(Serial Number)。当一个会话结束并且同一个用户(或进程)重新建立连接时,可能会重用相同的sid,但此时serial#会递增。因此,sid和serial#组合起来可以唯一标识一个会话(即使sid被重用,serial#也会不同,所以组合是唯一的)。 - `username`:登录数据库的用户名。如果是后台进程,则可能为NULL或显示为系统内部用户(如'SYS')。 - `status`:会话的当前状态。常见的状态有: - `ACTIVE`:会话正在执行SQL语句。 - `INACTIVE`:会话处于空闲状态(没有正在执行的操作)。 - `KILLED`:会话已被标记为终止(可能正在回滚)。 - 其他状态如`SNIPED`(在共享服务器模式下,会话空闲时间过长被断开)等。 3. **查询的作用**: - 该查询返回当前数据库中所有会话的sid、serial#、username和status信息。 - 通过这个查询,数据库管理员(DBA)可以监控哪些用户正在连接数据库,以及他们的会话状态(活跃、空闲等),进而进行性能分析、问题排查或会话管理(如终止异常会话)。 4. **示例输出**: 假设我们执行该查询,可能得到如下结果: | SID | SERIAL# | USERNAME | STATUS | |-----|---------|----------|----------| | 1 | 12345 | SYS | ACTIVE | | 2 | 54321 | APP_USER | INACTIVE | | ... | ... | ... | ... | 5. **实际应用**: - **监控活动会话**:通过筛选`status='ACTIVE'`,可以查看当前正在执行SQL的会话。 - **终止会话**:如果发现异常会话(如长时间未响应的会话),可以使用`ALTER SYSTEM KILL SESSION 'sid,serial#';`命令终止该会话(需要sid和serial#)。 - **诊断性能问题**:结合其他动态视图(如`v$sql`、`v$session_wait`)可以分析会话的等待事件和执行的SQL语句。 6. **注意事项**: - 查询`v$session`需要一定的权限(如`SELECT ANY DICTIONARY`或`SELECT_CATALOG_ROLE`),通常只有DBA角色或具有相应权限的用户可以访问。 - 在大型系统中,该视图可能包含大量数据,因此建议使用WHERE子句进行过滤(例如按用户名、状态等)。 7. **与引用内容的关系**: - 引用[1]中提到了在负载较重的情况下访问`v$session`的性能测试。由于`v$session`是一个动态视图,在高并发时查询可能会对系统产生一定压力(因为需要访问内存结构)。因此,在生产环境中应谨慎执行,避免频繁查询。 - 引用[2]提到了`audsid`(审计会话ID),它可以通过`userenv('sessionid')`获取当前会话的`audsid`,进而查询到当前会话的sid。但本查询中并未涉及`audsid`。 8. **扩展知识**: - 除了`v$session`,还有`v$process`视图(显示与会话关联的操作系统进程信息),两者可以通过`paddr`(进程地址)关联。 - `v$session`视图还包含许多其他有用的列,如`machine`(客户端机器名)、`program`(客户端程序名)、`logon_time`(登录时间)等。 总结:该SQL查询用于获取Oracle数据库当前所有会话的关键信息(sid, serial#, username, status),是数据库监控和管理的重要工具。 §§相关问题§§ 1. 如何终止Oracle数据库中的指定会话? 2. 除了`v$session`,还有哪些常用的Oracle动态性能视图用于监控? 3. 如何查询Oracle数据库中当前正在执行SQL的会话及其执行的SQL语句? 4.Oracle中,如何避免查询`v$session`视图对高负载系统造成性能影响?</think>### Oracle数据库 `SELECT sid, serial#, username, status FROM v$session` 详解 #### **一、查询作用与核心价值** 此 SQL 用于查询 Oracle 动态性能视图 `v$session`,获取**当前数据库所有会话的实时状态信息**。这是 DBA 进行性能监控、故障排查和会话管理的关键工具[^1]。 #### **二、字段解析** | 字段名 | 数据类型 | 说明 | 示例值 | |------------|----------|----------------------------------------------------------------------|----------------| | **`sid`** | NUMBER | **会话标识符** (Session Identifier),数据库内唯一会话ID | 142 | | **`serial#`** | NUMBER | **会话序列号**,与 `sid` 共同组成会话的唯一标识(防止 sid 重用) | 12345 | | **`username`** | VARCHAR2 | **数据库用户名**,后台进程显示为 `NULL` 或系统名(如 `SYS`) | 'HR_USER' | | **`status`** | VARCHAR2 | **会话状态**:<br> • `ACTIVE`:正在执行 SQL<br> • `INACTIVE`:空闲<br> • `KILLED`:已终止 | 'ACTIVE' | #### **三、v$session 视图关键特性** 1. **实时动态数据** - 数据直接来自 SGA 内存结构,**无需提交事务即可反映最新状态**。 - 会话断开后记录自动消失[^1]。 2. **会话唯一性保证** `(sid, serial#)` 组合是主键,即使 sid 被重用,serial# 也会递增确保唯一性: ```sql SELECT * FROM v$session WHERE sid=142 AND serial#=12345; -- 精准定位会话 ``` 3. **核心监控场景** - **活跃会话检测**:`WHERE status='ACTIVE'` - **用户会话追踪**:`WHERE username='HR_USER'` - **异常会话终止**:配合 `ALTER SYSTEM KILL SESSION 'sid,serial#'` #### **四、典型使用场景** 1. **性能问题诊断** 检查长时间 `ACTIVE` 会话: ```sql SELECT sid, serial#, sql_id, wait_class FROM v$session WHERE status='ACTIVE' AND last_call_et > 600; -- 活动超过10分钟 ``` 2. **会话管理** 终止阻塞进程: ```sql -- 先查询阻塞者 SELECT sid, serial#, username FROM v$session WHERE blocking_session IS NOT NULL; -- 终止会话 ALTER SYSTEM KILL SESSION '142,12345'; ``` 3. **安全审计** 跟踪特定用户登录: ```sql SELECT sid, logon_time, osuser, machine FROM v$session WHERE username='ADMIN_USER'; ``` #### **五、性能注意事项** 1. **高负载下的影响** 在事务密集型系统中直接查询 `v$session` 可能短暂持有 `enqueue` 锁,建议: - 避免在业务高峰频繁全表扫描 - 使用精准过滤条件(如指定 `sid`)[^1] 2. **替代优化方案** 使用 `gv$session`(RAC 环境)或 `v$session_wait` 减少资源消耗: ```sql SELECT sid, event, wait_time FROM v$session_wait; -- 仅查询等待事件,资源消耗更低 ``` > **示例输出**: > ``` > SID SERIAL# USERNAME STATUS > ---- ------- ---------- -------- > 142 12345 HR_USER ACTIVE > 189 6789 SYS INACTIVE > 205 5432 - KILLED > ``` #### **六、扩展知识** - **AUDSID 关联**:通过审计 ID 定位会话[^2]: ```sql SELECT sid FROM v$session WHERE audsid = USERENV('sessionid'); -- 获取当前会话 sid ``` - **关键关联视图**: `v$process`(操作系统进程)、`v$sql`(执行中 SQL)、`v$lock`(锁信息)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值