RMAN刪除歸檔日誌時將ASM上空目錄同時刪除

yangtingkun發表於2009-09-01

ASM上的bug還不少,在新建的RAC環境中碰到了這個bug

 

 

在基於ASMRAC環境中準備執行IMP匯入操作,在匯入操作執行之前,先對資料庫進行了備份,隨後備份了所有的歸檔日誌並執行了刪除操作。

然後執行匯入操作,但是很快發現匯入操作被HANG住了,檢查資料庫的會話發現,會話在等待歸檔的完成。而此時資料庫的當前例項的線上日誌已經寫滿,歸檔操作則一直沒有完成。

SQL> SELECT SID, EVENT, PROGRAM          
  2  FROM V$SESSION
  3  WHERE SID = 162;

       SID EVENT                                    PROGRAM
---------- ---------------------------------------- ----------------------------------
       162 log file switch (archiving needed)       imp@ser1 (TNS V1-V3)

SQL> SELECT INSTANCE_NUMBER, INSTANCE_NAME, THREAD#
  2  FROM V$INSTANCE;

INSTANCE_NUMBER INSTANCE_NAME       THREAD#
--------------- ---------------- ----------
              1 tradedb1                  1

SQL> SELECT GROUP#, THREAD#, SEQUENCE#, ARCHIVED, STATUS
  2  FROM V$LOG;

    GROUP#    THREAD#  SEQUENCE# ARC STATUS
---------- ---------- ---------- --- ----------------
         1          1         34 NO  INACTIVE
         2          1         36 NO  INACTIVE
         3          1         35 NO  INACTIVE
         4          1         37 NO  CURRENT
         5          2         13 YES INACTIVE
         6          2         14 YES INACTIVE
         7          2         15 NO  INACTIVE
         8          2         16 NO  CURRENT

已選擇8行。

手工執行歸檔則報錯:

SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;
ALTER SYSTEM ARCHIVE LOG CURRENT
*
1 行出現錯誤:
ORA-16014:
日誌 7 的序列號 15 未歸檔, 沒有可用的目的地
ORA-00312:
聯機日誌 7 執行緒 2: '+MEMBER/tradedb/tradedb_redo2_3_1_1g'
ORA-00312:
聯機日誌 7 執行緒 2: '+MEMBER/tradedb/tradedb_redo2_3_2_1g'

檢查alert檔案,同樣大量的歸檔錯誤資訊:

Thu Aug 20 11:34:38 2009
ARCH: Archival stopped, error occurred. Will continue retrying
Thu Aug 20 11:34:38 2009
ORACLE Instance tradedb1 - Archival Error
Thu Aug 20 11:34:38 2009
ORA-16038: log 4 sequence# 4 cannot be archived
ORA-00254: error in archive control string ''
ORA-00312: online log 4 thread 1: '+MEMBER/tradedb/tradedb_redo1_4_1_1g'
ORA-00312: online log 4 thread 1: '+MEMBER/tradedb/tradedb_redo1_4_2_1g'
ORA-15173: entry 'archivelog' does not exist in directory 'tradedb'
Thu Aug 20 11:34:38 2009
Errors in file /data/oracle/admin/tradedb/bdump/tradedb1_arc1_10016.trc:
ORA-16038: log 4 sequence# 4 cannot be archived
ORA-00254: error in archive control string ''
ORA-00312: online log 4 thread 1: '+MEMBER/tradedb/tradedb_redo1_4_1_1g'
ORA-00312: online log 4 thread 1: '+MEMBER/tradedb/tradedb_redo1_4_2_1g'
ORA-15173: entry 'archivelog' does not exist in directory 'tradedb'

問題顯然是由於ASM上的歸檔路徑archivelog不存在造成的。可是這個路徑早在資料庫建立的時候就手工建立了,而且以前歸檔並沒有出現同樣的問題。而最近只做過RMAN的備份操作,莫非是RMAN在刪除歸檔的時候將目錄同時刪除了。

透過asmcmd手工新增目錄後,透過RMAN執行BACKUP ARCHIVELOG ALL DELETE ALL INPUT的命令,檢查是否會刪除ASM上目錄。

首先在節點2上連線asmcmd命令:

bash-3.00$ export ORACLE_SID=+ASM2
bash-3.00$ asmcmd
ASMCMD> cd member
ASMCMD> cd tradedb
ASMCMD> ls
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
archivelog/
control01.ctl
control02.ctl
control03.ctl
spfiletradedb.ora
tradedb_gpo_1_4g
tradedb_ndmain_1_4g
tradedb_ndmain_2_4g
tradedb_ndmain_3_4g
tradedb_ndmain_4_4g
tradedb_ndmain_5_4g
tradedb_redo1_1_1_1g
tradedb_redo1_1_2_1g
tradedb_redo1_2_1_1g
tradedb_redo1_2_2_1g
tradedb_redo1_3_1_1g
tradedb_redo1_3_2_1g
tradedb_redo1_4_1_1g
tradedb_redo1_4_2_1g
tradedb_redo2_1_1_1g
tradedb_redo2_1_2_1g
tradedb_redo2_2_1_1g
tradedb_redo2_2_2_1g
tradedb_redo2_3_1_1g
tradedb_redo2_3_2_1g
tradedb_redo2_4_1_1g
tradedb_redo2_4_2_1g
tradedb_sysaux_1_1g
tradedb_sysaux_2_1g
tradedb_system_1_4g
tradedb_temp_1_4g
tradedb_temp_2_4g
tradedb_temp_3_4g
tradedb_temp_4_4g
tradedb_temp_5_4g
tradedb_undotbs1_1_4g
tradedb_undotbs1_2_4g
tradedb_undotbs1_3_4g
tradedb_undotbs1_4_4g
tradedb_undotbs1_5_4g
tradedb_undotbs2_1_4g
tradedb_undotbs2_2_4g
tradedb_undotbs2_3_4g
tradedb_undotbs2_4_4g
tradedb_undotbs2_5_4g
tradedb_users_1_200m
tradedb_zhejiang_10_4g
tradedb_zhejiang_11_4g
tradedb_zhejiang_12_4g
tradedb_zhejiang_13_4g
tradedb_zhejiang_14_4g
tradedb_zhejiang_15_4g
tradedb_zhejiang_16_4g
tradedb_zhejiang_17_4g
tradedb_zhejiang_18_4g
tradedb_zhejiang_19_4g
tradedb_zhejiang_1_4g
tradedb_zhejiang_20_4g
tradedb_zhejiang_2_4g
tradedb_zhejiang_3_4g
tradedb_zhejiang_4_4g
tradedb_zhejiang_5_4g
tradedb_zhejiang_6_4g
tradedb_zhejiang_7_4g
tradedb_zhejiang_8_4g
tradedb_zhejiang_9_4g
ASMCMD> cd archivelog
ASMCMD> ls
1_31_694968965.dbf
1_32_694968965.dbf
2009_08_25/
2009_08_27/
2_13_694968965.dbf
ASMCMD> cd ..

可以看到,現在archivelog目錄是存在的,下面用RMAN執行BACKUP ARCHIVELOG ALL DELETE ALL INPUT命令:

bash-3.00$ rman target /

恢復管理器: Release 10.2.0.3.0 - Production on 星期四 8 27 23:40:34 2009

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

連線到目標資料庫: TRADEDB (DBID=4181457554)

RMAN> run
2> {
3> allocate channel c1 device type disk format '/data/backup/%U';
4> backup archivelog all delete all input;
5> }

使用目標資料庫控制檔案替代恢復目錄
分配的通道: c1
通道 c1: sid=320 例項=tradedb1 devtype=DISK

啟動 backup 27-8 -09
當前日誌已存檔
通道 c1: 正在啟動存檔日誌備份集
通道 c1: 正在指定備份集中的存檔日誌
輸入存檔日誌執行緒 =1 序列 =31 記錄 ID=6046 時間戳=695832644
輸入存檔日誌執行緒 =1 序列 =32 記錄 ID=6047 時間戳=696017068
輸入存檔日誌執行緒 =1 序列 =33 記錄 ID=6050 時間戳=696037299
輸入存檔日誌執行緒 =2 序列 =13 記錄 ID=6048 時間戳=696017368
輸入存檔日誌執行緒 =2 序列 =14 記錄 ID=6049 時間戳=696037569
通道 c1: 正在啟動段 1 27-8-09
通道 c1: 已完成段 1 27-8 -09
段控制程式碼=/data/backup/agknpbtr_1_1 標記=TAG20090827T234146 註釋=NONE
通道 c1: 備份集已完成, 經過時間:00:00:26
通道 c1: 正在刪除存檔日誌
存檔日誌檔名 =+MEMBER/tradedb/archivelog/1_31_694968965.dbf 記錄 ID=6046 時間戳 =695832644
存檔日誌檔名 =+MEMBER/tradedb/archivelog/1_32_694968965.dbf 記錄 ID=6047 時間戳 =696017068
存檔日誌檔名 =+MEMBER/tradedb/archivelog/1_33_694968965.dbf 記錄 ID=6050 時間戳 =696037299
存檔日誌檔名 =+MEMBER/tradedb/archivelog/2_13_694968965.dbf 記錄 ID=6048 時間戳 =696017368
存檔日誌檔名 =+MEMBER/tradedb/archivelog/2_14_694968965.dbf 記錄 ID=6049 時間戳 =696037569
完成 backup 27-8 -09
釋放的通道: c1

現在回到節點2上的asmcmd命令,檢查archivelog目錄:

ASMCMD> ls
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
control01.ctl
control02.ctl
control03.ctl
spfiletradedb.ora
tradedb_gpo_1_4g
tradedb_ndmain_1_4g
tradedb_ndmain_2_4g
tradedb_ndmain_3_4g
tradedb_ndmain_4_4g
tradedb_ndmain_5_4g
tradedb_redo1_1_1_1g
tradedb_redo1_1_2_1g
tradedb_redo1_2_1_1g
tradedb_redo1_2_2_1g
tradedb_redo1_3_1_1g
tradedb_redo1_3_2_1g
tradedb_redo1_4_1_1g
tradedb_redo1_4_2_1g
tradedb_redo2_1_1_1g
tradedb_redo2_1_2_1g
tradedb_redo2_2_1_1g
tradedb_redo2_2_2_1g
tradedb_redo2_3_1_1g
tradedb_redo2_3_2_1g
tradedb_redo2_4_1_1g
tradedb_redo2_4_2_1g
tradedb_sysaux_1_1g
tradedb_sysaux_2_1g
tradedb_system_1_4g
tradedb_temp_1_4g
tradedb_temp_2_4g
tradedb_temp_3_4g
tradedb_temp_4_4g
tradedb_temp_5_4g
tradedb_undotbs1_1_4g
tradedb_undotbs1_2_4g
tradedb_undotbs1_3_4g
tradedb_undotbs1_4_4g
tradedb_undotbs1_5_4g
tradedb_undotbs2_1_4g
tradedb_undotbs2_2_4g
tradedb_undotbs2_3_4g
tradedb_undotbs2_4_4g
tradedb_undotbs2_5_4g
tradedb_users_1_200m
tradedb_zhejiang_10_4g
tradedb_zhejiang_11_4g
tradedb_zhejiang_12_4g
tradedb_zhejiang_13_4g
tradedb_zhejiang_14_4g
tradedb_zhejiang_15_4g
tradedb_zhejiang_16_4g
tradedb_zhejiang_17_4g
tradedb_zhejiang_18_4g
tradedb_zhejiang_19_4g
tradedb_zhejiang_1_4g
tradedb_zhejiang_20_4g
tradedb_zhejiang_2_4g
tradedb_zhejiang_3_4g
tradedb_zhejiang_4_4g
tradedb_zhejiang_5_4g
tradedb_zhejiang_6_4g
tradedb_zhejiang_7_4g
tradedb_zhejiang_8_4g
tradedb_zhejiang_9_4g
ASMCMD> ls archivelog
asmcmd: entry 'archivelog' does not exist in directory '+member/tradedb/'

顯然RMAN在刪除歸檔日誌的同時刪除空目錄。

查詢了metalink文件,發現果然是Oraclebugmetalink文件Bug No. 4431215描述了這個問題。如果在ASM上建立的目錄名稱和SID字首相同,則這個目錄下的所有目錄一旦為空,就會被ASM例項自動刪除,不管這個目錄是ASM自動建立,還是使用者手工建立的。

解決這個問題的辦法倒是很多,比如將歸檔目錄設定到日誌檔案的目錄中,或者改變主目錄的名稱使其和ORACLE_SID有所區別。還有更簡單的辦法,在歸檔目錄下複製一個小檔案,使得歸檔被刪除後,歸檔目錄不為空,從而避免路徑被清除。

Oracle10.2.0.411.1.0.6fixed了這個bug。因此升級或打PATCH也是解決這個問題的一個方法。

比如在執行了下面的命令後,就可以確保archivelog目錄不被刪除了:

SQL> create pfile='/export/home/oracle/inittradedb1.ora' from spfile;

檔案已建立。

SQL> create spfile='+MEMBER/tradedb/archivelog/spfile.ora' from pfile='/export/home/oracle/inittradedb1.ora';

檔案已建立。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-613729/,如需轉載,請註明出處,否則將追究法律責任。

相關文章