### 快速杀死Oracle的Session方法详解 在Oracle数据库管理中,有时会遇到需要迅速终止某个或某些Session的情况。这通常发生在系统响应缓慢、需要紧急关闭特定进程时,或者是在执行`shutdown immediate`命令但发现由于某些Session的存在导致无法正常关闭数据库时。本文将详细介绍如何快速有效地杀死Oracle中的Session。 #### 一、确定需要杀死的Session 我们需要找出那些状态为“Inactive”的Session。这些Session通常是处于非活跃状态,对当前系统的运行没有实际贡献,但又占用着资源,因此可以考虑将其杀死。 1. **查询Session信息:** 使用以下SQL查询来找出特定用户名下的所有非活跃(INACTIVE)Session: ```sql SELECT sid, username, paddr, status FROM v$session WHERE username = '目标用户名' AND status = 'INACTIVE'; ``` 2. **获取Session的SPID:** 得到Session的SID后,还需要获取该Session对应的SPID(System Process ID),这是在操作系统级别杀死Session所必需的信息。 ```sql SELECT * FROM v$process WHERE addr = '目标paddr'; ``` 这里`paddr`是从上一步查询得到的值。 #### 二、根据操作系统平台杀死Session 根据操作系统的不同,杀死Session的方法也有所差异: 1. **Unix/Linux平台:** - 首先通过SQL查询获取目标Session的SPID。 ```sql SELECT * FROM v$process WHERE addr = '目标paddr'; ``` - 然后在Unix/Linux命令行中使用`kill`命令杀死该进程。 ```bash kill 目标SPID ``` - 最后执行`shutdown immediate`命令,完成数据库的快速关闭。 2. **Windows平台:** - 同样,首先获取目标Session的SPID。 ```sql SELECT * FROM v$process WHERE addr = '目标paddr'; ``` - 在Windows环境下,可以直接使用Oracle提供的`orakill`工具来杀死目标Session。 ```cmd orakill 目标SID 目标SPID ``` - 或者创建一个批处理文件`kill.bat`,自动执行上述操作。 ```batch @echo off set ORACLE_HOME=路径 set ORACLE_SID=实例名 sqlplus / as sysdba << EOF select 'orakill'||sid||' '||spid as thread from sys.v_$process p, sys.v_$session s where sid > 6 and p.addr = s.paddr; EOF pause ``` #### 三、异常情况处理 在尝试杀死Session的过程中可能会遇到一些问题,例如`alter system kill session 'sid,serial#'`命令执行失败等。这时可以采取以下步骤: 1. **检查Session状态:** 确认Session的状态是否允许被杀死,以及是否有其他依赖关系导致无法直接杀死。 2. **手动干预:** 如果是由于某些特定的原因导致无法杀死Session,可能需要手动进行干预,比如调整数据库参数或重新启动数据库实例。 3. **使用Oracle内置工具:** Oracle提供了一些内置工具可以帮助处理此类问题,例如使用`DBMS_MONITOR`包来进行监控和管理。 通过上述步骤,我们可以有效地快速杀死Oracle中的Session,确保数据库的高效运行和管理。
一、问题的提出
很多的时候我们迅速的杀掉Oralcle的一些session,理由大体如下:
1、 一些时候,由于我们的数据量很大,相应的事务大并且多,在做shutdown immediate的时候会花费好多的时间,而我们却想用shutdown immediate的方式,而又要把数据库迅速的shutdown下来。
2、 我们的应用可能使用了会话控制,即在应用的层面控制了一些用户的连接的数量。但有时可能网络发生的瞬断,从而就产生了一些死进程,他们的状态为Inactive的状态。当我们用alter system kill session ‘sid,serial#’进行清除时,这些session的状态又变成了killed,这些就由Pmon进程来慢慢进行清除了,而你恰恰又是个急脾气。
3、 系统忽然慢了现来,你发现是某个session在做怪,想迅速把它迅速结束掉。
二、处理方法
其实处理方法很简单,是被一些人称为“谋杀”的一种方法。因为一个session会对应着操作系统中相应的一个进程(process),我们不使用Alter system kill session这种方式了,取而代之则是kill的方式,当session的后台进程被杀掉了,便会促使懒散的Pmon进程迅速进行清理工作。
1、 以一个session做以示例,
a、 找到你要杀掉的那个session, 并记下paddr
select sid, username, paddr, status from v$session
where username = '用户名' and
status = 'INACTIVE';
b、 找到这个session所对应的spid
select * from v$process where addr = '上面查寻的paddr';
c、 杀掉spid所标识的那个进程
如果你的Oracle是在Unix平台上的,可以用kill。
- catyao2012-06-14额,语句不行,但是还是谢谢楼主上传
- 粉丝: 3
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助