`

Oracle清session

阅读更多
我们知道,在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为:



alter system kill session 'sid,serial#' ;




被kill掉的session,状态会被标记为killed,Oracle会在该用户下一次touch时清除该进程.




我们发现当一个session被kill掉以后,该session的paddr被修改,如果有多个session被kill,那么多个session
的paddr都被更改为相同的进程地址:







SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

SADDR           SID    SERIAL# PADDR    USERNAME                       STATUS
-------- ---------- ---------- -------- ------------------------------ --------
542E0E6C         11        314 542B70E8 EYGLE                          INACTIVE
542E5044         18        662 542B6D38 SYS                            ACTIVE


SQL> alter system kill session '11,314';

System altered.

SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

SADDR           SID    SERIAL# PADDR    USERNAME                       STATUS
-------- ---------- ---------- -------- ------------------------------ --------
542E0E6C         11        314 542D6BD4 EYGLE                          KILLED
542E5044         18        662 542B6D38 SYS                            ACTIVE


SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

SADDR           SID    SERIAL# PADDR    USERNAME                       STATUS
-------- ---------- ---------- -------- ------------------------------ --------
542E0E6C         11        314 542D6BD4 EYGLE                          KILLED
542E2AA4         14        397 542B7498 EQSP                           INACTIVE
542E5044         18        662 542B6D38 SYS                            ACTIVE

SQL> alter system kill session '14,397';

System altered.

SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

SADDR           SID    SERIAL# PADDR    USERNAME                       STATUS
-------- ---------- ---------- -------- ------------------------------ --------
542E0E6C         11        314 542D6BD4 EYGLE                          KILLED
542E2AA4         14        397 542D6BD4 EQSP                           KILLED
542E5044         18        662 542B6D38 SYS                            ACTIVE


 


在这种情况下,很多时候,资源是无法释放的,我们需要查询spid,在操作系统级来kill这些进程.



但是由于此时v$session.paddr已经改变,我们无法通过v$session和v$process关联来获得spid



那还可以怎么办呢?



我们来看一下下面的查询:











  SQL> SELECT s.username,s.status,
   2  x.ADDR,x.KSLLAPSC,x.KSLLAPSN,x.KSLLASPO,x.KSLLID1R,x.KSLLRTYP,
   3  decode(bitand (x.ksuprflg,2),0,null,1)
   4  FROM x$ksupr x,v$session s
   5  WHERE s.paddr(+)=x.addr
   6  and bitand(ksspaflg,1)!=0;


USERNAME                       STATUS   ADDR       KSLLAPSC   KSLLAPSN KSLLASPO       KSLLID1R KS D
------------------------------ -------- -------- ---------- ---------- ------------ ---------- -- -
                                         542B44A8          0          0                       0
                                ACTIVE   542B4858          1         14 24069                 0    1
                                ACTIVE   542B4C08         26         16 15901                 0    1
                                ACTIVE   542B4FB8          7         46 24083                 0    1
                                ACTIVE   542B5368         12         15 24081                 0    1
                                ACTIVE   542B5718         15         46 24083                 0    1
                                ACTIVE   542B5AC8         79          4 15923                 0    1
                                ACTIVE   542B5E78         50         16 24085                 0    1
                                ACTIVE   542B6228        754         15 24081                 0    1
                                ACTIVE   542B65D8          1         14 24069                 0    1
                                ACTIVE   542B6988          2         30 14571                 0    1

USERNAME                       STATUS   ADDR       KSLLAPSC   KSLLAPSN KSLLASPO       KSLLID1R KS D
------------------------------ -------- -------- ---------- ---------- ------------ ---------- -- -
SYS                            ACTIVE   542B6D38          2          8 24071                 0
                                         542B70E8          1         15 24081               195 EV
                                         542B7498          1         15 24081               195 EV
SYS                            INACTIVE 542B7848          0          0                       0
SYS                            INACTIVE 542B7BF8          1         15 24081               195 EV

16 rows selected.
          







我们注意,红字标出的部分就是被Kill掉的进程的进程地址.




简化一点,其实就是如下概念:





SQL> select p.addr from v$process p where pid <> 1  2  minus  3  select s.paddr from v$session s;

ADDR
--------
542B70E8
542B7498






Ok,现在我们获得了进程地址,就可以在v$process中找到spid,然后可以使用Kill或者orakill在系统级来杀掉这些进程.



实际上,我猜测:



当在Oracle中kill session以后, Oracle只是简单的把相关session的paddr 指向同一个虚拟地址.



此时v$process和v$session失去关联,进程就此中断.



然后Oracle就等待PMON去清除这些Session.所以通常等待一个被标记为Killed的Session退出需要花费很长的时间.



如果此时被Kill的process,重新尝试执行任务,那么马上会收到进程中断的提示,process退出,此时Oracle会立即启动PMON
来清除该session.这被作为一次异常中断处理.
分享到:
评论

相关推荐

    oracle中已killed session的处理

    ### Oracle中已Killed Session的处理 #### 一、背景介绍 在Oracle数据库管理中,有时会遇到一些异常情况,比如某个Session长时间未响应或占用大量资源,这时可能需要管理员手动干预,通过`ALTER SYSTEM KILL ...

    重启oracle服务,删除session

    ### 重启Oracle服务与删除Session的操作指南 #### 一、背景介绍 在Oracle数据库管理过程中,有时需要重启Oracle服务或清除所有的会话(session),以解决某些特定问题或进行必要的维护工作。本文将详细介绍如何通过...

    如何快速的杀掉Oracle的Session

    在Oracle数据库管理中,有时需要快速地结束特定的Session,以应对各种情况,例如系统性能下降、长时间运行的事务或应用程序错误。本文将探讨如何高效地“杀掉”Oracle的Session,以及这种方法背后的原因和注意事项。...

    清除Oracle中长时间持锁的session

    ### 清除Oracle中长时间持锁的Session #### 背景介绍 在Oracle数据库管理过程中,有时会遇到一些长时间占用资源的进程,这些进程可能会导致数据库性能下降甚至某些操作无法执行。通常情况下,如果一个session的状态...

    有效关闭Oracle死锁进程,和释放状态为killed的session

    在Oracle数据库管理中,处理死锁进程和释放状态为killed的session是一项关键技能,尤其对于维护数据库性能和稳定性至关重要。以下将详细阐述如何通过一系列步骤有效地关闭Oracle死锁进程,以及如何释放状态为killed...

    Oracle Session Monitor v1.0

    Oracle Session Monitor v1.0 是一个专为Oracle数据库设计的进程管理工具,它允许管理员设置特定的时间条件,以便自动监控并处理数据库中的会话。在Oracle数据库系统中,"会话"指的是用户与数据库之间的连接,它包含...

    oracle 10g 自动清除 session 删除库 并 自动 impdp 导入备份

    首先,自动清除Oracle当前链接,这通常涉及到`DBMS_SESSION`包中的`KILL_SESSION`过程。此过程用于终止指定会话,当有长时间未活动的会话或者需要紧急清理资源时非常有用。在Bash脚本中,我们可能通过SQL*Plus或oci8...

    oracle 查看当前会话执行的sql语句

    在Oracle数据库管理中,有时我们需要了解某个特定会话(Session)正在执行哪些SQL语句。这在性能调优、问题诊断等场景下尤为重要。以下将详细介绍如何通过不同的方法来查看当前会话所执行的SQL语句及相关信息。 ###...

    oracle清除死锁

    ### Oracle清除死锁知识点 #### 一、Oracle死锁概念 在Oracle数据库中,当两个或多个事务在等待对方释放锁定资源时会发生死锁。这种情况下,所有事务都将被阻塞,无法继续执行,直到其中一个事务回滚或者系统采取...

    如何安全快速的批量删除Oracle数据库外部会话session

    总结来说,安全快速地批量删除Oracle数据库外部会话涉及到对`ALTER SYSTEM KILL SESSION`、`ALTER SYSTEM DISCONNECT SESSION`命令的熟练运用,以及可能的与操作系统交互。在执行这些操作时,务必小心谨慎,避免对...

    oracle杀僵死进程

    ### Oracle杀僵死进程 在Oracle数据库管理过程中,经常会遇到僵死进程的问题,这些问题可能会导致数据库性能下降甚至无法正常运行。本文将详细介绍如何通过SQL查询定位僵死进程,并提供具体的解决方案,帮助解决如...

    oracle10g入门.pdf 清晰 实用

    - **数据字典视图**:利用数据字典视图(如V$DATABASE、V$SESSION等)来获取有关数据库状态的信息。 - **备份与恢复**:介绍RMAN(Recovery Manager)工具的使用方法,包括备份策略制定、备份执行以及故障恢复等操作...

    Oracle12c 数据库安装部署手册含所需软件

    session required pam_limits.so ``` 这确保了当用户登录时,PAM 会读取 `limits.conf` 文件并应用相应的限制。 ###### Step 4: 配置内核参数 最后,需要根据 Oracle 文档的要求调整内核参数。例如,可以通过编辑...

    减少Oracle内存占用

    - 可以通过`ALTER SESSION SET pga_aggregate_target`动态调整PGA的大小。 3. **定期清理缓存**: - 定期清理SGA中的数据缓冲区,释放不再使用的数据块。 - 清除共享池中不再使用的SQL执行计划,减少内存占用。 ...

    session级别的statspack

    在实际应用中,配合Oracle的其他性能分析工具,如AWR(Automatic Workload Repository)和ASH(Active Session History),session级别的Statspack能提供更全面的性能视角。这些工具结合使用,可以为DBAs提供强大的...

    statement_tracer_for_oracle

    1. 使用DBMS_SESSION包:Oracle提供了一组PL/SQL包DBMS_SESSION,允许用户通过调用其成员过程如START_TRACE和END_TRACE来开启和关闭SQL追踪。 2. 使用SQL Trace的10046事件:在SQL*Plus或PL/SQL环境中,可以通过...

    oracle安装.docx

    ### Oracle 数据库安装知识点 #### 一、Oracle数据库安装前准备 **1.1 配置YUM源** 为了能够顺利地安装Oracle数据库所需的依赖包,首先需要配置系统的YUM源。具体步骤如下: - 使用`cd /etc`命令进入/etc目录。 - ...

    ORACLE中临时表

    Oracle中的临时表是一种特殊的数据结构,用于存储会话或事务期间的数据,这些数据仅对当前会话可见,并在特定条件下自动清除。Oracle提供两种类型的临时表:事务型和会话型。 事务型临时表在事务开始时创建,插入的...

Global site tag (gtag.js) - Google Analytics