Oracle Restart啟動資料庫例項故障一例( Oracle ASM儲存Spfile解析)

luashin發表於2016-01-14

    在之前的文章《Oracle Restart啟動資料庫例項故障一例》(http://space.itpub.net/17203031/viewspace-774622)中,筆者解決了一個由於使用create pfile from spfile引起的Restart無法啟動資料庫例項的故障。嚴格的說,筆者並沒有完全將其解決。主要體現在Spfile的使用和存放上。

1、問題簡述

    Oracle Database安裝在ASM儲存的時候,預設都是使用ASM儲存Spfile引數檔案。與早期的pfile檔案不同,Spfile是具有二進位制格式,能夠支援部分引數的動態調整。所以,我們出現問題的時候,發現Restart的配置資訊中包括了ASM中的Spfile引數內容。

[oracle@SimpleLinux ~]$ srvctl config database -d ora11g

Database unique name: ora11g

Database name:

Oracle home: /u01/app/oracle/product/11.2.0/db_1

Oracle user: oracle

Spfile: +DATA/ORA11G/spfileora11g.ora

Domain:

Start options: open

Stop options: immediate

Database role: PRIMARY

Management policy: AUTOMATIC

Database instance: ora11g

Disk Groups: DATA,RECO

Services:

我們之前的修復方法,就是將spfile內容置空,讓資料庫例項啟動使用預設路徑$ORACLE_HOME/dbsspfilepfile引數進行檢索。

SQL> show parameter spfile

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ---------------------------------------------------------------

spfile                               string      /u01/app/oracle/product/11.2.0/db_1/dbs/spfileora11g.ora

但是此時,我們在ASM路徑上是存在spfile上的。

SQL> asmcmd

ASMCMD> pwd       

+DATA/ORA11G

 

ASMCMD> ls

CONTROLFILE/

DATAFILE/

ONLINELOG/

PARAMETERFILE/

TEMPFILE/

spfileora11g.ora

在這種情況下,如果配置了ASM目錄的spfile啟動標誌,啟動Restart會報錯。

[oracle@SimpleLinux ~]$ srvctl modify database -d ora11g -p +DATA/ora11g/spfileora11g.ora

[oracle@SimpleLinux ~]$ srvctl start database -d ora11g

PRCR-1079 : Failed to start resource ora.ora11g.db

CRS-5010: Update of configuration file "/u01/app/oracle/product/11.2.0/db_1/dbs/initora11g.ora" failed: details at "(:CLSN00014:)" in "/u01/app/grid/product/11.2.0/grid/log/simplelinux/agent/ohasd/oraagent_grid/oraagent_grid.log"

CRS-5017: The resource action "ora.ora11g.db start" encountered the following error:

CRS-5010: Update of configuration file "/u01/app/oracle/product/11.2.0/db_1/dbs/initora11g.ora" failed: details at "(:CLSN00014:)" in "/u01/app/grid/product/11.2.0/grid/log/simplelinux/agent/ohasd/oraagent_grid/oraagent_grid.log"

. For details refer to "(:CLSN00107:)" in "/u01/app/grid/product/11.2.0/grid/log/simplelinux/agent/ohasd/oraagent_grid/oraagent_grid.log".

CRS-2674: Start of 'ora.ora11g.db' on 'simplelinux' failed

 

2、分析和思考

一起冷靜想想~

Pfilespfile是引數檔案經歷的兩個階段。在umount階段,Oracle是透過引數$ORACLE_HOME$ORACLE_SID進行目錄定位,定位到$ORACLE_HOME/dbs或者$ORACLE_HOME/database,到裡面尋找制定規則的引數檔案。

Oracle首先會去尋找Spfile,之後才會去找Pfile。我們透過create spfilecreate pfile可以實現兩者的轉化。

一個比較常見的問題案例是:如果我們把啟動引數改錯了,啟動不了了,那麼怎麼辦?標準的做法是透過create pfile from spfile,拿到一個文字格式的引數pfile。在裡面修改啟動引數,糾正錯誤。啟動時候,使用startup pfile=xxx使用“指定的pfile”啟動資料庫例項,再透過create spfile from pfile將變化固化下來。

Oracle Restart提供的配置引數spfile其實是很詭異的。從直觀上看,好像是有startup資料庫例項,後面可以自己去指定引數檔案,類似於startup spfile=xxx的作用。但是實際上,startup是不支援spfile這樣的引數的。

如果這個引數是用於指定,那麼在Restart啟動的時候我們已經設定爭取的spfile位置,指定位置上面也有檔案。但是根本沒有效果,Oracle還是尋找引數檔案。

那麼,就只有一種可能性:即使Oracle使用Restart啟動,也不是依靠指定的spfile,還是按照原有的規則執行。

網路上有一種方法,說的是如果我們需要指定一個spfile啟動檔案的時候,應該怎麼做。答案是建立一個空的pfile檔案,裡面直接指定SPFILE引數的檔案位置。

綜合幾種思路,我們可以設想到Spfile儲存在ASM裡面,同時讓Restartsqlplus啟動時候可以訪問到ASM Spfile的方法。

 

3、配置ASMSPFILE啟動

首先是建立出ASM上的spfile。注意:建立spfile的時候一定是從pfile建立,所以需要轉換一下。

SQL> startup pfile=/u01/app/oracle/product/11.2.0/db_1/dbs/initora11g.ora

ORACLE instance started.

Total System Global Area  263639040 bytes

Fixed Size                  1344312 bytes

Variable Size             134221000 bytes

Database Buffers          125829120 bytes

Redo Buffers                2244608 bytes

Database mounted.

Database opened.

SQL> show parameter spfile

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

spfile                               string

 

SQL> create spfile='+DATA/ORA11G/spfileora11g.ora' from pfile;

File created.

此時,我們在ASM裡面可以看到生成的spfile二進位制檔案。

ASMCMD> ls -l

Type           Redund  Striped  Time             Sys  Name

                                                 Y    CONTROLFILE/

                                                 Y    DATAFILE/

                                                 Y    ONLINELOG/

                                                 Y    PARAMETERFILE/

                                                 Y    TEMPFILE/

                                                 N    spfileora11g.ora => +DATA/ORA11G/PARAMETERFILE/spfile.267.829130539


第二部是建立維護一個“轉發”引數檔案。

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

 

[oracle@SimpleLinux ~]$ cd $ORACLE_HOME

[oracle@SimpleLinux db_1]$ cd dbs

[oracle@SimpleLinux dbs]$ ls -l

total 28

-rw-rw---- 1 oracle asmadmin 1544 Sep 12 12:58 hc_ora11g.dat

-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora

-rwxr-x--- 1 oracle oinstall  959 Oct 18 09:51 initora11g.ora

-rwxrwx--- 1 oracle oinstall  887 Sep 29 09:31 initora11g.ora.bk

-rw-r----- 1 oracle asmadmin   24 Sep 12 12:58 lkORA11G

-rw-r----- 1 oracle oinstall 1536 Sep 12 13:11 orapwora11g

-rw-r----- 1 oracle asmadmin 2560 Oct 18 09:57 spfileora11g.ora

在裡面要完成兩件事情,一個是將dbs目錄下面的spfile刪除。因為依據Oracle啟動的原則,是先找spfile,之後再找pfile。第二件是修改文字引數檔案,作為轉發。

[oracle@SimpleLinux dbs]$ mv spfileora11g.ora spfileora11g.ora.bk

[oracle@SimpleLinux dbs]$ cat initora11g.ora

SPFILE='+DATA/ora11g/spfileora11g.ora’ –注意:不能包括*字首或者SID字首

[oracle@SimpleLinux dbs]$ ls -l

total 28

-rw-rw---- 1 oracle asmadmin 1544 Sep 12 12:58 hc_ora11g.dat

-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora

-rwxr-x--- 1 oracle oinstall   41 Oct 18 10:07 initora11g.ora

-rwxrwx--- 1 oracle oinstall  887 Sep 29 09:31 initora11g.ora.bk

-rw-r----- 1 oracle asmadmin   24 Sep 12 12:58 lkORA11G

-rw-r----- 1 oracle oinstall 1536 Sep 12 13:11 orapwora11g

-rw-r----- 1 oracle asmadmin 2560 Oct 18 09:57 spfileora11g.ora.bk

使用srvctl關閉和啟動資料庫。

[oracle@SimpleLinux dbs]$ srvctl start database -d ora11g

[oracle@SimpleLinux dbs]$ srvctl config database -d ora11g

Database unique name: ora11g

Database name:

Oracle home: /u01/app/oracle/product/11.2.0/db_1

Oracle user: oracle

Spfile: +DATA/ora11g/spfileora11g.ora

Domain:

Start options: open

Stop options: immediate

Database role: PRIMARY

Management policy: AUTOMATIC

Database instance: ora11g

Disk Groups: DATA,RECO

Services:

 

[oracle@SimpleLinux dbs]$ srvctl status database -d ora11g

Database is running.

資料庫中,spfile引數被設定為ASM路徑。

SQL> show parameter spfile;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

spfile                               string      +DATA/ora11g/spfileora11g.ora

故障徹底解決。

 

4、結論

    綜合上面的實驗,我們可以看到ASMSpfile使用的方法。ASM下的Spfile並不是拋棄原有的啟動規則,而是藉助原有的pfile進行了目標轉接。之後筆者檢視MOS中的對應方案,官方推薦的也是這樣的做法。

這樣就需要一個前提,就是dbs或者database目錄中不能包括spfile。如果包括了,Oracle設定的轉接機制就被替換掉了。

另一個問題是我們一直看到的錯誤提示資訊,提示引數檔案initora11g.ora格式不能識別。筆者的理解是,原始的檔案是筆者使用create pfile from spfile建立出來的,預設的SPFILE=XXX的內容被覆蓋。而Oracle Restart不能識別這種非轉接內容檔案,所以報錯。

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

相關文章