我们知道,在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数据库管理中,有时会遇到一些异常情况,比如某个Session长时间未响应或占用大量资源,这时可能需要管理员手动干预,通过`ALTER SYSTEM KILL ...
### 重启Oracle服务与删除Session的操作指南 #### 一、背景介绍 在Oracle数据库管理过程中,有时需要重启Oracle服务或清除所有的会话(session),以解决某些特定问题或进行必要的维护工作。本文将详细介绍如何通过...
在Oracle数据库管理中,有时需要快速地结束特定的Session,以应对各种情况,例如系统性能下降、长时间运行的事务或应用程序错误。本文将探讨如何高效地“杀掉”Oracle的Session,以及这种方法背后的原因和注意事项。...
### 清除Oracle中长时间持锁的Session #### 背景介绍 在Oracle数据库管理过程中,有时会遇到一些长时间占用资源的进程,这些进程可能会导致数据库性能下降甚至某些操作无法执行。通常情况下,如果一个session的状态...
在Oracle数据库管理中,处理死锁进程和释放状态为killed的session是一项关键技能,尤其对于维护数据库性能和稳定性至关重要。以下将详细阐述如何通过一系列步骤有效地关闭Oracle死锁进程,以及如何释放状态为killed...
Oracle Session Monitor v1.0 是一个专为Oracle数据库设计的进程管理工具,它允许管理员设置特定的时间条件,以便自动监控并处理数据库中的会话。在Oracle数据库系统中,"会话"指的是用户与数据库之间的连接,它包含...
首先,自动清除Oracle当前链接,这通常涉及到`DBMS_SESSION`包中的`KILL_SESSION`过程。此过程用于终止指定会话,当有长时间未活动的会话或者需要紧急清理资源时非常有用。在Bash脚本中,我们可能通过SQL*Plus或oci8...
在Oracle数据库管理中,有时我们需要了解某个特定会话(Session)正在执行哪些SQL语句。这在性能调优、问题诊断等场景下尤为重要。以下将详细介绍如何通过不同的方法来查看当前会话所执行的SQL语句及相关信息。 ###...
### Oracle清除死锁知识点 #### 一、Oracle死锁概念 在Oracle数据库中,当两个或多个事务在等待对方释放锁定资源时会发生死锁。这种情况下,所有事务都将被阻塞,无法继续执行,直到其中一个事务回滚或者系统采取...
总结来说,安全快速地批量删除Oracle数据库外部会话涉及到对`ALTER SYSTEM KILL SESSION`、`ALTER SYSTEM DISCONNECT SESSION`命令的熟练运用,以及可能的与操作系统交互。在执行这些操作时,务必小心谨慎,避免对...
### Oracle杀僵死进程 在Oracle数据库管理过程中,经常会遇到僵死进程的问题,这些问题可能会导致数据库性能下降甚至无法正常运行。本文将详细介绍如何通过SQL查询定位僵死进程,并提供具体的解决方案,帮助解决如...
- **数据字典视图**:利用数据字典视图(如V$DATABASE、V$SESSION等)来获取有关数据库状态的信息。 - **备份与恢复**:介绍RMAN(Recovery Manager)工具的使用方法,包括备份策略制定、备份执行以及故障恢复等操作...
session required pam_limits.so ``` 这确保了当用户登录时,PAM 会读取 `limits.conf` 文件并应用相应的限制。 ###### Step 4: 配置内核参数 最后,需要根据 Oracle 文档的要求调整内核参数。例如,可以通过编辑...
- 可以通过`ALTER SESSION SET pga_aggregate_target`动态调整PGA的大小。 3. **定期清理缓存**: - 定期清理SGA中的数据缓冲区,释放不再使用的数据块。 - 清除共享池中不再使用的SQL执行计划,减少内存占用。 ...
在实际应用中,配合Oracle的其他性能分析工具,如AWR(Automatic Workload Repository)和ASH(Active Session History),session级别的Statspack能提供更全面的性能视角。这些工具结合使用,可以为DBAs提供强大的...
1. 使用DBMS_SESSION包:Oracle提供了一组PL/SQL包DBMS_SESSION,允许用户通过调用其成员过程如START_TRACE和END_TRACE来开启和关闭SQL追踪。 2. 使用SQL Trace的10046事件:在SQL*Plus或PL/SQL环境中,可以通过...
### Oracle 数据库安装知识点 #### 一、Oracle数据库安装前准备 **1.1 配置YUM源** 为了能够顺利地安装Oracle数据库所需的依赖包,首先需要配置系统的YUM源。具体步骤如下: - 使用`cd /etc`命令进入/etc目录。 - ...
Oracle中的临时表是一种特殊的数据结构,用于存储会话或事务期间的数据,这些数据仅对当前会话可见,并在特定条件下自动清除。Oracle提供两种类型的临时表:事务型和会话型。 事务型临时表在事务开始时创建,插入的...