通过几个步骤有效关闭Oracle死锁进程-和释放状态为killed的session
- 格式:doc
- 大小:280.50 KB
- 文档页数:9
Oracle对于死锁的处理⽅法Oracle数据库出现死锁的时候可以按照以下处理步骤加以解决:第⼀步:尝试在sqlplus中通过sql命令进⾏删除,如果能够删除成功,则万事⼤吉!但通常情况下,出现死锁时,想通过命令⾏或者通过Oracle的管理⼯具删除有死锁的session,oracle只会将该session标记为killed,但⽆法清除掉,往往需要通过第⼆步在操作系统层级进⾏删除!Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0Connected as quikSQL> select xidusn, object_id, session_id, locked_mode from v$locked_object; --查死锁的对象,获取其SESSION_IDXIDUSN OBJECT_ID SESSION_ID LOCKED_MODE---------- ---------- ---------- -----------10 30724 29 310 30649 29 3SQL> select username,sid,serial# from v$session where sid=29; --根据上步获取到的sid查看其serial#号USERNAME SID SERIAL#------------------------------ ---------- ----------QUIK 29 57107SQL> alter system kill session '29,57107'; --删除进程,如已经删除过,则会报ora-00031的错误;否则oracle会将该session标记为killed状态,等待⼀段时间看能否会⾃动消失,如长时间消失不掉,则需要做后续步骤alter system kill session '29,57107'ORA-00031: session marked for killSQL> select pro.spid from v$session ses,v$process pro where ses.sid=29 and ses.paddr=pro.addr; --查看spid号,以便在操作系统中根据该进程号删除进程SPID------------2273286第⼆步:进⼊操作系统进⾏删除进程,本⽰例的操作系统是IBM aix。
Oracle锁处理、解锁⽅法1、查询锁情况select sid,serial#,event,BLOCKING_SESSION from v$session where event like '%TX%';2、根据SID查询具体信息(可忽略)select sid,serial#,username,machine,blocking_session from v$session where sid=<SID>;3、杀掉会话#根据1和2中查到的SID和SERIAL# 定位会话,并杀掉ALTER SYSTEM DISCONNECT SESSION '<SID>,<SERIAL>' IMMEDIATE;或ALTER SYSTEM KILL SESSION '<SID>,<SERIAL>';附件:#查询阻塞脚本col waiting_session for a20col lock_type for a15col mode_requested for a10col mode_held for a10col lock_id1 for a10col lock_id2 for a10set linesize 120set pagesize 999with dba_locks_cust as(SELECT inst_id||'_'||sid session_id,DECODE (TYPE,'MR', 'Media Recovery','RT', 'Redo Thread','UN', 'User Name','TX', 'Transaction','TM', 'DML','UL', 'PL/SQL User Lock','DX', 'Distributed Xaction','CF', 'Control File','IS', 'Instance State','FS', 'File Set','IR', 'Instance Recovery','ST', 'Disk Space Transaction','TS', 'Temp Segment','IV', 'Library Cache Invalidation','LS', 'Log Start or Switch','RW', 'Row Wait','SQ', 'Sequence Number','TE', 'Extend Table','TT', 'Temp Table',TYPE)lock_type,DECODE (lmode,0, 'None', /* Mon Lock equivalent */1, 'Null', /* N */2, 'Row-S (SS)', /* L */3, 'Row-X (SX)', /* R */4, 'Share', /* S */5, 'S/Row-X (SSX)', /* C */6, 'Exclusive', /* X */TO_CHAR (lmode))mode_held,DECODE (request,0, 'None', /* Mon Lock equivalent */1, 'Null', /* N */2, 'Row-S (SS)', /* L */3, 'Row-X (SX)', /* R */4, 'Share', /* S */5, 'S/Row-X (SSX)', /* C */6, 'Exclusive', /* X */TO_CHAR (request))mode_requested,TO_CHAR (id1) lock_id1,TO_CHAR (id2) lock_id2,ctime last_convert,DECODE (block,0, 'Not Blocking', /* Not blocking any other processes */1, 'Blocking', /* This lock blocks other processes */2, 'Global', /* This lock is global, so we can't tell */TO_CHAR (block))blocking_othersFROM gv$lock),lock_temp as(select * from dba_locks_cust),lock_holder as(select w.session_id waiting_session,h.session_id holding_session,w.lock_type,h.mode_held,w.mode_requested,w.lock_id1,w.lock_id2from lock_temp w, lock_temp hwhere h.blocking_others in ('Blocking','Global')and h.mode_held != 'None'and h.mode_held != 'Null'and w.mode_requested != 'None'and w.lock_type = h.lock_typeand w.lock_id1 = h.lock_id1and w.lock_id2 = h.lock_id2),lock_holders as(select waiting_session,holding_session,lock_type,mode_held,mode_requested,lock_id1,lock_id2from lock_holderunion allselect holding_session, null, 'None', null, null, null, nullfrom lock_holderminusselect waiting_session, null, 'None', null, null, null, nullfrom lock_holder)select lpad(' ',3*(level-1)) || waiting_session waiting_session,lock_type,mode_requested,mode_held,lock_id1,lock_id2from lock_holdersconnect by prior waiting_session = holding_sessionstart with holding_session is null;总结以上所述是⼩编给⼤家介绍的Oracle锁处理、解锁⽅法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
Oracle死锁问题及解决办法死锁通常是2个及以上线程共同竞争同⼀资源⽽造成的⼀种互相等待的僵局。
我们看下图所⽰场景。
线程1执⾏的事务先更新资源1,然后更新资源2。
线程2涉及到的事务先更新资源2,然后更新资源1。
这种情况下,很容易出现你等我我等你,导致死锁。
我⽤Oracle数据库来模拟这种场景的死锁。
●service类如下PayAccountServiceMock类, up⽅法和up2⽅法,这2个⽅法使⽤了spring事务,逻辑是根据账户id来更新两条账户的⾦额。
不过,两个⽅法更新两条账户记录的顺序是相反的。
我们⽤后⾯的testcase很容易就能模拟出Oracle死锁。
package com.xxx.accounting;import org.springframework.transaction.annotation.Transactional;@Service@Slf4jpublic class PayAccountServiceMock {@Autowiredprivate TAccTransService tAccTransService;@Transactionalpublic void up() throws InterruptedException {tAccTransService.updateBalance("89900000426016346075");Thread.sleep(RandomUtils.nextInt(100, 300));select("89900000426016346075");tAccTransService.updateBalance("PF00060");}@Transactionalpublic void up2(TAccTrans at4) throws InterruptedException {tAccTransService.updateBalance("PF00060");Thread.sleep(550);tAccTransService.updateBalance("89900000426016346075");}@Transactionalpublic void select(String id) {tAccTransService.selectByPrimaryKey(id);try {Thread.sleep(1100);} catch (InterruptedException e) {e.printStackTrace();}}}View Code●testcase类如下Junit测试类,使⽤倒计数门栓(CountDownLatch,就是JUC包下倒计时门栓,个⼈觉得⽤“倒计数门栓”感觉更合适~)来保证多线程同时执⾏,达到并⾏处理的效果。
解决Oracle数据库死锁解决Oracle数据库死锁2011年01月12日星期三08:35 P.M.解决Oracle数据库死锁介绍本文我们尝试总结在多个用户并发情况下,如何识别和解决删除操作期间发生的死锁问题,在开始之前,我们先简单描述一下什么是死锁以及什么东西会导致死锁。
死锁在任何数据库中发生死锁都是不愉快的,即使是在一个特殊的情况下发生也是如此,它们会减小应用程序的接受程度(ACCEPTANCE),因此避免并正确解释死锁是非常重要的。
当两个或更多用户相互等待锁定的数据时就会发生死锁,发生死锁时,这些用户被卡住不能继续处理业务,Oracle自动检测死锁并解决它们(通过回滚一个包含在死锁中的语句实现),释放掉该语句锁住的数据,回滚的会话将会遇到Oracle错误"ORA-00060:等待资源时检测到死锁"。
是什么导致了死锁?明确地锁定表是为了保证读/写一致性,未建立索引的外键约束,在相同顺序下表不会锁住,没有为数据段分配足够的存储参数(主要是指INITTRANS,MAXTRANS和PCTFREE参数)很容易引发突发锁和死锁,原因是多种多样的,需要重新逐步审查。
识别死锁当Oracle数据库检测到死锁时(Oracle错误消息:ORA-00060),相应的消息就写入到警告日志文件中(alert.log),另外还会在USER_DUMP_DEST目录下创建一个跟踪文件,分析警告日志文件和跟踪文件是非常耗时的。
下面是一个警告日志文件示例:Mon Aug 07 09:14:42 2007 ORA-000060:Deadlock detected.Moreinfo in file e:\oracle\admin\GEDEON\udump\ORA01784.TRC.下面是从跟踪文件中节选出来的片段,从其中我们可以看出是哪个语句创造了死锁,相关的语句和被锁定的资源已经标记为粗体。
/users/ora00/log/odn_ora_ 1097872.trc Oracle9i Enterprise Edition Release 9.2.0.8.0-64bit Production With the Partitioning,OLAP and Oracle Data Mining options JServer Release 9.2.0.8.0-Production ORACLE_HOME=/soft/ora920 System name:AIX Node name:beaid8 Release:2 Version:5 Machine:00C95B0E4C00 Instance name:ODN Redo thread mounted by this instance:1 Oracle process number:17 Unix process pid:1097872,image:oracle@beaid8(TNS V1-V3)*2007-06-04 14:41:04.080*SESSION ID:(10.6351)2007-06-04 14:41:04.079 DEADLOCK DETECTED(ORA-00060)The following deadlock is not an ORACLE error.It is adeadlock due to user error in the design of an application orfrom issuing incorrect ad-hoc SQL.The following information may aidin determining the deadlock:Deadlock graph:---Blocker(s)-----Waiter(s)---Resource Name process session holds waits process session holds waits TM-00001720-00000000 17 10 SX 16 18 SX SSX TM-0000173a-00000000 16 18 SX 17 10 SX SSX session 10:DID 0001-0011-00000002session 18:DID 0001-0010-00000022 session 18:DID 0001-0010-00000022session 10:DID 0001-0011-00000002 Rows waited on:Session 18:obj-rowid=00001727-AAABcnAAJAAAAAAAAA(dictionary objn-5927,file-9,block-0,slot-0)Session 10:obj-rowid=00001727-AAABcnAAJAAAAAAAAA(dictionary objn-5927,file-9,block-0,slot-0)Information on the OTHER waiting sessions:Session 18:pid=16 serial=2370 audsid=18387 user:21/ODN O/S info:user:mwpodn00,term:unknown,ospid:,machine:beaida program:JDBC Thin Client application name:JDBC Thin Client,hash value=0 Current SQL Statement:DELETE FROM ODNQTEX WHERE EX_ID=:B1 End of information on OTHER waiting sessions.Current SQL statement for this session:DELETE FROM ODNQTFN WHERE FN_ID_EXIGENCE_EX=:B1---PL/SQL Call Stack---object line object handle number name 7000000135 f7fd8 34 procedure ODN.ODNQPDR 700000013 5f89f0 16 procedure ODN.ODNQPZB我们可以使用企业管理器来决定保留所有的锁还是释放掉它们,为了便于说明,我们打开2个sqlplus实例会话(在此期间同时发生了死锁)来一起调式,当每个语句执行完毕后,我们看到锁仍然保留下来了,它可以帮助我们识别出是哪个资源引起的死锁。
happydbaEnjoy your work, and your life!Skip to Content ↓Home通过几个步骤有效关闭Oracle死锁进程,和释放状态为killed的sessionMar 8th, 2009by happydba.有效关闭Oracle死锁进程的具体步骤:1.查哪个过程被锁查V$DB_OBJECT_CACHE视图:SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER=’过程的所属用户’ AND LOCKS!=’0′;V$DB_OBJECT_CACHEThis view displays database objects that are cached in the library cache. Objects include tables, indexes, clusters, synonym definitions, PL/SQL procedures and packages, and triggers.2. 查是哪一个SID,通过SID可知道是哪个SESSION 查V$Access视图:SELECT * FROM V$ACCESS WHERE OWNER=’过程的所属用户’ AND NAME=’刚才查到的过程名’;V$ACCESSV$ACCESS displays information about locks that are currently imposed on library cache objects. The locks are imposed to ensure that they are not aged out of the library cache while they are required for SQL execution.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).再杀操作系统进程:。
oracle数据库锁表解决办法Oracle数据库是一款非常流行的数据库管理系统,其优势在于能够支持多用户,并发操作,数据安全稳定。
然而,由于其特殊性,在使用Oracle数据库时,经常会遇到数据库锁表的现象。
当某个表被其他用户锁定时,其他用户就无法访问该表,这给数据管理带来了巨大的困难,本文就介绍Oracle数据库锁表解决办法,希望对大家有所帮助。
1.询该表被锁定的用户在Oracle数据库中,系统提供了一个方法来查询该表被锁定的用户,可以使用如下语句:SELECT SID, SERIAL#, USERNAMEFROM v$LOCKWHERE id1 = 表名其中,SID和SERIAL#分别表示会话ID和会话号;USERNAME表示锁表的用户名。
通过查询,可以知道是哪个用户锁定了该表,这样可以帮助我们更好地分析和解决数据库锁表的问题。
2.决数据库锁表的问题(1)强制结束锁表的会话如果锁表的用户是一个普通的用户,此时可以使用aletr system kill session语句将其会话强制结束,这样就可以释放锁表的资源。
但是,要注意的是,如果锁表的用户是sydba或sysoper之类的特权用户,强制结束会话可能产生不可预料的后果,因此不推荐使用这种方法。
(2)使用rollback释放表锁如果锁表的用户已经执行了一些更新操作,可以使用rollback 语句将其回滚,这样就可以释放表的锁。
另外,在Oracle数据库中,还提供了一种特殊的表锁,叫做DML锁,它是Oracle数据库用来实现多版本控制的,如果遇到这种表锁,只有等当前用户执行commit 操作之后,才能释放锁。
3.防数据库锁表问题上文介绍了如何解决数据库锁表问题,但为了避免系统出现锁表的现象,还需要一些预防性措施。
(1)严格控制访问权限数据库系统为了安全起见,应当严格控制用户的访问权限,只允许被授权的用户拥有该表的读写权限,这样就可以限制非认证用户对表的访问,从而减少锁表的可能性。
如何完全杀掉带锁的进程并释放资源Oracle数据库管理人员经常会遇到这样的问题:状态已被置为"killed"的进程长时间锁定系统资源不释放。
通常的做法是重启数据库,但这样就以为着数据库服务的中断。
这里介绍另外一种好用方便的方法: 在操作系统级强行杀掉那些进程。
1.下面的语句用来查询哪些对象被锁:SQL> col object_name for a30SQL> col machine for a20SQL> select object_name,machine,s.sid,s.serial#from v$locked_object l,dba_objects o ,v$session swhere l.object_id = o.object_id and l.session_id=s.sid;2.下面的语句用来杀死一个进程:SQL> alter system kill session '42,21993'; (其中24,111分别是上面查询出的sid,serial#)可以用如下查询批量得到上面类似的语句:SQL> select 'alter system kill session '''||s.sid||','||s.serial#||'''; ' from v$locked_object l,dba_objects o ,v$session swhere l.object_id = o.object_id and l.session_id=s.sid;3.如果利用上面的命令杀死一个进程后,进程状态被置为 "killed", 但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先获得进程(线程)号:SQL> select spid, osuser, s.programfrom v$session s,v$process pwhere s.paddr=p.addr and s.sid=#sid; (#sid是上面的sid)4.在操作系统中杀掉相应的进程(线程):1)在Linux上,用root身份执行命令:$ kill -9 12345 (12345是第3步查询出的spid)2)在windows 用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:orakill sid threadsid:表示要杀死的进程属于的实例名thread:是要杀掉的线程号,即第3步查询出的spid例:c:\> orakill orcl 12345完全可以写一个组合查询的存储过程来自动执行上述四步操作,方便地杀光所有不自动释放资源的进程,但一般情况下不推荐这样做,毕竟在系统中用root用户kill进程本身就是带有一定风险的!--End--。
Oracle常见死锁发生的原因以及解决方法Oracle常见死锁发生的原因以及解决办法一,删除和更新之间引起的死锁造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖。
这里列举一个对同一个资源的争抢造成死锁的实例。
Oracle 10g, PL/SQL version 9.2CREATE TABLE testLock( ID NUMBER,test VARCHAR(100) )COMMITINSERT INTO testLock VALUES(1,'test1');INSERT INTO testLock VALUES(2,'test2');COMMIT;SELECT * FROM testLock1. ID TEST2.---------- ----------------------------------3. 1 test14. 2 test2死锁现象的重现:1)在sql 窗口执行:SELECT * FROM testLock FOR UPDATE; -- 加行级锁并对内容进行修改,不要提交2)另开一个command窗口,执行:delete from testLock WHERE ID=1;此时发生死锁(注意此时要另开一个窗口,不然会提示:POST THE CHANGE RECORD TO THE DATABASE. 点yes 后强制commit):3)死锁查看:1.SQL> select ername,l.object_id, l.session_id,s.serial#, s.lockwait,s.status,s.machine,s.program from v$session s,v$locked_object l where s.sid = l.session_id;</p><p>USER NAME SESSION_ID SERIAL# LOCKWAIT STATUS MACHINE PROGRAM2.---------- ---------- ---------- -------- -------- ---------------------- ------------3.SYS 146 104 INACTIVE WORKGROUP\J-THINK PLSQLDev.exe4.SYS 144 145 20834474 ACTIVE WORKGROUP\J-THINK PLSQLDev.exe字段说明:Username:死锁语句所用的数据库用户;SID: session identifier,session 标示符,session 是通信双方从开始通信到通信结束期间的一个上下文。
happydbaEnjoy your work, and your life!Skip to Content ↓Home通过几个步骤有效关闭Oracle死锁进程,和释放状态为killed的sessionMar 8th, 2009by happydba.有效关闭Oracle死锁进程的具体步骤:1.查哪个过程被锁查V$DB_OBJECT_CACHE视图:SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER=’过程的所属用户’ AND LOCKS!=’0′;V$DB_OBJECT_CACHEThis view displays database objects that are cached in the library cache. Objects include tables, indexes, clusters, synonym definitions, PL/SQL procedures and packages, and triggers.2. 查是哪一个SID,通过SID可知道是哪个SESSION 查V$Access视图:SELECT * FROM V$ACCESS WHERE OWNER=’过程的所属用户’ AND NAME=’刚才查到的过程名’;V$ACCESSV$ACCESS displays information about locks that are currently imposed on library cache objects. The locks are imposed to ensure that they are not aged out of the library cache while they are required for SQL execution.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中,状态已被置为”killed“的进程长时间锁定系统资源,不释放,有一个比重启数据库更好的方法,就是在操作系统级强行杀掉那些进程。
1.下面的语句用来查询哪些对象被锁:col object_name for a30col machine for a20select object_name,machine,s.sid,s.serial#from v$locked_object l,dba_objects o ,v$session swhere l.object_id = o.object_id and l.session_id=s.sid;V$LOCKED_OBJECTThis view lists all locks acquired by every transaction on the system. It shows which sessions are holding DML locks (that is, TM-type enqueues) on what objects and in what mode.2.下面的语句用来杀死一个进程:alter system kill session '42,21993';(其中24,111分别是上面查询出的sid,serial#)可以用如下查询批量得到上面类似的语句:select 'alter system kill session ''' ||s.sid||','||s.serial#||'''; 'from v$locked_object l,dba_objects o ,v$session swhere l.object_id = o.object_id and l.session_id=s.sid;3.如果利用上面的命令杀死一个进程后,进程状态被置为“killed”, 但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先获得进程(线程)号:select spid, osuser, s.programfrom v$session s,v$process pwhere s.paddr=p.addr and s.sid=#sid; (#sid是上面的sid)4.在操作系统中杀掉相应的进程(线程):(1)在Linux上,用root身份执行命令:kill -9 12345(12345是第3步查询出的spid)(2)在Windows用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:orakill sid thread其中:sid:表示要杀死的进程属于的实例名thread:是要杀掉的线程号,即第3步查询出的spid。
例:c:>orakill orcl 12345注:可以写一个组合查询的存储过程来自动执行上述四步操作,方便地杀光所有不自动释放资源的进程,但一般情况下不推荐这样做,毕竟在系统中用root 用户kill进程本身就是有一定的风险的!Posted in: lock, oracle.Tagged: lock· v$access· V$DB_OBJECT_CACHE· V$LOCKED_OBJECT,killed← 如何使用IBM DS4000系列存储的远程镜像(remote mirror)功能DBMS_XPLAN.DISPLAY_AWR 和一次direct path write temp等待事件的诊断→Leave a Reply(required)(will not be published) (required)(optional)Anti-spam word: (Required)*To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.Powered by WP HashcashWordpress Hashcash needs javascript to work, but your browser has javascript disabled. Your comment will be queued in Akismet!∙Subscribe to our Feed via RSS∙Recent Postso Oracle10GR2 中的RESTORE POINTo man vmstat on HP-UXo man vmstat on AIXo远程图形界面工具–全面替代VNC和XMANAGERo F5与Oracle联袂推出优化解决方案o NirCmd v2.41 – Freeware Windows command-line toolo DataStage为整个 ETL 过程提供了一个图形化的开发环境o EZCONNECTo Java程序员的知识架构浅析o namespace in the library cache∙Categorieso压力测试o存储o互联技术o系统安全o编程o ETLo虚拟化vmwareo happydayo metalink▪7445o oracle▪10g新特性▪11g▪Advanced Replication▪备份与恢复▪安全▪DBA工作备忘录▪dbms_stats▪DDL▪event & dump▪exp&imp▪连接▪脚本▪hint▪index▪latch▪lock▪ora-err▪PL/SQL▪RAC▪shrink & redefinition▪SQL优化▪sqlplus▪tuning▪aio▪执行计划▪排错▪案例o OS & 小型机▪巡检▪hp-ux▪ibm aix▪linux▪windowso SQL SERVERo Uncategorizedo未分类Archiveso July 2010o June 2010o May 2010o April 2010o March 2010o February 2010o November 2009o September 2009o July 2009o April 2009o March 2009o February 2009o January 2009∙CalendarApril 2011M T W T F S S« Jul1 2 34 5 6 7 8 9 1011 12 13 14 15 16 1718 19 20 21 22 23 2425 26 27 28 29 30∙Pages∙Metao Registero Log in© 2011 happydba | Powered by WordPress A WordPress theme by Ravi Varma。