`
my_java_life
  • 浏览: 143835 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

死锁分析以及解决(转)

阅读更多

1、发现系统cpu使用率在50%
topas :


Topas Monitor for host: DBSERVER EVENTS/QUEUES FILE/TTY
Fri Jul 2 21:33:13 2010 Interval: 2 Cswitch 1473 Readch 0.0G
Syscall 1452 Writech 0.0G
Kernel 3.6 |## | Reads 174 Rawin 0
User 49.1 |############## | Writes 175 Ttyout 216
Wait 0.0 | | Forks 0 Igets 0
Idle 47.3 |############## | Execs 0 Namei 0
Runqueue 0.5 Dirblk 0
Network KBPS I-Pack O-Pack KB-In KB-Out Waitqueue 0.0
en0 11.1K 5219.0 349.5 234.5 10.9K
en1 0.0 0.0 0.0 0.0 0.0 PAGING MEMORY
lo0 0.0 0.0 0.0 0.0 0.0 Faults 22 Real,MB 16016
Steals 2815 % Comp 80.9
Disk Busy% KBPS TPS KB-Read KB-Writ PgspIn 0 % Noncomp 19.4
hdisk1 0.0 11.0K 44.0 11.0K 0.0 PgspOut 0 % Client 19.4
dac0 0.0 0.0 0.0 0.0 0.0 PageIn 2816
dac0utm 0.0 0.0 0.0 0.0 0.0 PageOut 0 PAGING SPACE
dac1 0.0 0.0 0.0 0.0 0.0 Sios 2816 Size,MB 16384
dac1utm 0.0 0.0 0.0 0.0 0.0 % Used 59.2
hdisk0 0.0 0.0 0.0 0.0 0.0 NFS (calls/sec) % Free 40.7
hdisk2 0.0 0.0 0.0 0.0 0.0 ServerV2 0
ClientV2 0 Press:
Name PID CPU% PgSp Owner ServerV3 0 "h" for help
oracle 655514 26.7 10.2 oracle ClientV3 0 "q" to quit
ftp 1011860 0.5 0.6 root
lrud 16392 0.4 0.5 root
topas 782448 0.1 1.8 oracle
oracle 254012 0.0 17.8 oracle
oracle 385218 0.0 10.1 oracle
dtgreet 123020 0.0 1.3 root
oracle 389312 0.0 8.0 oracle

2、进入sqlplus


执行察看oracle 655514 26.7 10.2 oracle 系统进程对应的sql

SYS@ora10g>select sid,serial#,machine,username,program,sql_hash_value,sql_id, to_char(logon_time,'yyyy/mm/dd hh24:mi:ss') as login_time from v$session
where paddr in (select addr from v$process where spid in ('655514'));

SID SERIAL# MACHINE USERNAME PROGRAM SQL_HASH_VALUE SQL_ID LOGIN_TIME
---------- ---------- --------------- ------------- -------------- ------------------- -------------- --------------
572 28114 APPSERVER NC5X 2201849944 5uhv05f1mv42s 2010/07/02 08:35:58

3、查看该sql
SYS@ora10g>select sql_text from v$sqltext_with_newlines where hash_value = 2201849944 order by piece;

SQL_TEXT
----------------------------------------------------------------
update so_sale set ts='2010-07-02 14:17:09',capproveid = :1, dap
provedate = :2, fstatus = 2, daudittime = '2010-07-02 14:17:09'
where csaleid = :3


4、由于sql中有参数,查看个参数值
SYS@ora10g>select t.HASH_VALUE, t.SQL_ID, t.NAME, t.LAST_CAPTURED, t.WAS_CAPTURED, t.VALUE_STRING, t.VALUE_ANYDATA
from v$sql_bind_capture t where sql_id = '5uhv05f1mv42s';

no rows selected

5、查看系统中有无死锁
SYS@ora10g>select sess.sid,
sess.serial#,
lo.locked_mode
from v$locked_object lo,
dba_objects ao,
v$session sess
where ao.object_id = lo.object_id and lo.session_id = sess.sid; 2 3 4 5 6 7

SID SERIAL# LOCKED_MODE
---------- ---------- -----------
572 28114 3
572 28114 3
572 28114 3
572 28114 3
572 28114 3
sid 和第二步中查出的sid 相同

查看其它锁
select * from V$lock
SYS@ora10g>select sid from V$lock;

SID
----------
660
660
660
661
662
662
662
662
662
662
662

SID
----------
662
662
662
662
662
662
662
662
662
662
662

SID
----------
662
659
572
572
572
572
572
572

30 rows selected.
根据几个sid均查不到 sqltext
SYS@ora10g>select sql_fulltext from v$sqlarea where address in (select sql_address from v$session where sid in (659,660,661,662));

no rows selected

6、根据sid查看死锁的sql


select * where address = (select sql_address from v$session where sid = 572)

结果no rows

select sql_address from v$session where sid = 572;

SQL_ADDRESS
----------------
0700000373C4EA88

7、查询v$open_cursor 视图
SYS@ora10g>select * from v$open_cursor where ADDRESS ='0700000373C4EA88' ;

no rows selected

8、杀死死锁进程
SYS@ora10g>ALTER SYSTEM KILL SESSION '572,28114';

ALTER SYSTEM KILL SESSION '572,28114'
*
ERROR at line 1:
ORA-00031: session marked for kill


9、查看系统几进程
SYS@ora10g>select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=572
2 3 4 ;

SPID OSUSER
------------ ------------------------------
PROGRAM
------------------------------------------------
655514

10、进入系统
#kill -9 655514
系统恢复正常


11、返回oracle的sqlplus查看锁
SYS@ora10g>select p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_name from v$process p,v$session a, v$locked_object b,all_objects c where p.addr=a.paddr and a.process=b.process and c.object_id=b.object_id;

no rows selected
死锁解决


其中有两个问题
1、第4步查看含参数的sql找不到参数
考虑任何sql语句执行第一步都会 创建游标(Create a Cursor),而含参数的sql语句是将参数绑定给游标,很有可能是sql执行中的游标已经关闭了。
参考:oracle sql语句执行过程和http://xiarilian12.javaeye.com/blog/574715以及http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/dynviews_2114.htm

2、第5步select sid from V$lock 看到有其它一些sid为什么不能kill
SYS@ora10g>select sid,serial#,username from v$session;

SID SERIAL# USERNAME
---------- ---------- ------------------------------
634 70
635 10 NC5X
636 34 NC5X
637 1
638 2 NC5X
639 1
644 27 IUFO
645 13
650 1
651 1
653 79 NC5X

SID SERIAL# USERNAME
---------- ---------- ------------------------------
654 3 SYS
655 1
656 1
657 1
658 1
659 1
660 1
661 1
662 1
663 1
664 1

SID SERIAL# USERNAME
---------- ---------- ------------------------------
665 1

23 rows selected.

其中USERNAME为空的会话是Oracle的后台进程,对这些会话进行任何操作丢有可能造成宕机或者其它损失。

 

 

其它死锁问题收集

 

Oracle杀死死锁进程

先查看哪些表被锁住了:

 

select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;

OWNER     OBJECT_NAME     SESSION_ID LOCKED_MODE
------------------------------ -----------------
WSSB SBDA_PSHPFTDT   22 3
WSSB_RTREPOS WB_RT_SERVICE_QUEUE_TAB   24 2
WSSB_RTREPOS WB_RT_NOTIFY_QUEUE_TAB   29 2
WSSB_RTREPOS WB_RT_NOTIFY_QUEUE_TAB   39 2
WSSB SBDA_PSDBDT     47 3
WSSB_RTREPOS WB_RT_AUDIT_DETAIL     47 3

select b.username,b.sid,b.serial#,logon_time 
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;

USERNAME   SID   SERIAL# LOGON_TIME
------------------------------ ---------- -------
WSSB_RTACCESS     39     1178 2006-5-22 1
WSSB_RTACCESS     29     5497 2006-5-22 1

杀进程中的会话:

 

alter system kill session 'sid,serial#';
e.g
alter system kill session '29,5497';

如果有ora-00031错误,则在后面加immediate;alter system kill session '29,5497' immediate;

如何杀死oracle死锁进程

1.查哪个过程被锁:

查V$DB_OBJECT_CACHE视图:

SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND CLOCKS!='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)再杀操作系统进程:

KILL -9 刚才查出的SPID或ORAKILL 刚才查出的SID 刚才查出的SPID。

Oracle的死锁

查询数据库死锁:

 

select t2.username||'   '||t2.sid||'  
 '||t2.serial#||'   '||t2.logon_time||'  
 '||t3.sql_text
from v$locked_object t1,v$session t2,v$sqltext t3
where t1.session_id=t2.sid 
and t2.sql_address=t3.address
order by t2.logon_time;

查询出来的结果就是有死锁的session了,下面就是杀掉,拿到上面查询出来的SID和SERIAL#,填入到下面的语句中:

alter system kill session 'sid,serial#';

一般情况可以解决数据库存在的死锁了,或通过session id 查到对应的操作系统进程,在Unix中杀掉操作系统的进程。

 

SELECT a.username,c.spid AS os_process_id,c.pid 
AS oracle_process_id FROM v$session a,v$process c 
WHERE c.addr=a.paddr and a.sid= and a.serial#= ;

然后采用kill (unix) 或 orakill(windows )。

在Unix中:

 

ps -ef|grep os_process_id
kill -9 os_process_id
ps -ef|grep os_process_id

经常在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进程。

分享到:
评论

相关推荐

    db2死锁问题分析及解决方案

    db2死锁问题分析及解决方案,可以快速解决数据库问题。

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

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

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

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

    数据库 死锁的解决

    数据库 死锁的解决 其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B 另一个用户B 访问表B(锁住了表B),然后企图访问表A 这时用户A由于用户B已经锁住表B,它...

    HIS系统SQL Server数据库死锁问题的分析与解决.pdf

    HIS系统SQL Server数据库死锁问题的分析与解决.pdf

    SQLSERVER谈死锁的监控分析解决思路共8页.pdf

    SQLSERVER谈死锁的监控分析解决思路共8页.pdf.zip

    该如何解决MySQL中的死锁问题.txt

    解决MySQL中的死锁问题通常涉及多个方面,包括监控死锁、分析死锁原因、优化事务设计以及调整系统配置等。以下是一些解决MySQL中死锁问题的建议和方法: 监控死锁: 使用SHOW ENGINE INNODB STATUS命令来查看InnoDB...

    操作系统实验六 死锁问题实验

    通过本实验观察死锁产生的现象,考虑解决死锁问题的方法。从而进一步加深对于死锁问题的理解。掌握解决死锁问题的几种算法的编程和调试技术。练习怎样构造管程和条件变量,利用管程机制来避免死锁和饥俄问题的发生。

    操作系统 实验报告(含代码) 死锁和饥饿2 哲学家就餐问题

    3.3 解决方案(以下解决方案均可,实现一种) 3.3.1 最多允许4个哲学家同时坐在桌子周围。 3.3.2 给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之。 3.3.3 为了避免死锁,把哲学家...

    MySQL死锁的产生原因以及解决方案

    在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行。 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁...

    MySQL死锁问题分析及解决方法实例详解

    MySQL死锁问题是很多程序员在项目开发中常遇到的问题,现就MySQL死锁及解决方法详解如下: 1、MySQL常用存储引擎的锁机制 MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-level locking)或表级...

    Sql Server 死锁的监控分析解决思路

    本文主要介绍了SQL SERVER 死锁的监控分析解决思路。具有很好的参考价值。下面跟着小编一起来看下吧

    关于I2C总线死锁恢复的研究.pdf

    :介绍了I2C总线的基本原理,详细分析了I2C总线死锁现象产生的原因,提出了总线死锁恢复的各 种解决方法。并就每一种方法进行了仔细的研究,比较了各种方法的优点以及局限性,对I2C总线可用性设计提 出了指导。

    收集一些常见的 MySQL 死锁案例

    在工作过程中偶尔会遇到死锁问题,虽然这种问题遇到的概率不大,但每次遇到的时候要想彻底弄懂其原理并找到解决方案却并不容易。这个项目收集了一些常见的 MySQL 死锁案例,大多数案例都来源于网络,并对其进行分类...

    Mysql 数据库死锁过程分析(select for update)

    最近有项目需求,需要保证多台机器不拿到相同的数据,后来发现... for update经常导致数据库死锁问题,下面小编给大家介绍mysql 数据库死锁过程分析(select for update),对mysql数据库死锁问题感兴趣的朋友一起学习吧

    Java面试-彻底搞懂死锁的前世今生

    怎么避免死锁等问题展开分析,通过大量的代码和案例演示向大家描述死锁的前世今生。 快速到达看这里死锁是什么,有什么危害?写一个死锁的例子案例一:必然发生死锁案例二:两个账户转账案例三:多人多次转账发生...

    关于MySQL死锁问题的深入分析

    其实如果大家认真研读了我们之前写的3篇关于MySQL中语句加锁分析的文章,加上本篇关于死锁日志的分析,那么解决死锁问题应该也不是那么摸不着头脑的事情了。 准备工作 为了故事的顺利发展,我们需要建一个表: ...

Global site tag (gtag.js) - Google Analytics