您在这里:首页 > 学员专区 > 技术文章
Oracle视频
Oracle
CUUG课程

一次RMAN备份报错的诊断过程(三)

 

今天检查数据库中的备份输出脚本时,发现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进程还是无法连接到数据库中,错误依旧。

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

 

 

(以上内容摘于网络,如有侵权,请告之,将第一时间删除)

相关文章 [上一篇] 一次RMAN备份报错的诊断过程(二)
010-88589926(88587026)
CUUG热门培训课程
Oracle DBA就业培训
CUUG名师
网络课程
技术沙龙
最新动态

总机:(010)-88589926,88589826,88587026 QQ讨论群:243729577 182441349 邮箱:cuug_bj@cuug.com
通信地址:北京市海淀区紫竹院路98号北京化工大学科技园609室(CUUG)邮政编码:100089 
中国UNIX用户协会 Copyright 2010  ALL Rights Reserved 北京神脑资讯技术有限公司
京ICP备11008061号  京公网安备110108006275号