今天检查数据库中的备份输出脚本时,发现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