oracle终止session

本文详细阐述了如何标识并终止Oracle数据库中的非管理员session,包括识别ACTIVE和INACTIVE session的方法,以及使用ALTERSYSTEM KILL SESSION命令进行操作的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
  有时候,oracle终止当前的session是必要的。例如,你想执行一个管理操作,需要终止所有非管理员的session。下面描述的是终止session的各个方面,包括以下:

    1.标识哪些session需要终止
    2.终止一个Active Session
    3.终止一个Inactive Session

   当一个session被终止,session的任何活动事务回滚,并且立即释放所有的资源,比如locks and memoryareas。
    使用ALTERSYSTEM KILL SESSION终止一个会话。下面的例句sid 7,serial# 15:
    ALTER SYSTEMKILL SESSION '7,15';

1. 标识哪些session需要终止
   为了标识需要终止的session,需要知道session的sid和serial#,可以查询v$session得到。例如,下面的查询标识了用户wxlun的所有session:

SQL> SELECT SID, SERIAL#, STATUS FROM V$SESSION WHERE USERNAME ='WXLUN';

      SID    SERIAL#STATUS
---------- ---------- --------
       81     19713 ACTIVE
       95     27537 INACTIVE

  当一个session正在调用数据库,session状态为ACTIVE,当一个session非正在调用数据库,session状态为INACTIVE。

2. 终止一个Active Session
   如果一个用户session正在处理事务(ACTIVE),终止这个会话,则事务回滚,用户立即收到下面的信息:
ORA-00028: your session has been killed
如果,接到ORA-00028错误后,再重新连接数据库前继续执行语句,oracle会返还下面的信息:
ORA-01012: not loggedon(使用不同的工具连接到数据库可能收到的信息不同,但是类似,都是指和库的session断了)
   当一个session正在执行网络I/O或者事务回滚时,是不能终止的。这类session只能等操作完成才可以终止。这种情况下,直到session终止,资源才会释放。另外,发出ALTERSYSTEM去终止session的会话,等待60秒后没有终止session,会收到一个信息表明session已标识为终止。被标记为终止的session在v$seession的status为KILLED,某些终止服务status可能为PSEUDO。

3. 终止一个Inactive Session
   如果终止一个InactiveSession,并不会立即收到ORA-00028错误。直到用户接着使用被终止的session才会收到ORA-00028错误。
    当一个inactivesession,session的status变成KILLED,当用户再次使用这个session和收到ORA-00028错误,这个终止的session会从v$session删除。

下面是一个终止inactive session的例子。

SQL> SELECT SID, SERIAL#, STATUS FROM V$SESSION WHERE USERNAME ='WXLUN';

      SID    SERIAL#STATUS
---------- ---------- --------
       95     27591 INACTIVE

SQL> alter system kill session '95,27591';

System altered.

SQL> SELECT SID, SERIAL#, STATUS FROM V$SESSION WHERE USERNAME ='WXLUN';

      SID    SERIAL#STATUS
---------- ---------- --------
       95     27591 KILLED

SQL>
<think>我们正在处理用户关于Oracle数据库会话管理或故障排除的问题。用户希望了解如何管理会话或解决与会话相关的问题。根据提供的引用,我们可以提取以下与会话相关的信息:引用[2]提到了一个输入节:oracle:session,这可能是用于监控会话的配置。引用[3]展示了如何从trace文件中获取死锁信息,其中死锁与会话有关。引用[4]提供了一些用于诊断的跟踪事件,这些事件可以用于生成会话的跟踪文件。因此,我们可以从以下几个方面回答:1.如何查看当前会话信息?2.如何终止会话?3.如何诊断会话问题(如死锁)?4.如何跟踪会话?同时,我们需要生成相关问题。注意:由于引用内容有限,我们主要基于已知的Oracle知识进行回答,并适当结合引用。</think>### Oracle数据库会话管理与故障排除 Oracle数据库会话是用户与数据库建立的连接实例,管理会话涉及监控、诊断和优化连接状态。以下是关键管理方法和故障排除技术: #### 1. **查看活动会话信息** ```sql SELECT sid, serial#, username, status, machine, program FROM v$session WHERE type = 'USER'; ``` - `v$session`视图提供会话详细信息:会话ID(SID)、序列号(SERIAL#)、用户、状态(ACTIVE/INACTIVE)等[^2] - 状态说明: - `ACTIVE`:正在执行SQL - `INACTIVE`:空闲连接 - `KILLED`:已标记终止 #### 2. **终止问题会话** ```sql ALTER SYSTEM KILL SESSION '<sid>,<serial#>'; ``` - 必须先查询目标会话的SID和SERIAL#[^2] - 对于顽固会话,添加`IMMEDIATE`选项强制终止: ```sql ALTER SYSTEM KILL SESSION '123,45678' IMMEDIATE; ``` #### 3. **诊断会话死锁** - **检查警报日志**: ```bash grep -i deadlock $ORACLE_BASE/diag/rdbms/*/trace/alert_*.log ``` - **查看跟踪文件**: ```sql SELECT value FROM v$diag_info WHERE name = 'Diag Trace'; ``` 在输出目录查找`*_ora_*.trc`文件[^3] - 死锁错误示例: ``` ORA-00060: Deadlock detected. See Note 60.1 at My Oracle Support ``` #### 4. **会话跟踪与诊断** - **启用SQL跟踪**: ```sql EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(session_id=>123, serial_num=>45678); ``` - **生成特定诊断信息**: ```sql -- 控制文件跟踪 ALTER SESSION SET EVENTS 'immediate trace name controlf level 10'; -- UNDO段头跟踪 ALTER SESSION SET EVENTS 'immediate trace name undo header "_SYSSMU17$"'; ``` 跟踪文件存放于`v$diag_info`指定的路径[^4] #### 5. **监控会话性能** ```sql SELECT s.sid, s.sql_id, sq.sql_text, s.wait_class, s.event FROM v$session s JOIN v$sql sq ON s.sql_id = sq.sql_id WHERE s.status = 'ACTIVE'; ``` - 关键字段: - `wait_class`:等待类型(如Concurrency/Network) - `event`:具体等待事件(如`enq: TX - row lock contention`) #### 6. **会话资源限制** - 配置Profile限制会话资源: ```sql CREATE PROFILE app_user LIMIT SESSIONS_PER_USER 5 IDLE_TIME 30; ``` - 应用配置: ```sql ALTER USER scott PROFILE app_user; ``` ### 常见问题解决方案 | 问题现象 | 排查步骤 | |---------|----------| | 会话挂起 | 1. 检查`v$session`的`event`列<br>2. 分析ASH报告`@?/rdbms/admin/ashrpt.sql` | | ORA-00060死锁 | 1. 查询`v$lock`确认锁冲突<br>2. 分析跟踪文件的`Deadlock graph`段[^3] | | 会话泄漏 | 1. 监控`v$process`与`v$session`比例<br>2. 检查连接池配置(如DB Connect v2的`oracle:pool:connections`)[^2] | > **重要提示**:生产环境操作前建议保存诊断信息: > ```sql > EXEC DBMS_SYSTEM.KSDWRT(2, '开始会话诊断操作'); > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值