您的位置:首页 > 数据库 > Oracle

oracle技术之一次RMAN备份报错的诊断过程(三)

2013-05-23 10:20 507 查看
今天检查数据库中的备份输出脚本时,发现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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐