分类: Oracle
2013-01-16 22:42:40
Oracle死锁问题的解决方法
报送单位: 审核人:
关键字: Oracle 死锁
1、引言
每个使用关系型数据库的程序都可能遇到数据死锁的情况,Oracle数据库也不例外,虽然Oracle提供了防死锁机制,但有时还是会发生死锁现象.下面就给大家分析下ORACLE数据库死锁问题,并详细介绍问题分析的步骤,以及解决此问题的主要操作,供大家学习和参考。
2、故障现象
我在5月号做数据库巡检时发现在数据库系统日志中有一条错误信息,截图如下:
3、处理过程
1.查哪个过程被锁
查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. 查出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).能过CMD控制台,再杀操作系统进程:
ORAKILL 数据库实现 刚才查出的SPID
一定要记住,要把之前查出的Oracle死锁记下来,然后,一一对其Kill,如果Kill不干净的话,还是解决不了问题
4、原因分析
这个还是举例好理解:
有t1和t2两张表,每个表里都有一条记录。
那么在session1中更新t1,在session2中更新t2
再在session2中更新t1,这时只能叫阻塞,如果再在session1中更新t2,就死锁了。
5、经验总结
此错误主要是由于多个进程访问同一数据库时,其中每个进程拥有的锁都是其他进程所需的,由此造成每个进程都无法继续下去。简单的说,进程A等待进程B释放他的资源,B又等待A释放他的资源,这样就互相等待,从而形成的.在发现该问题出现后,应当及时查看数据库是否自动把死锁进程中的一个结束,若没有就应当手动的杀掉其中一个进程,以免影响数据库的正常稳定运行.
6、技术人员