Chinaunix首页 | 论坛 | 博客
  • 博客访问: 296412
  • 博文数量: 22
  • 博客积分: 65
  • 博客等级: 民兵
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-18 13:24
文章分类

全部博文(22)

文章存档

2016年(1)

2015年(2)

2014年(2)

2013年(17)

我的朋友

分类: Oracle

2013-01-16 22:42:40

Oracle死锁问题的解决方法

报送单位:          审核人:


关键字: Oracle  死锁 

1、引言

         每个使用关系型数据库的程序都可能遇到数据死锁的情况,Oracle数据库也不例外,虽然Oracle提供了防死锁机制,但有时还是会发生死锁现象.下面就给大家分析下ORACLE数据库死锁问题,并详细介绍问题分析的步骤,以及解决此问题的主要操作,供大家学习和参考。
2、故障现象

        我在5月号做数据库巡检时发现在数据库系统日志中有一条错误信息,截图如下:



3、处理过程

.查哪个过程被锁

V$DB_OBJECT_CACHE视图:

SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND LOCKS!='0';

2. 查是哪一个SID,通过SID可知道是哪个SESSION.

V$ACCESS视图:

SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';

3. 查出SIDSERIAL#

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).能过CMD控制台,再杀操作系统进程:

ORAKILL 数据库实现 刚才查出的SPID

一定要记住,要把之前查出的Oracle死锁记下来,然后,一一对其Kill,如果Kill不干净的话,还是解决不了问题

4、原因分析

这个还是举例好理解:

t1t2两张表,每个表里都有一条记录。

那么在session1中更新t1,在session2中更新t2

再在session2中更新t1,这时只能叫阻塞,如果再在session1中更新t2,就死锁了。

5、经验总结

此错误主要是由于多个进程访问同一数据库时,其中每个进程拥有的锁都是其他进程所需的,由此造成每个进程都无法继续下去。简单的说,进程A等待进程B释放他的资源,B又等待A释放他的资源,这样就互相等待,从而形成的.在发现该问题出现后,应当及时查看数据库是否自动把死锁进程中的一个结束,若没有就应当手动的杀掉其中一个进程,以免影响数据库的正常稳定运行.

6、技术人员



阅读(1651) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~