oracle kill session
kill session 是DBA经常碰到的事情之一。如果kill 掉了不该kill 的session,则具有破坏性,因此尽可能的避免这样的错误发生。同时也应当注意,
如果kill 的session属于Oracle 后台进程,则容易导致数据库实例宕机。
通常情况下,并不需要从操作系统级别杀掉Oracle会话进程,但并非总是如此,下面的描述中给出了在Oracle级别杀掉会话以及操作系统级别杀掉进程。
一、获得需要kill session的信息(使用V$SESSION 和 GV$SESSION视图)
SET LINESIZE 180
COLUMN spid FORMAT A10
COLUMN username FORMAT A10
COLUMN program FORMAT A40
SELECT s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.program,
s.paddr,
s.STATUS
FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND';
INST_ID SID SERIAL# SPID USERNAME PROGRAM PADDR STATUS
---------- ---------- ---------- ---------- ---------- --------------------------------------------- -------- --------
1 146 23 27573 TEST sqlplus@oracle10g (TNS V1-V3) 4C621950 INACTIVE
1 160 17 27610 SYS sqlplus@oracle10g (TNS V1-V3) 4C624174 ACTIVE
1 144 42 27641 SCOTT sqlplus@oracle10g (TNS V1-V3) 4C624730 INACTIVE
二、使用ALTER SYSTEM KILL SESSION 命令实现
语法:
SQL> ALTER SYSTEM KILL SESSION 'sid,serial#';
SQL> ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
对于RAC环境下的kill session ,需要搞清楚需要kill 的session 位于哪个节点,可以查询GV$SESSION视图获得。
kill session 的时候仅仅是将会话杀掉。在有些时候,由于较大的事务或需要运行较长的SQL语句将导致需要kill的session并不能立即杀掉。对于这种情
况将收到 "marked for kill"提示(如下),一旦会话当前事务或操作完成,该会话被立即杀掉。
alter system kill session '4730,39171'
*
ERROR at line 1:
ORA-00031: session marked for kill
在下面的操作中将杀掉会话146,144
sys@AUSTIN> alter system kill session '146,23';
System altered.
sys@AUSTIN> alter system kill session '144,42';
System altered.
sys@AUSTIN> select inst_id,saddr,sid,serial#,paddr,username,status,program from gv$session whereusername is not null;
INST_ID SADDR SID SERIAL# PADDR USERNAME STATUS PROGRAM
---------- -------- ---------- ---------- -------- ---------- -------- ---------------------------------------------
1 4C70BF04 144 42 4C6545A0 SCOTT KILLED sqlplus@oracle10g (TNS V1-V3)
1 4C70E6B4 146 23 4C6545A0 TEST KILLED sqlplus@oracle10g (TNS V1-V3)
1 4C71FC84 160 17 4C624174 SYS ACTIVE sqlplus@oracle10g (TNS V1-V3)
注意:在查询中可以看到被杀掉的会话的PADDR地址发生了变化,参照查询结果中的红色字体。如果多个session被kill 掉,则多个session的PADDR
被改为相同的进程地址。
通过下面的语句来找回被kill 掉的ADDR先前的地址
SELECT s.username,s.status,
x.ADDR,x.KSLLAPSC,x.KSLLAPSN,x.KSLLASPO,x.KSLLID1R,x.KSLLRTYP,
decode(bitand (x.ksuprflg,2),0,null,1)
FROM x$ksupr x,v$session s
WHERE s.paddr(+)=x.addr
and bitand(ksspaflg,1)!=0;
USERNAME STATUS ADDR KSLLAPSC KSLLAPSN KSLLASPO KSLLID1R KS D
---------- -------- -------- ---------- ---------- ------------ ---------- -- -
ACTIVE 4C623BB8 99 4 27468 275 EV 1
ACTIVE 4C623040 9 24 27444 0 1
ACTIVE 4C622A84 101 4 27480 274 EV 1
ACTIVE 4C6224C8 1 48 27450 0 1
ACTIVE 4C621F0C 1 48 27450 0 1
ACTIVE 4C6235FC 2 4 27468 0 1
SYS ACTIVE 4C624174 2 15 27442 0
ACTIVE 4C62081C 1 48 27440 0 1
ACTIVE 4C621394 1 48 27440 0 1
ACTIVE 4C620DD8 11 24 27476 0 1
ACTIVE 4C61F6E8 15 4 27610 0 1
ACTIVE 4C620260 222 24 27450 0 1
ACTIVE 4C61FCA4 7 25 27573 0 1
ACTIVE 4C61F12C 6 25 27573 0 1
ACTIVE 4C61EB70 4 24 27458 0 1
ACTIVE 4C61E5B4 1 48 27440 0 1
ACTIVE 4C61DFF8 2 24 27444 0 1
4C624730 0 0 0
4C621950 0 0 0
4C61DA3C 0 0 0
或者根据下面的语句来获得发生变化的addr
sys@AUSTIN> select p.addr from v$process p where pid <> 1
2 minus
3 select s.paddr from v$session s;
ADDR
--------
4C621950
4C624730
三、在操作系统级别杀掉会话
寻找会话对应的操作系统的进程ID
sys@AUSTIN> select SPID from v$process where ADDR in ('4C621950','4C624730') ;
SPID
----------
27573
27641
使用kill 命令来杀掉操作系统级别进程ID
kill session -9 27573
kill session -9 27641
四、获得当前会话的SID
SQL> select userenv('sid') from dual;
USERENV('SID')
--------------
627
五、多个会话需要kill 的处理办法
1.根据给定的SID(用户名)查找需要杀掉会话的信息,包括位于哪一个实例
set linesize 160
col program format a35
col username format a18
select inst_id,saddr,sid,serial#,paddr,username,status,program from gv$session
where sid in ('2731','2734','2720','2678','2685')
and username='CTICUST'
order by inst_id;
INST_ID SADDR SID SERIAL# PADDR USERNAME STATUS PROGRAM
---------- ---------------- ---------- ---------- ---------------- ------------------ -------- ---------------------------
1 00000003DAF8F870 2678 8265 00000003DBC6CA08 MSS4USR INACTIVE JDBC Thin Client
1 00000003DAF98E48 2685 83 00000003DBC08510 MSS4USR ACTIVE JDBC Thin Client
1 00000003DAFC7B80 2720 5 00000003DBBEDA20 MSS4USR INACTIVE JDBC Thin Client
1 00000003DAFD66F8 2731 3 00000003DBBE9AE0 SYS ACTIVE racgimon@svdg0028(TNS V1-V3)
1 00000003DAFDA730 2734 15 00000003DBBEC268 MSS4USR INACTIVE JDBC Thin Client
2 00000003DAFD66F8 2731 1 00000003DBBE92F8 ACTIVE oracle@svdg0029 (ARC0)
上面的查询中有一个SID为2731的位于节点2上。
也可以通过下面的方式来获得RAC的节点信息,便于确定需要kill 的session究竟位于哪一个节点。
set linesize 160
col HOST_NAME format a25
SQL> select INSTANCE_NUMBER,INSTANCE_NAME,HOST_NAME,VERSION,STATUS from gv$instance order by 1;
INSTANCE_NUMBER INSTANCE_NAME HOST_NAME VERSION STATUS
--------------- ---------------- ------------------------- ----------------- ------------
1 O02WMT1A svd0051 10.2.0.4.0 OPEN
2 O02WMT1B svd0052 10.2.0.4.0 OPEN
3 O02WMT1C svd0053 10.2.0.4.0 OPEN
2.使用下面查询来生成kill session 的语句
select 'alter system kill session '''|| sid ||',' ||SERIAL# ||''''||';' from gv$session
where sid in ('2731','2734','2720','2678','2685')
order by inst_id;
获得下列kill session的语句,根据要求由于此次需要杀掉的session全部位于节点1,因此登录到节点节点1执行下面的语句
alter system kill session '2678,8265';
alter system kill session '2685,83';
alter system kill session '2720,5';
alter system kill session '2731,3';
alter system kill session '2734,15';
oracle kill session的更多相关文章
- Oracle Kill Session – FRM-40501
FRM-40501: ORACLE error: unable to reserve record for update or delete frm-40501:oracle 错误:无法保留用于更新或 ...
- Oracle中Kill session的研究(转 出自eagle)
itpub link: http://www.itpub.net/235873.html 我们知道,在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为: a ...
- ORACLE 中KILL session
我们知道,在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为: alter system kill session 'sid,serial#' ; 被kil ...
- 查看oracle当前session
怎样查看oracle当前的连接数呢?只需要用下面的SQL语句查询一下就可以了. #查看当前不为空的连接select * from v$session where username is not n ...
- Oracle V$SESSION详解
V$SESSION是APPS用户下面对于SYS.V_$SESSION 视图的同义词. 在本视图中,每一个连接到数据库实例中的session都拥有一条记录.包括用户session及后台进程如DBWR,L ...
- kill session真的能杀掉进程吗
session1 确认sidSYS @ prod > select userenv('sid') from dual; USERENV('SID')-------------- 144 sess ...
- Oracle V$SESSION
SADDR session address SID session identifier 常用于链接其他列 SERIAL# SID有可能会重复,当两个session的SID重复时,SERIAL#用来区 ...
- orakill和ALTER SYSTEM KILL SESSION详解
--orakill和ALTER SYSTEM KILL SESSION详解[转]-----------------------------------------2013/11/05 一个用户进程偶尔 ...
- 会话执行存储过程,等待被阻塞,Kill session场景模拟
本次场景来源: 通知某个会话:执行execute addupp(1,'five');类似的存储过程,会话等待:(会话等待两种情况:一种确实执行,但是未完成:另一种就是执行的操作无法获取资源,等待资源释 ...
随机推荐
- Java语言概要
Java把源代码(SourceCode)翻译成字节码(ByteCode):javac MyClass.java,再在Java虚拟机(JVM)上执行字节码:java MyClass. Java是基于面向 ...
- nexus私服update repair index索引失败解决方案(转)
转载地址:http://blog.csdn.net/first_sight/article/details/51559086 问题描述: 搭建Maven的Nexus私服仓库,一般安装完Nexus后,默 ...
- 解决织梦DEDEcms指定arclist的特定ID排序的方法
转载网址:http://blog.hrseo.net/xuexi/184.html 替换/include/taglib/arclist.lib.php这个文件,下载链接: http://pan.bai ...
- 技海拾贝 - Android
1. 前台Service - 介绍: http://blog.csdn.net/think_soft/article/details/7299438 - 代码实例: http://blog.csdn ...
- 随机生成UUID(GUID)的方法
- (NSString *)UUID { CFUUIDRef uuid_ref = CFUUIDCreate(NULL); CFStringRef uuid_string_ref= CFUUIDCre ...
- [ADB]ADB(Android Debug Bridge)简介及基础(不包含命令)
"Android Debug Bridge (adb) is a versatile command line tool that lets you communicate with an ...
- JavaScript DOM 编程艺术·setInterval与setTimeout的动画实现解析
先贴上moveElement()函数的大纲,为了方便观看,删了部分代码,完整版粘到文章后面. function moveElement(elementID,final_x,final_y,interv ...
- js判断类型方法
在JavaScript中,有5种基本数据类型和1种复杂数据类型,基本数据类型有:Undefined, Null,Boolean, Number和String:复杂数据类型是Object,Object中 ...
- PullToRefreshGridView刷新加载
<com.handmark.pulltorefresh.library.PullToRefreshGridView xmlns:ptr="http://schemas.a ...
- HttpUtility.UrlDecode
如果在 HTTP 流中传递如空格或者标点符号等字符,它们可能会错误地解释在接收端. URL 编码转换为字符实体等效项; 不允许在 URL 中的字符URL 解码反转的编码. 例如,在嵌入到要在 URL ...