Oracle对于死锁的处理方法
Oracle数据库出现死锁的时候可以按照以下处理步骤加以解决:
第一步:尝试在sqlplus中通过sql命令进行删除,如果能够删除成功,则万事大吉!但通常情况下,出现死锁时,想通过命令行或者通过Oracle的管理工具删除有死锁的session,oracle只会将该session标记为killed,但无法清除掉,往往需要通过第二步在操作系统层级进行删除!
ConnectedtoOracle9iEnterpriseEditionRelease9.2.0.1.0 Connectedasquik SQL>selectxidusn,object_id,session_id,locked_modefromv$locked_object;--查死锁的对象,获取其SESSION_ID XIDUSNOBJECT_IDSESSION_IDLOCKED_MODE ----------------------------------------- 1030724293 1030649293 SQL>selectusername,sid,serial#fromv$sessionwheresid=29;--根据上步获取到的sid查看其serial#号 USERNAMESIDSERIAL# -------------------------------------------------- QUIK2957107 SQL>altersystemkillsession'29,57107';--删除进程,如已经删除过,则会报ora-00031的错误;否则oracle会将该session标记为killed状态,等待一段时间看能否会自动消失,如长时间消失不掉,则需要做后续步骤 altersystemkillsession'29,57107' ORA-00031:sessionmarkedforkill SQL>selectpro.spidfromv$sessionses,v$processprowhereses.sid=29andses.paddr=pro.addr;--查看spid号,以便在操作系统中根据该进程号删除进程 SPID ------------ 2273286
第二步:进入操作系统进行删除进程,本示例的操作系统是IBMaix。
MicrosoftWindowsXP[版本5.1.2600] (C)版权所有1985-2001MicrosoftCorp. C:\DocumentsandSettings\Administrator>telnet10.73.52.7--通过telnet远程登陆到数据库服务器 AIXVersion5 (C)CopyrightsbyIBMandbyothers1982,2005.
login:root--录入用户名 root'sPassword:--录入密码 ******************************************************************************* ** ** *WelcometoAIXVersion5.3!* ** ** *PleaseseetheREADMEfilein/usr/lpp/bosforinformationpertinentto* *thisreleaseoftheAIXOperatingSystem.* ** ** ******************************************************************************* Lastunsuccessfullogin:FriApr2314:42:57BEIDT2010on/dev/pts/1from10.73 .52.254 Lastlogin:FriApr2315:27:50BEIDT2010on/dev/pts/2from10.73.52.254 #ps-ef|grep2273286--查看进程详情 root22898642494636017:07:15pts/10:00grep2273286 oracle22732861014:38:24-0:21oracleQUIK(LOCAL=NO) #kill-92273286--删除进程,小心操作,别写错进程号,如果oracle的关键进程被删,数据库会崩溃的! #ps-ef|grep2273286--再次查看 root22898642494636017:07:15pts/10:00grep2273286 ForWindows,attheDOSPrompt:orakillsidspid ForUNIXatthecommandline>kill–9spid