【转】ORACLE快速彻底Kill掉的会话
2016-03-14 20:55
543 查看
在ORACLE数据库当中,有时候会使用ALTERSYSTEMKILLSESSION'sid,serial#'杀掉一个会话进程,但是使用这个SQL语句杀掉会话后,数据库并不会立即释放掉相关的资源,有时候你会发现锁定的资源很长时间也不会释放,即使会话状态为“KILLED”,依然会阻塞其它会话。
下面根据Eygel的"Oracle中Kill
session的研究",构造一个案例看看killsession到底做了什么。如下所示
会话1:
会话2:
会话3
如下所示,我杀掉了其中两个会话后,这两个会话的地址都变为000000025C21A0B0了(请见PADDR列)。当在Oracle中killsession以后,Oracle只是简单的把相关session的paddr指向同一个虚拟地址.此时v$process和v$session失去关联,进程就此中断。然后Oracle就等待PMON去清除这些Session.所以通常等待一个被标记为Killed的Session退出需要花费很长的时间.如果此时被Kill的process,重新尝试执行任务,那么马上会收到进程中断的提示,process退出,此时Oracle会立即启动PMON来清除该session.这被作为一次异常中断处理.
我们根据下面SQL找到进程的地址,然后在v$process里面找到对应的spid,然后从操作系统中杀掉该进程。
在ORACLE数据库杀掉会话进程有三种方式:
1:ALTERSYSTEMKILLSESSION
关于KILLSESSIONClause,如下官方文档描述所示,altersystemkillsession实际上不是真正的杀死会话,它只是将会话标记为终止。等待PMON进程来清除会话。
可以使用ALTERSYSTEMKILLSESSION'sid,serial#'IMMEDIATE来快速回滚事物、释放会话的相关锁、立即返回当前会话的控制权。
SpecifyIMMEDIATEtoinstructOracleDatabasetorollbackongoingtransactions,releaseallsessionlocks,recovertheentiresessionstate,andreturncontroltoyouimmediately.
2:ALTERSYSTEMDISCONNECTSESSION
ALTERSYSTEMDISCONNECTSESSION杀掉专用服务器(DEDICATEDSERVER)或共享服务器的连接会话,它等价于从操作系统杀掉进程。它有两个选项POST_TRANSACTION和IMMEDIATE,其中POST_TRANSACTION表示等待事务完成后断开会话,IMMEDIATE表示中断会话,立即回滚事务。
SQL>ALTERSYSTEMDISCONNECTSESSION'sid,serial#'POST_TRANSACTION;
SQL>ALTERSYSTEMDISCONNECTSESSION'sid,serial#'IMMEDIATE;
3:KILL-9SPID(Linux)或orakillORACLE_SIDspid (Windows)
可以使用下面SQL语句找到对应的操作系统进程SPID,然后杀掉。当然杀掉操作系统进程是一件危险的事情,尤其不要误杀。所以在执行前,一定要谨慎确认。
在数据库如果要彻底杀掉一个会话,尤其是大事务会话,最好是使用ALTERSYSTEMDISCONNECTSESSIONIMMEDIATE或使用下面步骤:
1:首先在操作系统级别Kill掉进程。
2:在数据库内部KILLSESSION
或者反过来亦可。这样可以快速终止进程,释放资源。
下面根据Eygel的"Oracle中Kill
session的研究",构造一个案例看看killsession到底做了什么。如下所示
会话1:
SQL>connetl/etl
Connected.
SQL>updatetestsetstatus='invalid';
55944rowsupdated.
SQL>updatetest2setdropped='Y';
3090rowsupdated.
会话2:
SQL>showuser
USERis"SYS"
SQL>updateetl.test2setdropped='Y';
3090rowsupdated.
会话3
SQL>selectsaddr,sid,serial#,paddr,username,statusfromv$sessionwhereusername=upper('etl')orusername=upper('sys');
SADDRSIDSERIAL#PADDRUSERNAMESTATUS
------------------------------------------------------------------------------------------
000000025C233B002733353000000025F1D1FC8ETLINACTIVE
000000025C23A6083711448000000025F1D27B0SYSACTIVE
000000025C24BC506354311000000025F1D5F08SYSACTIVE
SQL>altersystemkillsession'27,33353';
Systemaltered.
SQL>selectsaddr,sid,serial#,paddr,username,statusfromv$sessionwhereusername=upper('etl')orusername=upper('sys');
SADDRSIDSERIAL#PADDRUSERNAMESTATUS
------------------------------------------------------------------------------------------
000000025C233B002733353000000025C21A0B0ETLKILLED
000000025C23A6083711448000000025F1D27B0SYSACTIVE
000000025C24BC506354311000000025F1D5F08SYSINACTIVE
如下所示,我杀掉了其中两个会话后,这两个会话的地址都变为000000025C21A0B0了(请见PADDR列)。当在Oracle中killsession以后,Oracle只是简单的把相关session的paddr指向同一个虚拟地址.此时v$process和v$session失去关联,进程就此中断。然后Oracle就等待PMON去清除这些Session.所以通常等待一个被标记为Killed的Session退出需要花费很长的时间.如果此时被Kill的process,重新尝试执行任务,那么马上会收到进程中断的提示,process退出,此时Oracle会立即启动PMON来清除该session.这被作为一次异常中断处理.
SQL>altersystemkillsession'63,54311';
Systemaltered.
SQL>selectsaddr,sid,serial#,paddr,username,status
fromv$sessionwhereusername=upper('etl')orusername=upper('sys');
SADDRSIDSERIAL#PADDRUSERNAMESTATUS
------------------------------------------------------------------------------------------
000000025C233B002733353000000025C21A0B0ETLKILLED
000000025C23A6083711448000000025F1D27B0SYSACTIVE
000000025C24BC506354311000000025C21A0B0SYSKILLED
我们根据下面SQL找到进程的地址,然后在v$process里面找到对应的spid,然后从操作系统中杀掉该进程。
SQL>selectp.addrfromv$processpwherepid<>1
2minus
3selects.paddrfromv$sessions;
ADDR
----------------
000000025F1D1FC8
000000025F1D5F08
SQL>selectsaddr,sid,serial#,paddr,username,statusfromv$session
whereusername=upper('etl')orusername=upper('sys');
SADDRSIDSERIAL#PADDRUSERNAMESTATUS
------------------------------------------------------------------------------------------
000000025C233B002733353000000025C21A0B0ETLKILLED
000000025C23A6083711448000000025F1D27B0SYSACTIVE
000000025C24BC506354311000000025C21A0B0SYSKILLED
SQL>selectaddr,pid,spid,usernamefromv$processwhereaddrin('000000025F1D1FC8','000000025F1D5F08');
ADDRPIDSPIDUSERNAME
-----------------------------------------------------
000000025F1D1FC82212959oracle
000000025F1D5F083812971oracle
SQL>!kill-912959
SQL>!kill-912971
SQL>selectsaddr,sid,serial#,paddr,username,status
fromv$sessionwhereusername=upper('etl')orusername=upper('sys');
SADDRSIDSERIAL#PADDRUSERNAMESTATUS
------------------------------------------------------------------------------------------
000000025C23A6083711448000000025F1D27B0SYSACTIVE
在ORACLE数据库杀掉会话进程有三种方式:
1:ALTERSYSTEMKILLSESSION
关于KILLSESSIONClause,如下官方文档描述所示,altersystemkillsession实际上不是真正的杀死会话,它只是将会话标记为终止。等待PMON进程来清除会话。
TheKILLSESSIONclauseletsyoumarkasessionasterminated,rollbackongoingtransactions,releaseallsessionlocks,andpartiallyrecoversessionresources.Tousethisclause,yourinstancemusthavethedatabaseopen.Yoursessionandthesessiontobeterminatedmustbeonthesameinstanceunlessyouspecifyinteger3.YoumustidentifythesessionwiththefollowingvaluesfromtheV$SESSIONview:
Forinteger1,specifythevalueoftheSIDcolumn.
Forinteger2,specifythevalueoftheSERIAL#column.
Fortheoptionalinteger3,specifytheIDoftheinstancewherethetargetsessiontobekilledexists.YoucanfindtheinstanceIDbyqueryingtheGV$tables.
Ifthesessionisperformingsomeactivitythatmustbecompleted,suchaswaitingforareplyfromaremotedatabaseorrollingbackatransaction,thenOracleDatabasewaitsforthisactivitytocomplete,marksthesessionasterminated,andthenreturnscontroltoyou.Ifthewaitinglastsaminute,thenOracleDatabasemarksthesessiontobeterminatedandreturnscontroltoyouwithamessagethatthesessionismarkedtobeterminated.ThePMONbackgroundprocessthenmarksthesessionasterminatedwhentheactivityiscomplete.
Whetherornotthesessionhasanongoingtransaction,OracleDatabasedoesnotrecovertheentiresessionstateuntilthesessionuserissuesarequesttothesessionandreceivesamessagethatthesessionhasbeenterminated.
可以使用ALTERSYSTEMKILLSESSION'sid,serial#'IMMEDIATE来快速回滚事物、释放会话的相关锁、立即返回当前会话的控制权。
SpecifyIMMEDIATEtoinstructOracleDatabasetorollbackongoingtransactions,releaseallsessionlocks,recovertheentiresessionstate,andreturncontroltoyouimmediately.
2:ALTERSYSTEMDISCONNECTSESSION
ALTERSYSTEMDISCONNECTSESSION杀掉专用服务器(DEDICATEDSERVER)或共享服务器的连接会话,它等价于从操作系统杀掉进程。它有两个选项POST_TRANSACTION和IMMEDIATE,其中POST_TRANSACTION表示等待事务完成后断开会话,IMMEDIATE表示中断会话,立即回滚事务。
SQL>ALTERSYSTEMDISCONNECTSESSION'sid,serial#'POST_TRANSACTION;
SQL>ALTERSYSTEMDISCONNECTSESSION'sid,serial#'IMMEDIATE;
3:KILL-9SPID(Linux)或orakillORACLE_SIDspid (Windows)
可以使用下面SQL语句找到对应的操作系统进程SPID,然后杀掉。当然杀掉操作系统进程是一件危险的事情,尤其不要误杀。所以在执行前,一定要谨慎确认。
SETLINESIZE100
COLUMNspidFORMATA10
COLUMNusernameFORMATA10
COLUMNprogramFORMATA45
SELECTs.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.program
FROMgv$sessions
JOINgv$processpONp.addr=s.paddrANDp.inst_id=s.inst_id
WHEREs.type!='BACKGROUND';
在数据库如果要彻底杀掉一个会话,尤其是大事务会话,最好是使用ALTERSYSTEMDISCONNECTSESSIONIMMEDIATE或使用下面步骤:
1:首先在操作系统级别Kill掉进程。
2:在数据库内部KILLSESSION
或者反过来亦可。这样可以快速终止进程,释放资源。
相关文章推荐
- Oracle基本语法知识点
- Hibernate与Oracle数据库的连接
- Oracle同义词创建及分配用户创建同义词权限
- MyEclipse关联Oracle数据库
- oracle——SQL复习02
- 工作记录:oracle数据库移机中关于redolog出错的处理
- 简单java连接oracle,Statement,PreparedStatement,CallableStatement操作
- 工作记录:rman备份恢复融合平台oracle数据库到异机服务器
- oracle中从指定日期中获取月份或者部分数据
- Oracle定时执行计划任务
- oracle表连接方式对比
- ORACLE11g 实例启动报错 ORA-00205: error in identifying control file, check alert log for more info
- oracle删除表后又有这个表:BIN$dJ5h8mA4Lr/gQAB/AQB0oA==$0 TABLE 存在
- oracle 11g ADG做(switchover)切换测试
- 64位 SSIS连接Oracle
- oracle删除表空间和修改索引表空间
- oracle 常用函数,不全后期补上。
- ORACLE判别字段是否包含中文
- Mybatis调用Oracle带包存储过程
- Oracle批量执行SQL语句