ORA-00838:MEMORY_TARGETの値が小さすぎる

f:id:recrox:20180701002150j

ORA-12514やORA-12516の記事でも書きましたが、DBのインスタンス起動時に表題のORA-00838エラーが発生するようになってしまいました。 今日はその原因と解消方法について書きます。


原因:初期化パラメータの値を変更したこと

前回『ORA-12516:リスナーは、一致するプロトコル・スタックが使用可能なハンドラを検出できませんでした。』というエラーが起きた時に、今後エラーが起きないようにするため、初期化パラメータPROCESSES(最大ユーザープロセス数)の値を変更しました。
変更時には以下のSQL文を実行しました。

alter system set processes=500 scope = spfile;

上記のSQL文は最大ユーザープロセス数を500に変更するものです。
元々のPROCESSESの値は50だったので、10倍に増やしたことになります。 本来、この初期化パラメータ変更時に合わせて他のパラメータも変更しなければならなかったようですが、 それを行わなかったためORA-00838エラーが発生してしまったようです。
10倍に増やしたことで必要なメモリが増えたということでしょうか、何にせよ安易に変更するんじゃなかった… 調べてみたらこういう場合はパラメータ・ファイル(pfile)から起動すれば良いとのこと。


pfileを使って起動してみる

pfileで起動するために、まずは現在の初期化パラメータに基づいたpfileを作成します。 pfileを作成するためのSQL文は以下の通り。

create pfile='C:/Database/initorcl.ora' from spfile='C:/Oracle/Administrator/product/12.1.0/dbhome_1/database/SPFILETESTDB.ORA';

spfileはサーバー・パラメータ・ファイルというものです。 こちらも初期化パラメータを設定するファイルですが、DBで管理しているようです。(pfileは管理していない)

上記のSQL文を実行することで、指定したフォルダにinitorcl.oraというファイルが作成されます。 そのままpfileを使って起動してもMEMORY_TARGETは小さいままですので、エディタでpfileを開き以下のように修正しました。

*.processes=500 -> 250
*.memory_target=512m -> 1024m

修正後、インスタンスを起動したところ…

SQL> connect / as sysdba
アイドル・インスタンスに接続しました。
SQL> startup pfile='C:/Database/initorcl.ora'
ORACLEインスタンスが起動しました。

Total System Global Area 1073741824 bytes
Fixed Size                  3053880 bytes
Variable Size             805308104 bytes
Database Buffers          260046848 bytes
Redo Buffers                5332992 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL>

無事起動できました。

最後にpfileからspfileを再作成する

そのままではpfileの内容のみ変わっていてspfileはエラーの出る内容のままになっています。 そうなると、また再起動時にエラーが起こることになってしまうので、修正したpfileを基にspfileを作成します。 pfileからspfileを作成するSQL文は以下の通り。

SQL> create spfile='C:\Oracle\Administrator\product\12.1.0\dbhome_1\database/spfiletestdb.ora' from pfile='C:/Database/initorcl.ora';

ファイルが作成されました。

spfileの名前はspfile[インスタンス名].oraになるように指定してください。 基本的には既にspfileが存在するはずなので同名を記述すればOKです。 spfileの書き換えが済んだところでもう一度確認の為にSQL*Plus上から再起動をかけてみます。

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

Total System Global Area 1073741824 bytes
Fixed Size                  3053880 bytes
Variable Size             805308104 bytes
Database Buffers          260046848 bytes
Redo Buffers                5332992 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL>

良かった、spfile経由でも無事起動できました。
初期化パラメータ関係で起動しなくなった場合はこの方法で対処できそうです。