`

Oracle-解除死锁方法

阅读更多

当利用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还提供了一些工具,如DBMS_LOCK包中的函数,可以用来检测和解除死锁。 ### 四、预防措施 为了避免Oracle中的死锁现象,可以采取以下预防措施: - **使用一致的锁定顺序**:确保...

    Oracle对于死锁的处理方法

    Oracle数据库出现死锁的时候可以按照以下处理步骤加以解决: 第一步:尝试在sqlplus中通过sql命令进行删除,如果能够删除成功,则万事大吉!但通常情况下,出现死锁时,想通过命令行或者通过Oracle的管理工具删除有...

    oracle查询kill死锁方法.txt

    ### Oracle 查询及解除死锁的方法 #### 一、理解Oracle中的死锁现象 在Oracle数据库中,当两个或多个会话互相等待对方释放资源时,就会发生死锁现象。这种情况通常发生在事务处理过程中,其中一个会话锁定了某些...

    Oracle表死锁与解锁

    本文将深入探讨Oracle表死锁的原因、检测以及解决方法。 首先,我们需要了解死锁的基本概念。死锁是当两个或更多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们都无法继续执行。在...

    oracle中关于死锁的处理

    ### Oracle中关于死锁的处理 #### 死锁概述 在Oracle数据库中,死锁是一种常见但必须妥善处理的问题。当两个或多个事务互相等待对方释放资源时就会发生死锁。这种情况下,没有一个事务能够继续执行,直到系统采取...

    oracle清除死锁

    如果超过了这个时间,Oracle将会自动选择一个会话进行回滚,从而解除死锁。 设置该参数的方法如下: ```sql ALTER SYSTEM SET deadlock_timeout = 10000; ``` 这表示如果发生死锁,Oracle将等待10秒后自动选择一...

    并发访问ORACLE数据库的数据死锁分析和解决措施.pdf

    (3)发生死锁后设法解除,使用系统中的某种方法来解除死锁。 结论 数据死锁是一个关系型数据库中常见的问题,本文对数据死锁的概念、原因和解决措施进行了详细介绍。通过合理设计事务的并发性、锁机制和事务的...

    较实用的ORACLE数据库死锁查杀

    如果检测到死锁,通常的做法是手动终止其中一个事务,以便解除死锁状态。可以通过查询到的信息找到具体造成死锁的会话,然后使用`ALTER SYSTEM KILL SESSION`命令杀死该会话。 **2. 调整锁定策略:** 为了避免未来...

    Oracle数据库死锁查询语句

    Oracle还提供了一个名为`DBMS_LOCK`的PL/SQL包,可以用于手动模拟死锁或者解除死锁。例如,`DBMS_LOCK.REQUEST`函数用于请求锁,而`DBMS_LOCK.RELEASE`用于释放锁。 当遇到死锁时,Oracle数据库的死锁检测机制会...

    解决oracle死锁

    **解除死锁:** Oracle有一个内置的死锁检测机制,称为死锁检测器,它会在检测到死锁时自动选择一个事务进行回滚,以打破死锁。这个被选择的事务被称为“牺牲品”,它的回滚操作使得其他事务能够继续执行。然而,这...

    关于Oracle数据库死锁问题的研究与讨论

    关于Oracle数据库死锁问题的研究与讨论

    有效关闭Oracle死锁进程,和释放状态为killed的session

    在识别出造成死锁的会话后,管理员可以采取措施强制终止这些进程,以解除死锁。通常,这可以通过使用`ALTER SYSTEM KILL`命令来实现,但需要注意的是,必须准确地指定会话ID(SID)和序列号(SERIAL#),以避免误杀...

    oracle--lock.zip_oracle

    2. **解决死锁**:Oracle提供了一个内置的死锁检测机制,当检测到死锁时,会选择一个事务进行回滚以打破死锁循环。可以通过设置` deadlock_timeout `参数来调整检测频率。 四、锁的级别 Oracle支持行级锁、表级锁和...

    oracle死锁故障分析和诊断解决

    此时,可以采用上述提到的方法之一来解决死锁问题,例如通过杀死其中一个会话来解除死锁。 #### 六、预防措施 1. **事务隔离级别**:合理设置事务的隔离级别可以有效避免死锁的发生。 2. **锁的类型**:选择合适的...

    查看 oracle 死锁程序

    - **死锁检测与自动解锁**:启用Oracle数据库的死锁检测功能,自动解除死锁。 通过以上方法,不仅可以有效检测到Oracle数据库中的死锁问题,还可以采取措施预防未来可能出现的死锁,从而提高系统的稳定性和性能。

    Oracle 死锁问题的排查语句

    Oracle 死锁问题的排查语句 Oracle 死锁是指在数据库中出现...这条语句可以 kill 掉死锁的 Session,从而解除死锁。 Oracle 死锁问题的排查语句可以帮助 DBA rapidly 查找和解决死锁问题,提高数据库的性能和稳定性。

    如何解决Oracle杀死死锁进程

    一旦确定了死锁的会话,就可以尝试杀死这些会话以解除死锁。使用`ALTER SYSTEM KILL SESSION`命令,指定会话的`SID`和`SERIAL#`: ```sql ALTER SYSTEM KILL SESSION 'sid,serial#'; ``` 如果遇到`ORA-00031`错误...

    oracle解决死锁![参考].pdf

    这将强制结束会话,释放其所占用的资源,从而解除死锁。如果需要,还可以在操作系统层面使用`KILL`命令(如`KILL -9 SPID`或`ORAKILL SID SPID`)终止进程。 然而,简单地杀死进程并不总是最佳解决方案,因为这可能...

Global site tag (gtag.js) - Google Analytics