[ Database ] Oracle DB 10g, DBCA 與 Archive Log Destination

在 Oracle Database 10g(包含到 10gR2)的環境中,使用 DBCA 建立資料庫的時候,如果 archive log 建立在 ASM 上,又不是預設的路徑,則設定的路徑並不會被建立。

模擬狀況:


環境中,SID 為 TestOne,有三個 ASM Diskgroup,分別名為 +SYS,+DATA 以及 +Archive。使用 DBCA 建立資料庫,設定檔案儲存位置於 +SYS 上。過程中,將 Enable Archive Log 打勾,然後設定參數。在 Archive Log Destination 的地方,預設值是 +SYS/{DB_UNIQUE_NAME}。此時修改預設值成為 +Archive/{DB_UNIQUE_NAME},然後繼續安裝動作。建立 DB 過程中,都不會有錯誤訊息。建立完畢後,重新啟動 DB,也不會有錯誤訊息。

但是第二天,卻發現 DB 崩潰,instance 無法重新啟動。觀察 alert log,會看到以下資訊:
ORACLE Instance TestOne – Archival Error
Wed Jul 2 13:26:07 2008
ORA-16038: log 3 sequence# 1 cannot be archived
ORA-00254: error in archive control string ”
ORA-00312: online log 3 thread 1: ‘+Archive/TestOne/redo03.log’
ORA-15173: entry ‘TestOne’ does not exist in directory ‘/’


原因:


向 Oracle 申請 Service Request,書信往來後,確認了這是一個 unpublished bug。

簡單來說,通常 archive log 的預設路徑,是存放資料的(以上例來說,就是 +SYS)的 diskgroup。由於所有檔案預設存放路徑都是 +DiskGroup/{DB_UNIQUE_NAME},因此該路徑會在其他程序中被建立,所以採取預設值的時候,archive log destination 不會被建立的問題並不會被發現。

可是當修改了路徑之後,這個 bug 就出現了。在上述的案例中,預設 archive log 是自動備份模式。因此到了備份時間一到,archive service 自動運行,卻發現預設的路徑不存在;上述例子就是 +Archive/{DB_UNIQUE_NAME};也就是說,+Archive 下面並沒有 TestOne 這個路徑存在,所以無法備份。instance 就崩潰了。


解決方案:


Oracle 技術支援人員告知,這個 bug 在 11g 中已經被修正了。

至於 10g 目前並沒有任何 patch 來修正這個問題。因此如果使用 DBCA 建立資料庫的過程中,archive log destination 被修改為異於預設值的時候,請手動建立該目錄。

  1. 執行 sqlplus /nolog
  2. 執行 CONNECT / AS SYSDBA;
  3. 執行 STARTUP MOUNT;
  4. 執行 ALTER DATABASE NOARCHIVELOG;
  5. 執行 ALTER DATABASE OPEN;
  6. 執行 ALTER DISKGROUP Archive ADD DIRECTORY ‘+Archive/TestOne’;
  7. 執行 SHUTDOWN IMMEDIATE;
  8. 執行 EXIT
  9. 執行 sqlplus /nolog
  10. 執行 CONNECT / AS SYSDBA;
  11. 執行 STARTUP MOUNT;
  12. 執行 ALTER DATABASE ARCHIVELOG;
  13. 執行 ALTER DATABASE OPEN;
  14. 執行 EXIT

步驟 1 到 5 的目的,是先關閉 archive log mode,然後開啟 DB。由於 archive log mode 被關閉,因此就不會被「不存在的路徑」所困擾。DB 開啟後,就可以用指令來建立目錄(或者可以用 EM 來建立)。建立之後,關閉 DB,重新掛載 DB,開啟 archive log mode,打開 DB。