ORACLE锁等待的处理方法

ORACLE锁等待的处理方法

前言:锁等待的管理是数据库管理员在日常工作中会碰到较多的一个问题,一般来说大型的ERP锁等待的处理会相对较少,小型的应用系统锁等待会相对比较多。

  常规的锁等待的处理方法如下:

  1) 先查找持有锁的对象:

  脚本:select a.sid, b.spid from (select s.sid, s.paddr from v$session s,v$lock l WHERE l.sid = s.sid and l.block=1) a, v$process b where a.paddr=b.addr;

  2)kill相应的session:

  脚本:alter system kill session 'sid,serial#';

  以上的操作可以处理大约80%的锁等待的问题,还有20%的锁等待问题通过以上的语句是解决不了的,最近在就碰到了一个,当进行kill session的时候出现了提示"ORA-00031: session marked for kill",这个问题可以有两个处理方法:

  方法一、重启数据库:这个方法肯定是不推荐的,每个公司对系统的可用性都是有很高的要求的,一旦重启了系统就表示这个重启的过程中系统属于不可用的状态,IT的系统可用性就降低了。(该方法适合不同Oracle且连sqlplus都不知道怎么用的朋友)

  方法二、从操作系统进行杀线程的操作,因为unix和windows操作系统的不一样,所以处理的方法也有些不一样;

  1)unix和Linux下面的操作步骤如下:

  a)根据sid的信息找出操作系统的进程信息

  脚本:select p.spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=&SID;

  SQL> select p.spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=&SID;Enter value for sid: 23old 1: select p.spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=&SIDnew 1: select p.spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=23SPID OSUSER PROGRAM------------ ---------------- -----------------------------------------8782014 ecqadm dw.sapECQ_DVEBMGS00@joeoneecq (TNS V1-V3)

  b) root用户下,通过操作系统进行杀进程

  脚本:kill -9 8782014

  2)由于windows操作系统下面oracle在任务管理只能查看一个oracle.exe的进程,当然不能直接对这个进程进行结束。oracle提供了相应的操作工具orakill,详细的操作如下:

  C:\Users\Administrator>orakill orakillUsage: orakill sid threadwhere sid = the Oracle instance to targetthread = the thread id of the thread to killThe thread id should be retrieved from the spid column of a query such as:select spid, osuser, s.program fromv$process p, v$session s where p.addr=s.paddrorakill sid thread

  sid:表示要杀死的进程属于的实例名

  thread:是要杀掉的线程号,即第3步查询出的spid。

  例:c:>orakill orcl 8782014


你可能感兴趣的:(Oracle)