今天检查数据库中的备份输出脚本时,发现RMAN备份出现了错误。


解决JOB长时间未完成的问题。




在前面一篇文章中,描述了对当前问题的分析,并简单分析了数据库中未完成的JOB,下面看看导致RMAN无法登陆的原因是否与JOB未完成的原因一致:


bash-3.00$ rman target /


恢复管理器: Release10.2.0.3.0 - Production on星期二5月26 15:30:17 2009


Copyright (c) 1982, 2005, Oracle.  All rights reserved.


在RMAN连接被挂起的时候,看看数据库中的会话在等待什么:


SQL> SELECT PROGRAM, A.SID, LMODE, REQUEST, CTIME, BLOCK


 2  FROM V$SESSION A, V$LOCK B


 3  WHERE A.SID = B.SID


 4  AND A.USERNAME IS NOT NULL;


PROGRAM                               SID      LMODE    REQUEST      CTIME      BLOCK


------------------------------ ---------- ---------- ---------- ---------- ----------


oracle@ahrac1 (J010)                  118          3          0     228786          2


oracle@ahrac1 (J010)                  118          6          0     228789          2


oracle@ahrac1 (J006)                  102          6          0     225186          2


rman@ahrac1 (TNS V1-V3)                52          5          0        171          1


rman@ahrac1 (TNS V1-V3)                52          4          0        171          0


oracle@ahrac1 (J005)                  289          3          0     225183          2


oracle@ahrac1 (J005)                  289          6          0     225189          2


oracle@ahrac1 (J006)                  102          3          0     225165          2


oracle@ahrac1 (J010)                  118          3          0     228786          2


oracle@ahrac1 (J010)                  118          6          0     228786          2


oracle@ahrac1 (J005)                  289          6          0     225183          2


已选择11行。


SQL> SELECT SID, EVENT, P1TEXT, P1, P2TEXT, P2, SECONDS_IN_WAIT


 2  FROM V$SESSION


 3  WHERE PROGRAM LIKE 'rman%';


      SID EVENT                        P1TEXT             P1 P2TEXT    P2 SECONDS_IN_WAIT


---------- ---------------------------- ---------- ---------- -------- --- ---------------


       52 control file parallel write  files               3 block#   813             286


      225 SQL*Net message from client  driver id  1650815232 #bytes     1             287


从V$LOCK的查询看,RMAN进程居然阻塞了其他会话:


SQL> SELECT A.SID, B.SID


 2  FROM V$LOCK A, V$LOCK B


 3  WHERE A.BLOCK = 1


 4  AND B.REQUEST > 0


 5  AND A.ID1 = B.ID1


 6  AND A.ID2 = B.ID2;


      SID        SID


---------- ----------


      327        160


       52        160


      327        320


       52        320


已选择4行。


SQL> SELECT SID, PROGRAM    


 2  FROM V$SESSION


 3  WHERE SID IN (327, 160, 320);


      SID PROGRAM


---------- ----------------------------------------


      160 oracle@ahrac1 (ARC0)


      320 oracle@ahrac1 (ARC1)


      327 oracle@ahrac1 (CKPT)


可以看到,被锁住的系统进程时归档进程。不过这里并没有体现是什么操作导致了RMAN进程被锁。


根据目前分析的信息,问题出现时间似乎是在23日晚17点到24日凌晨1点左右,随后的一些操作都是正常的,问题最早表现都是在等待读取远端缓存,而这些处于等待状态的会话由于持有了一些共享资源,从而导致一些其他的会话无法工作。Rman进程无法连接怀疑就是共享资源被占用造成的。根据这些现象,怀疑可能是网络的瞬间闪断,造成了通信问题,使得一些会话永远处于等待远端缓存的状态。而RACGMAIN CHECK很可能是Oracle用来监测另一个节点状态的。


如果是这个原因造成的,那么应该并不需要重启数据库,就可以解决这个问题,只需要找到最早占用资源的会话,通过操作系统工具将其杀掉,就可以释放共享资源。


SQL> SELECT SID, TYPE, ID1, ID2, LMODE, CTIME


 2  FROM V$LOCK


 3  WHERE ADDR IN (SELECT ADDR FROM V$TRANSACTION WHERE START_DATE < TRUNC(SYSDATE));


      SID TY        ID1        ID2      LMODE      CTIME


---------- -- ---------- ---------- ---------- ----------


      144 TX     655449     137382          6     255259


      118 TX     262181      87690          6     230096


      289 TX     458770      86777          6     226493


      277 TX     524320      89189          6     241410


SQL> SELECT PROGRAM              


 2  FROM V$SESSION


 3  WHERE SID IN (144, 118, 289, 277);


PROGRAM


----------------------------------------


oracle@ahrac1 (J010)


oracle@ahrac1 (m000)


oracle@ahrac1 (m001)


oracle@ahrac1 (J005)


SQL> SELECT SPID          


 2  FROM V$PROCESS, V$SESSION


 3  WHERE PADDR = ADDR


 4  AND SID IN (144, 118, 289, 277);


SPID


------------


17895


13387


2683


15807


JOB进程和Mnnn进程都属于轻量级进程,杀掉并不会影响数据库的运行,下面执行操作系统命令杀掉对应的进程:


SQL> host


$ kill -9 17895


$ kill -9 13387


$ kill -9 2683


$ kill -9 15807


$ exit


由于还有1个JOB在没有启动事务,不过停在等待library cache lock的状态,同样通过操作系统命令将进程结束:


SQL> SELECT SPID FROM V$PROCESS


 2  WHERE ADDR IN (SELECT PADDR FROM V$SESSION WHERE SID = 102);


SPID


------------


13389


SQL> HOST kill -9 13389


检查现在系统状态:


SQL> SELECT SID, JOB, LAST_DATE, THIS_DATE


 2  FROM DBA_JOBS_RUNNING;


      SID        JOB LAST_DATE           THIS_DATE


---------- ---------- ------------------- -------------------


      113          4 2009-05-10 00:00:05 2009-05-26 15:59:50


      257         27 2009-05-17 01:00:03 2009-05-26 15:59:50


SQL>COLWHAT FORMAT A50


SQL> SELECT JOB, WHAT, LOG_USER, LAST_DATE, NEXT_DATE


 2  FROM DBA_JOBS


 3  WHERE JOB = 74;


      JOB WHAT                           LOG_USER   LAST_DATE           NEXT_DATE


---------- ------------------------------ ---------- ------------------- -------------------


       74 P_Project_Stat;                GPO        2009-05-26 16:04:56 2009-05-27 01:00:00


可以看到JOB74已经顺利执行完成,但是另外两个JOB执行一点时间就停下了:


SQL> SELECT MESSAGE      


 2  FROM V$SESSION_LONGOPS


 3  WHERE SID IN (113, 257)


 4  AND TOTALWORK != SOFAR;


MESSAGE


-----------------------------------------------------------------------------------


Gather Schema Statistics: Schema : 58 out of 138 Objects done


Gather Table's Index Statistics: Table CAT_INVITE_COMM : 3 out of 5 Indexes done


Gather Table Partition Statistics: Table EMED_WEB_LOG : 10 out of 20 Partitions done


Gather Schema Statistics: Schema : 77 out of 444 Objects done


SQL> SELECT SID, EVENT, P1TEXT, P1, SECONDS_IN_WAIT


 2  FROM V$SESSION_WAIT


 3  WHERE SID IN (113, 257);


      SID EVENT                          P1TEXT             P1 SECONDS_IN_WAIT


---------- ------------------------------ ---------- ---------- ---------------


      113 enq: CF - contention           name|mode  1128660996              37


      257 enq: CF - contention           name|mode  1128660996              70


SQL> SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, CTIME, BLOCK


 2  FROM V$LOCK


 3  WHERE SID IN (113, 257);


      SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK


---------- -- ---------- ---------- ---------- ---------- ---------- ----------


      113 JQ          0          4          6          0       1428          2


      113 CF          0          0          0          4         62          0


      257 CF          0          0          0          4         95          0


      257 JQ          0         27          6          0       1428          2


      257 TM         18          0          3          0        994          2


      113 TX      65580      89361          6          0        961          2


      257 TX     196689      87608          6          0        994          2


已选择7行。


而且RMAN进程报错依旧,看来问题只解决了一部分。


考虑到RAC两个实例都可能出现类似的问题,在另外的实例上查找长时间占用锁的会话,以及一直在运行的SQL语句:


SQL> SELECT A.INST_ID, A.SID, B.INST_ID, B.SID


 2  FROM GV$LOCK A, GV$LOCK B


 3  WHERE A.INST_ID = B.INST_ID


 4  AND A.BLOCK = 1


 5  AND B.REQUEST > 0


 6  AND A.ID1 = B.ID1


 7  AND A.ID2 = B.ID2;


  INST_ID        SID    INST_ID        SID


---------- ---------- ---------- ----------


        2        125          2        141


        2        125          2        331


SQL> SELECT SID, JOB, LAST_DATE, THIS_DATE        


 2  FROM DBA_JOBS_RUNNING;


未选定行


SQL> SELECT SID, USERNAME, PROGRAM, SERVICE_NAME


 2  FROM V$SESSION


 3  WHERE SID IN (125, 141, 331);


      SID USERNAME        PROGRAM                        SERVICE_NAME


---------- --------------- ------------------------------ ---------------------


      125 GPO_SELE        oracle@newreport (TNS V1-V3)   tradedb.us.oracle.com


      141 BEIJING_SELE    oracle@newreport (TNS V1-V3)   tradedb.us.oracle.com


      331 ZHEJIANG_SELE   oracle@newreport (TNS V1-V3)   tradedb.us.oracle.com


这三个连接都是远端数据库连接,用来同步数据的,先杀掉这3个会话对应的进程:


SQL> SELECT SPID


 2  FROM V$PROCESS


 3  WHERE ADDR IN (SELECT PADDR FROM V$SESSION WHERE SID IN (125, 141, 331));


SPID


------------


20741


20681


21382


SQL> HOST


$ kill -9 20741


$ kill -9 20681


$ kill -9 21382


$ exit


检查长时间持有锁的会话,并清除:


SQL> SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, CTIME, BLOCK


 2  FROM V$LOCK


 3  WHERE CTIME > 86400*2


 4  AND CTIME < 86400*10;


      SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK


---------- -- ---------- ---------- ---------- ---------- ---------- ----------


      121 WF          0          0          4          0     258588          2


SQL> SELECT SPID, A.PROGRAM


 2  FROM V$SESSION A, V$PROCESS B


 3  WHERE ADDR = PADDR


 4  AND SID = 121;


SPID         PROGRAM


------------ ------------------------------


13433        oracle@ahrac2 (m000)


检查刚才停顿的JOB:


SQL> SELECT SID, JOB, LAST_DATE, THIS_DATE


 2  FROM DBA_JOBS_RUNNING;


      SID        JOB LAST_DATE           THIS_DATE


---------- ---------- ------------------- -------------------


      257         27 2009-05-17 01:00:03 2009-05-26 15:59:50


SQL> SELECT MESSAGE      


 2  FROM V$SESSION_LONGOPS


 3  WHERE SID = 257


 4  AND TOTALWORK != SOFAR;


MESSAGE


------------------------------------------------------------------------------


Gather Schema Statistics: Schema : 193 out of 444 Objects done


至此,数据库中未完成的JOB的问题已经解决,不过RMAN进程还是无法连接到数据库中,错误依旧。


看来问题比想象中的还要复杂。


oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html