memory_targetにmemory_max_targetより大きな値をセットするとどうなる?

oracle11g-flash-100


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から起動できない状態からの復旧手順の流れはこうなります。

  1. PFILEを作成
  2. PFILEの memory_target  を memory_max_target の値と同じかそれ以下に修正
  3. PFILEでDBインスタンスを起動
  4. SPFILEを作成
  5. 初期化パラメータのspfileに、SPFILEをセット
  6. 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インスタンスが起動できない状態になるのは困りますよね。設定変更するときは注意すしなければなりません。

 

 



 

 


サブコンテンツ

このページの先頭へ