`

Oracle查询杀死死锁

 
阅读更多

oracle死锁问题查询及处理

 
一、数据库死锁的现象       首先确认登录的界面  sys/dba
程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。 
 
二、死锁的原理
当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提 
交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态, 
此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。 
 
三、死锁的定位方法
通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。 
 
1)用dba用户执行以下语句 
select username,lockwait,status,machine,program from v$session where sid in 
(select session_id from v$locked_object) 
如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明: 
Username:死锁语句所用的数据库用户; 
Lockwait:死锁的状态,如果有内容表示被死锁。 
Status: 状态,active表示被死锁 
Machine: 死锁语句所在的机器。 
Program: 产生死锁的语句主要来自哪个应用程序。 
 
2)用dba用户执行以下语句,可以查看到被死锁的语句。 
select sql_text from v$sql where hash_value in  
(select sql_hash_value from v$session where sid in 
(select session_id from v$locked_object))
 
四、死锁的解决方法
     一般情况下,只要将产生死锁的语句提交就可以了,但是在实际的执行过程中。用户可 
能不知道产生死锁的语句是哪一句。可以将程序关闭并重新启动就可以了。 
 经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。
 
1)查找死锁的进程:
sqlplus "/as sysdba" (sys/change_on_install)
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS 
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;
 
2)kill掉这个死锁的进程:
  alter system kill session ‘sid,serial#’; (其中sid=l.session_id)
 
3)如果还不能解决:
select pro.spid from v$session ses,v$process pro where ses.sid=XX and ses.paddr=pro.addr;
 
  其中sid用死锁的sid替换: exit
ps -ef|grep spid
 
  其中spid是这个进程的进程号,kill掉这个Oracle进程
 
      KILL -9  “刚才查出的SPID”
      在WINDOWS平台,可以是偶那个orakill。
4)查询死锁语句
select A.SQL_TEXT, B.USERNAME, C.OBJECT_ID, C.SESSION_ID, 
 
       B.SERIAL#, C.ORACLE_USERNAME,C.OS_USER_NAME,C.Process,
       ''''||C.Session_ID||','||B.SERIAL#||''''
from v$sql A, v$session B, v$locked_object C
where A.HASH_VALUE = B.SQL_HASH_VALUE and
B.SID = C.Session_ID
 
精简处理步骤
--1、查找被锁表的object_id
select object_id from all_objects where object_name = upper('table_name') and object_type = 'TABLE'
 
--2、根据第1步查到的object_id查找被锁对象的会话ID
select session_id from v$locked_object where object_id = 1779474
 
--3、根据第2步查到的session_id查找serial#
select sid,serial# from v$session  where sid = 284
 
--4、根据session_id和serial#杀掉进程
alter system kill session 'sid,serial#'
 
--查找在被锁对象上的操作语句
select sql_text from v$sqlarea where address = '00'  --address为v$session中的sql_address字段
分享到:
评论

相关推荐

    如何解决Oracle杀死死锁进程

    本文介绍了解决Oracle杀死死锁进程的方法。

    oracle查询死锁语句

    oracle查询死锁语句,并能根据根据ID值杀死锁表的进程!

    杀死oracle死锁进程

    解决Oracle数据库死锁问题,查询出数据库所有死锁,并杀死所有的死锁,解决程序运行问题;

    oracle杀死锁,寻PIDKILL进程

    oracle杀死锁 ,在批量导入数据的时候,在数据库中很容易就碰到锁表了,导致长时间数据库卡死,此脚本方便找寻数据库被锁对象,如果在oracle中不能alter kill掉 说明该session已过期需要进入后台去杀掉进程

    oracle 死锁时候 ,杀进程方法

    oracle 死锁时候 ,杀进程方法

    orcal解锁杀死死锁进程

    orcal解锁杀死死锁进程导出表中的数据到Excel,包含字段名,文件为真正的Excel文件 ,如果文件不存在,将自动创建文件 ,如果表不存在,将自动创建表 基于通用性考虑,仅支持导出标准数据类型

    解决Oracle死锁问题.txt

    编译的存储过程的时候,程序死住,等待一会出现ora-04021错误解决办法。文档中有查询思索的语句,以及杀掉死锁进程的方法。

    Oracle 查询死锁并解锁的终极处理方法

    一些ORACLE中的进程被杀掉后,状态被置为”killed”,但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。现在提供一种方法解决这种问题,那就是在ORACLE中...2.下面的语句用来杀死一个进程: 代码如下

    杀oracle会话

    oracle杀死会话,解决死锁。保证准确无误。。。。。。。。

    Oracle锁表处理,Oracle表解锁

    数据库死锁的概念, 所谓...Oracle对于“死锁”采取的策略是回滚其中一个事务,让另外一个事务顺利进行。 对于锁死的会话,我们可以直接删掉该会话,等事物回滚完成,也可以找出锁死进程的spid,从服务器中删掉该进程。

    Oracle杀进程.txt

    Oracle数据库由于设计或DEBUG也会造成数据表死锁,此时要找出死锁的表,并杀死,解决运维上的问题。

    C#开发经验技巧宝典

    0835 杀死进程 498 0836 如何下载某网站上的图片资源 498 第19章 SQL查询相关技术 501 19.1 常用SQL查询技术 502 0837 如何在查询中正确使用单引号“’” 502 0838 SQL中SELECT语句的执行顺序 502 0839...

    C#编程经验技巧宝典

    C#编程经验技巧宝典源代码,目录如下: 第1章 开发环境 1 <br>1.1 Visual Studio开发环境安装与配置 2 <br>0001 安装Visual Studio 2005开发环境须知 2 <br>0002 配置合适的Visual Studio 2005...

Global site tag (gtag.js) - Google Analytics