当利用PL/SQL执行一个sql语句的时候,有时候中途手动终止了该语句的执行,但是利用
--查看正在运行的sql语句
select a.*,s.*
from v$sqltext a,v$session s
where s.STATUS ='ACTIVE' and s.SQL_HASH_VALUE =a.hash_value
order by s.USERNAME,a.PIECE
会发现,该语句还在运行,这时候就要终止sql语句锁对应的session,方法如下:
1. 利用“查看正在运行的sql语句”找到该sql语句对应的sid 和 serial#
2. 执行alter system kill session 'sid,serial#' ,终止该session
3. 执行
select saddr,sid,serial#,paddr,username,status from v$session where username is not null
查看session是否被成功终止,我们会发现被kill掉的session,状态会被标记为killed,同时该session对应的paddr被修改,如果有多个session被kill,那么多个被kill的session的paddr都被更改为相同的进程地址。
但其实这种情况下,很多时候,session占用的资源是无法释放的,我们需要查询spid,在操作系统级来kill这些进程。我们可以通过如下语句查看系统中被锁的对象:
select lpad(' ', decode(l.xidusn, 0, 3, 0)) || l.oracle_username user_name,
o.owner, o.object_name, o.object_type, s.sid, s.serial#, p.spid
from v$locked_object l, dba_objects o, v$session s, v$process p
where l.object_id = o.object_id and l.session_id = s.sid and s.paddr = p.addr
order by o.object_id, xidusn desc
4. 但是由于被kill的session的paddr已经改变,我们无法通过v$session和v$process关联来获得该session对应os的进程。通过执行如下语句,来找到status=killed的session的addr,即为被Kill掉的session的进程地址。
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
5. 现在我们获得了session的地址,就可以在v$process中找到spid,select * from v$process v where v.addr='*******'
6. 登录操作系统,利用kill -9杀死对应的进程。
实际上,当在Oracle中kill session以后, Oracle只是简单的把相关session的paddr 指向同一个虚拟地址.此时v$process和v$session失去关联,进程就此中断.
然后Oracle就等待PMON(Oracle的后台进程之一,用来清理失败的进程)去清除这些Session.所以通常等待一个被标记为Killed的Session退出需要花费很长的时间.
注意:数据库相关查询需要 DBA 权限~
分享到:
相关推荐
oracle如何解除死锁[进程互相锁死]
oracle死锁问题查询代码,仅供参考,有问题大家一起交流
操作系统课程设计--死锁 操作系统课程设计--死锁 操作系统课程设计--死锁
oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁
该文档详细分析了innodb的加锁原理、死锁原因以及处理方式
操作系统实验--死锁的避免程序.doc
本文介绍了解决Oracle杀死死锁进程的方法。
OracleOracle查询死锁表OracleOracle查询死锁表OracleOracle查询死锁表
oracle查询kill死锁方法
Oracle数据库出现死锁的时候可以按照以下处理步骤加以解决: 第一步:尝试在sqlplus中通过sql命令进行删除,如果能够删除成功,则万事大吉!但通常情况下,出现死锁时,想通过命令行或者通过Oracle的管理工具删除有...
oracle后台查看死锁语句,也可以通过plsql的工具---会话--点击lock_wait列过滤出死锁的语句。
行业资料-电子功用-无死锁的电源电路
oracle数据库解决死锁,使用plsql语句手动解决死锁问题
操作系统课程设计的代码和报告,题目是找出解除死锁的最佳进程序列,课程设计成绩为良,有需要的同学可以参考一下
解决死锁问题的三种方法:预防死锁,检测死锁及避免死锁。
4,给出某个进程的资源分配请求,按死锁避免方法检测可否将资源分配给它?若可,输出一个进程安全序列、资源分配成功的说明和新的系统资源分配状态表;若否,输出“资源分配失败”和失败的原因:①,申请量大于系统...
操作系统实验报告-死锁的检测与解除.pdf
操作系统 课件 第3章 死锁 进程管理 产生死锁的原因和必要条件:(1)竞争资源...
有关表死锁的详细图片 博文链接:https://meteor-1988.iteye.com/blog/1568695
ORACLE表死锁的解决方法亲测有效!