memory_targetにmemory_max_targetより大きな値をセットするとどうなる?
memory_max_targetとmemory_targetの関係について
memory_max_targetにセットする値は、memory_targetに割り当てる最大値となっています。つまり、Oracle11gR2に割り当てる最大メモリサイズをセットするようになっています。
このことから、memory_targetにセットする値はmemory_max_targetよりも大きな値をセットすることはできないと思っていたのですが、実際はmemory_max_targetより大きな値をmemory_targetに入れることができてしまいます。
その結果どうなるかといいますと、DBインスタンスが起動しない状態に陥ってしまいます。今回はDBインスタンスが起動できない状態からの復旧手順をまとめました。
memory_max_targetよりも大きな値をmemory_targetにセットして検証
検証前の状態は、memory_max_target、memory_target ともに12Gとなっています。
SQL> show parameter target NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ memory_max_target big integer 12G memory_target big integer 12G pga_aggregate_target big integer 0 sga_target big integer 0 SQL>
ここで、memory_target に13Gをセットします。
SQL> alter system set memory_target=13G scope=spfile; システムが変更されました。 SQL>
memory_max_targetより大きな値をセットできてしまいました。
動的には反映されませんのでDBインスタンスを再起動してみます。すると以下のエラーで起動できませんでした。
[oracle@server01:/home/oracle] srvctl stop db -d db01 [oracle@server01:/home/oracle] srvctl start db -d db01 PRCR-1079 : リソースora.db01.dbの起動に失敗しました CRS-5017: リソース・アクション"ora.db01.db start"に次のエラーが発生しました: ORA-01078: failure in processing system parameters ORA-00837: Specified value of MEMORY_TARGET greater than MEMORY_MAX_TARGET 。詳細は"(:CLSN00107:)"("/u01/app/11.2.0.4/grid/log/server02/agent/crsd/oraagent_oracle/oraagent_oracle.log")を参照してください。 CRS-5017: リソース・アクション"ora.db01.db start"に次のエラーが発生しました: ORA-01078: failure in processing system parameters ORA-00837: Specified value of MEMORY_TARGET greater than MEMORY_MAX_TARGET 。詳細は"(:CLSN00107:)"("/u01/app/11.2.0.4/grid/log/server01/agent/crsd/oraagent_oracle/oraagent_oracle.log")を参照してください。 CRS-2674: 'ora.db01.db'('server02')の起動に失敗しました CRS-2674: 'ora.db01.db'('server01')の起動に失敗しました CRS-2632: 配置ポリシーを満たす場所へのリソース'ora.db01.db'の配置を試行するサーバーはありません [oracle@server01:/home/oracle]
sqlplusから起動しようとすると、このようなエラーが表示されます。
SQL> startup ORA-01078: failure in processing system parameters ORA-00837: Specified value of MEMORY_TARGET greater than MEMORY_MAX_TARGET SQL>
復旧手順
SPFILEから起動できない状態からの復旧手順の流れはこうなります。
- PFILEを作成
- PFILEの memory_target を memory_max_target の値と同じかそれ以下に修正
- PFILEでDBインスタンスを起動
- SPFILEを作成
- 初期化パラメータのspfileに、SPFILEをセット
- DBインスタンス再起動
それでは実際に行ってみます。
PFILE作成
sysdba権限でsqlplusを起動します。
[oracle@server01:/home/oracle] sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Production on 金 10月 18 14:30:10 2013 Copyright (c) 1982, 2013, Oracle. All rights reserved. SQL> conn / as sysdba アイドル・インスタンスに接続しました。 SQL>
SPFILEからPFILEを作成します。
- SPFILEの場所 → +DATA/db01/spfiledb01.ora
- 作成するPFILE → /home/oracle/initdb01_bak1.ora
SQL> create pfile='/home/oracle/initdb01_bak1.ora' from spfile='+DATA/db01/spfiledb01.ora'; ファイルが作成されました。 SQL>
PFILE修正
PFILEを vi で開き、memory_target の値を13Gから12Gに修正します。
[oracle@server01:/home/oracle] vi /home/oracle/initdb01_bak1.ora 変更前 -------------------------------- *.memory_max_target=12884901888 *.memory_target=13958643712 -------------------------------- 変更前 -------------------------------- *.memory_max_target=12884901888 *.memory_target=12884901888 --------------------------------
PFILEでDBインスタンスを起動
DBインスタンスをPFILEで起動します。
[oracle@server01:/home/oracle] sqlplus sys/password as sysdba SQL*Plus: Release 11.2.0.4.0 Production on 火 10月 29 19:10:31 2013 Copyright (c) 1982, 2013, Oracle. All rights reserved. アイドル・インスタンスに接続しました。 SQL> startup pfile='/home/oracle/initdb01_bak1.ora' ORACLEインスタンスが起動しました。 Total System Global Area 1.2827E+10 bytes Fixed Size 2258352 bytes Variable Size 4999613008 bytes Database Buffers 7818182656 bytes Redo Buffers 7315456 bytes データベースがマウントされました。 データベースがオープンされました。 SQL>
SPFILE作成
修正したPFILEからSPFILEを作成します。
SQL> create spfile='+DATA/db01/spfiledb01.ora' from pfile='/home/oracle/initdb01_bak1.ora'; ファイルが作成されました。 SQL>
PFILEからDBインスタンスを起動すると、初期化パラメータのspfileは空欄になっていることがわかります。
SQL> show parameter spfile NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ spfile string SQL>
初期化パラメータにSPFILEをセット
SPFILE起動に戻したいので、初期化パラメータのspfileに作成したSPFILEをセットします。
SQL> alter system set spfile='+DATA/db01/spfiledb01.ora'; システムが変更されました。 SQL> show parameter spfile NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ spfile string +DATA/db01/spfiledb01.ora SQL>
また、念のため memory_max_target と memory_target の値が問題ないことも確認しておきます。memory_target の値が memory_max_target と同じになっているのでOKでした。
SQL> show parameter memory NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ memory_max_target big integer 12G memory_target big integer 12G SQL>
DBインスタンス再起動
DBインスタンスをシャットダウンします。
SQL> shutdown immediate データベースがクローズされました。 データベースがディスマウントされました。 ORACLEインスタンスがシャットダウンされました。 SQL>
srvctlで両ノードのDBインスタンスを起動します。
[oracle@server01:/home/oracle] srvctl start db -d db01 [oracle@server01:/home/oracle]
正常に起動できました。これで復旧完了です。
memory_target の値は、memory_max_target と同じかそれ以下に設定しなければいけないようですが、DBインスタンスが起動できない状態になるのは困りますよね。設定変更するときは注意すしなければなりません。