Infra DevOps

インフラ構築のナレッジや、運用の自動簡易化に関する記事を書いていこうと思います

shutdown 後に startupでインスタンスが起動しない srvctl だと起動できる

sqlplusからstartup実行してもインスタンスが起動せず、srvctlコマンドであれば起動したのでその動作について調査した時のメモ

結論先に記載するとOCRとinitSID.oraで参照すべきSPFILEの場所が違うからという仕様から発生しているものでした。

++-----

SQL> shutdown immediate ;
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。

 


SQL> startup
ORA-01078: failure in processing system parameters
ORA-01565: error in identifying file '+DATAC3/ORCL/spfileORCL.ora'
ORA-17503: ksfdopn:10 Failed to open file +DATAC3/ORCL/spfileORCL.ora
ORA-15173: entry 'spfilethdorcl.ora' does not exist in directory 'ORCL'
ORA-06512: at line 4

→エラーが発生してstartupだと起動できない。

 

$ su - grid

$ srvctl start db -d ORCL

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
ORCL2

→srvctlだと起動できた

 

メッセージの内容を見ると原因は、srvctlは正しいspfileのパスを確認した上でインスタンス起動ができるが、sqlplusコマンド実行時に正しいspfileの場所を認識してくれてないことから事象が発生しているように思えた。

$ srvctl config database -d ORCL -a | grep spfile
Spfile: +DATAC3/ORCL/PARAMETERFILE/spfile.297.919398405 ★DB起動中のshow parameter spfileのパラメータと同じ値

 

SQL> show parameter spfile

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string +DATAC3/ORCL/PARAMETERFILE/
spfile.297.919398405 ★srvctlと同じ値

 

sqlplusのstartup処理で+DATAC3/ORCL/PARAMETERFILE/spfile.297.919398405をきちんと見れくれてないのが問題なのか、設定が問題なのかは判断できませんでした。

仮にこの事象が発生して、なんとかsqlplusから起動したい場合

SQL> create pfile='/var/tmp/pfile' from spfile='+DATAC3/ORCL/PARAMETERFILE/spfile.297.919398405'

SQL> startup pfile='/var/tmp/pfile'

でstartupコマンドで明示的に起動時に利用するpfileを指定すれば起動可能です。

 

なお、sqlplusは基本的に以下3つの優先順位でパラメータを見に行くので

%ORACLE_HOME%\database\spfile%ORACLE_SID%.ora
%ORACLE_HOME%\database\spfile.ora
%ORACLE_HOME%\database\init%ORACLE_SID%.ora

 

のいずれか存在するファイルに

SPFILE='+DATAC3/ORCL/PARAMETERFILE/spfile.297.919398405'

を定義すれば起動する。

 

 

追記

sqlplusが見てるのは

/u01/app/oracle/product/12.1.0.2/dbhome_1/

でした。たぶんここの情報が違うと起動できない。