Oracle:彻底结束会话 ,彻底解锁oracle会话被锁是经常的。但有时alter system kill session 'sid,serial#';并不能彻底的杀死会话。只能通过杀死Linux上对应的进程才行。
以前都是通过v$session里的logon_time,和ps -ef|grep oracle所列出的时间大约的定位进程。然后结束。本来想把这个写成日志。但有一个服务器存在了好几个前几天启动的进程(估计是我kill -9 weblogic进程产生的) ps -ef不能只能列出进程启动的日期,不能列出具体时间。
上网查到了2篇详细的解决方法。就转了过来:
Oracle杀死死锁进程
先查看哪些表被锁住了:
杀进程中的会话:
如果有ora-00031错误,则在后面加immediate;alter system kill session '29,5497' immediate;
如何杀死oracle死锁进程
1.查哪个过程被锁:
查V$DB_OBJECT_CACHE视图:
SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND CLOCKS!='0';
2. 查是哪一个SID,通过SID可知道是哪个SESSION:
查V$ACCESS视图:
SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';
3. 查出SID和SERIAL#:
查V$SESSION视图:
SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID';
查V$PROCESS视图:
SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';
4. 杀进程:
(1)先杀ORACLE进程:
ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';
(2)再杀操作系统进程:
KILL -9 刚才查出的SPID或ORAKILL 刚才查出的SID 刚才查出的SPID。
Oracle的死锁
查询数据库死锁:
查询出来的结果就是有死锁的session了,下面就是杀掉,拿到上面查询出来的SID和SERIAL#,填入到下面的语句中:
alter system kill session 'sid,serial#';
一般情况可以解决数据库存在的死锁了,或通过session id 查到对应的操作系统进程,在Unix中杀掉操作系统的进程。
然后采用kill (unix) 或 orakill(windows )。
在Unix中:
经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。
1)查找死锁的进程:
2)kill掉这个死锁的进程:
alter system kill session ‘sid,serial#’; (其中sid=l.session_id)
3)如果还不能解决:
其中sid用死锁的sid替换:
其中spid是这个进程的进程号,kill掉这个Oracle进程。
上文来源:http://www.webjx.com/htmldata/2007-05-23/1179879038.html
Oracle中Kill session的研究
作者:
link:
http://www.eygle.com/faq/Kill_Session.htm
我们知道,在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为:
alter system kill session ''''sid,serial#'''' ;
被kill掉的session,状态会被标记为killed,Oracle会在该用户下一次touch时清除该进程.
我们发现当一个session被kill掉以后,lag管:\u业网育a网供M该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
在这种情况下,很多时候,c_件D?L~?\%j3Sd资源是无法释放的,我们需要查询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,OY[)Yj?=的专软
ykGo管垠y国的n专u网k无D
现在我们获得了进程地址,就可以在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.这被作为一次异常中断处理.
分享到:
相关推荐
Missing artifact com.oracle:ojdbc6:jar:11.2.0.1.0问题解决 ojdbc包pom.xml出错 <!-- oracle数据库驱动 --> <groupId>com.oracle</groupId> <artifactId>ojdbc6 <version>11.2.0.1.0 1.首先确定你...
深入浅出Oracle: DBA入门、进阶与诊断案例.pdf 深入浅出Oracle: DBA入门、进阶与诊断案例.pdf
《深入解析Oracle:DBA入门、进阶与诊断案例》PDF版本下载
《涂抹Oracle:三思笔记之一步一步学Oracle》作为一本创作之初就定位于技术应用的实践参考书,虽然前前后后串联了Oracle数据库中十余个常用特性或工具,但在章节的设计上完全遵循这一理念。在涉及特性或工具应用的每...
oracle只能手动添加jar包 下载 sdoapi-11.2.0.jar 包到本地 cmd,将jar包手动添加至本地仓库 mvn install:install-file -DgroupId=oracle -DartifactId=sdoapi -Dversion=11.2.0 -Dpackaging=jar -Dfile=E:\Dnloads...
深入浅出Oracle:DBA入门、进阶与诊断案例
查询ORACLE 系统中当前会话正在执行的有关SQL语句。
1 Oracle:索引 5分 ...21 Servlet:会话和会话跟踪 5分 22 Servlet:jsp标准动作 4分 23 Servlet:jsp:setproperty 6分 24 Servlet:servlet的配置 6分 25 Servlet:过滤器 9分 26 Servlet:simpletag 6分
白皮书:Oracle:企业大数据解决方案(PDF)
ojdbc6-11.2.0.1.0 解决问题: Could not find artifact com.oracle:ojdbc6:pom:11.2.0.1.0
1、目的:在实际工作中,有时需将某个程序执行的所有SQL查出来,而程序在Oracle中与会话均可对应,故可通过本文脚本对会话的所有SQL进行跟踪,转换后即可还原程序对Oracle的操作。 2、适用场景:在源码无法拿到,但...
Oracle数据库连接与会话
ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程;无法转换会话 ORA-00022: 无效的会话 ID;...
Oracle疑难:session无法完全删除问题
该资源为oracle的数据库驱动包,版本:ojdbc14-10.2.0.3.0.jar,有需要可执行下载~
oracle错误大全,绝对全。 部分内容 ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021:...
Missing artifact com.oracle:ojdbc14:jar:10.2.0.3.0-附件资源
M03989 Instroduction to Oracle: SQL and PL/SQL Participant Guide Vol. 1 M03990 Instroduction to Oracle: SQL and PL/SQL Participant Guide Vol. 2 M03991 Instroduction to Oracle: SQL and PL/SQL ...
深入浅出Oracle:DBA入门、进阶与诊断案例.pdf 内容详实