きさま!見ているなッ!!

【Oracle】初期化パラメータを変更する

  • 2019-09-16
  • 2019-09-16
  • Oracle

初期化パラメータを格納するファイルには、初期化パラメータ・ファイル(PFILE)とサーバー・パラメータ・ファイル(SPFILE)の 2 種類あります。

初期化パラメータ・ファイル(PFILE)は、テキスト形式のファイルです。現行のインスタンスで初期化パラメータを変更するには、ALTER SYSTEM SET 文で変更できますが、永続化するには、エディタでファイルを変更する必要があります。ファイルを変更しない場合、再起動後に変更内容は失われます。

サーバー・パラメータ・ファイル(SPFILE)は、バイナリ形式のファイルです。ALTER SYSTEM SET 文を使用して、初期化パラメータの変更・ファイルの変更を行います。ALTER SYSTEM SET 文の SCOPE 句によって、変更の反映範囲や反映タイミングを設定できます。

SCOPE句説明
MEMORYメモリーで変更され、変更内容は即時に有効化される。再起動後に変更内容は失われる。
SPFILE変更内容は、SPFILEに反映される。再起動後に、変更内容が有効になり、永続化される。
BOTHMEMORYとSPFILEの処理を行う。変更内容は、永続化される。

ALTER SYSTEM SET 文で、SPFILE の変更ができたり、SPFILE 必須の機能があったりするので、SPFILE での運用をおススメします。

今回は、SPFILE を使用して、マルチテナント環境での初期化パラメータの変更について、ご紹介します。

環境

・環境情報

OSRDBMS
CentOS 7.6Oracle Database 12c R2 Enterprise Edition

・CDB 情報

データベース名CDB1
データベースタイプ単一インスタンス
アーキテクチャマルチテナント
初期化パラメータ・ファイル形式バイナリ形式(SPFILE)

・PDB 情報

PDB名PDB1
PDBローカル管理者PDB1ADM
PDBのデータファイルの場所/u01/app/oracle/oradata/pdb1/

PDB の作成については、こちらの記事をどうぞ。

CDBで初期化パラメータを変更する

継承モデル

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

SQL> 
SQL> SELECT ispdb_modifiable, COUNT(*) CNT
  2  FROM v$system_parameter
  3  GROUP BY ispdb_modifiable
  4  ;

ISPDB_MODIFIABL        CNT
--------------- ----------
TRUE                   182
FALSE                  257

SQL> 

CDB では、継承モデルが使用されており、PDB がルートの初期化パラメータを継承しています。V$SYSTEM_PARAMETER ビューの ISPDB_MODIFIABLE 値が TRUE のパラメータについては、PDB で個別に変更したり、CDB で一括で制御したりすることができます。

現在のコンテナのみ変更する

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

SQL> 
SQL> set lin 1000
SQL> col name for a20
SQL> col value for a20
SQL> SELECT name, value, ispdb_modifiable, issys_modifiable, con_id
  2  FROM v$system_parameter
  3  WHERE name = 'open_cursors'
  4  ;

NAME                 VALUE                ISPDB_MODIFIABL ISSYS_MODIFIABLE            CON_ID
-------------------- -------------------- --------------- --------------------------- ----------
open_cursors         300                  TRUE            IMMEDIATE                            0
open_cursors         100                  TRUE            IMMEDIATE                            3

SQL> 

CDB と PDB で個別の値が設定された状態の OPEN_CURSORS について、CDB のみ「200」に変更します。ISPDB_MODIFIABLE 値は TRUE です。ISSYS_MODIFIABLE 値が IMMEDIATE なので、即時反映の初期化パラメータです。

SQL> ALTER SYSTEM SET OPEN_CURSORS = 200 CONTAINER = CURRENT;

システムが変更されました。

SQL> 

CONTAINER 句に CURRENT を設定することで、現在のコンテナのみ変更されます。

SQL> set lin 1000
SQL> col name for a20
SQL> col value for a20
SQL> SELECT name, value, ispdb_modifiable, issys_modifiable, con_id
  2  FROM v$system_parameter
  3  WHERE name = 'open_cursors'
  4  ;

NAME                 VALUE                ISPDB_MODIFIABL ISSYS_MODIFIABLE            CON_ID
-------------------- -------------------- --------------- --------------------------- ----------
open_cursors         200                  TRUE            IMMEDIATE                            0
open_cursors         100                  TRUE            IMMEDIATE                            3

SQL> 
SQL> show parameter open_cursors

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
open_cursors                         integer                           200

SQL> 

CON_ID が「0」の OPEN_CURSORS のみ「200」に変更されました。現在のセッションで有効な値は、SHOW PARAMETER か V$PARAMETER ビューで確認できます。

すべてのコンテナを変更する

SQL> ALTER SYSTEM SET OPEN_CURSORS = 300 CONTAINER = ALL;

システムが変更されました。

SQL> 

すべてのコンテナを変更する場合は、CONTAINER 句に ALL を設定します。

SQL> set lin 1000
SQL> col name for a20
SQL> col value for a20
SQL> SELECT name, value, ispdb_modifiable, issys_modifiable, con_id
  2  FROM v$system_parameter
  3  WHERE name = 'open_cursors'
  4  ;

NAME                 VALUE                ISPDB_MODIFIABL ISSYS_MODIFIABLE            CON_ID
-------------------- -------------------- --------------- --------------------------- ----------
open_cursors         300                  TRUE            IMMEDIATE                            0

SQL> 
SQL> show parameter open_cursors

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
open_cursors                         integer                           300

SQL> 

CDB と PDB の OPEN_CURSORS が「300」に変更されました。

ISPDB_MODIFIABLEがFALSEの場合

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

SQL> 
SQL> set lin 1000
SQL> col name for a20
SQL> col value for a50
SQL> SELECT name, value, ispdb_modifiable, issys_modifiable, con_id
  2  FROM v$system_parameter
  3  WHERE name = 'dispatchers'
  4  ;

NAME                 VALUE                                              ISPDB_MODIFIABL ISSYS_MODIFIABLE            CON_ID
-------------------- -------------------------------------------------- --------------- --------------------------- ----------
dispatchers	         (PROTOCOL=TCP)                                     FALSE           IMMEDIATE                            0

SQL> 

ISPDB_MODIFIABLE 値が FALSE の DISPATCHERS を変更してみましょう。

SQL> ALTER SYSTEM SET DISPATCHERS = '(PROTOCOL=TCP)(DISPATCHERS=2)' CONTAINER = ALL;
ALTER SYSTEM SET DISPATCHERS = '(PROTOCOL=TCP)(DISPATCHERS=2)' CONTAINER = ALL
*
行1でエラーが発生しました。:
ORA-65461: CONTAINER句をALLに設定した無効なパラメータ名が指定されています


SQL> 
SQL> ALTER SYSTEM SET DISPATCHERS = '(PROTOCOL=TCP)(DISPATCHERS=2)' CONTAINER = CURRENT;

システムが変更されました。

SQL> 

CONTAINER 句は CURRENT で実行する必要があります。

PDBで初期化パラメータを変更する

初期化パラメータを変更する

SQL> alter session set container = pdb1;

セッションが変更されました。

SQL> show con_name

CON_NAME
------------------------------
PDB1

SQL> 
SQL> SELECT ispdb_modifiable, COUNT(*) CNT
  2  FROM v$system_parameter
  3  GROUP BY ispdb_modifiable
  4  ;

ISPDB_MODIFIABL        CNT
--------------- ----------
TRUE                   160
FALSE                  257

SQL> 

PDB では、V$SYSTEM_PARAMETER ビューの ISPDB_MODIFIABLE 値が TRUE のパラメータの変更ができます。

SQL> show con_name

CON_NAME
------------------------------
PDB1

SQL> 
SQL> set lin 1000
SQL> col name for a20
SQL> col value for a20
SQL> SELECT name, value, ispdb_modifiable, issys_modifiable, con_id
  2  FROM v$system_parameter
  3  WHERE name = 'open_cursors'
  4  ;

NAME                 VALUE                ISPDB_MODIFIABL ISSYS_MODIFIABLE            CON_ID
-------------------- -------------------- --------------- --------------------------- ----------
open_cursors         300                  TRUE            IMMEDIATE                            0

SQL> 

OPEN_CURSORS について、PDB のみ「100」に変更します。ISPDB_MODIFIABLE 値は TRUE です。ISSYS_MODIFIABLE 値が IMMEDIATE なので、即時反映の初期化パラメータです。

SQL> ALTER SYSTEM SET OPEN_CURSORS = 100 SCOPE = BOTH;

システムが変更されました。

SQL> 
SQL> set lin 1000
SQL> col name for a20
SQL> col value for a20
SQL> SELECT name, value, ispdb_modifiable, issys_modifiable, con_id
  2  FROM v$system_parameter
  3  WHERE name = 'open_cursors'
  4  ;

NAME                 VALUE                ISPDB_MODIFIABL ISSYS_MODIFIABLE            CON_ID
-------------------- -------------------- --------------- --------------------------- ----------
open_cursors         100                  TRUE            IMMEDIATE                            3

SQL> 
SQL> show parameter open_cursors

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
open_cursors                         integer                           100

SQL> 

PDB 用に CON_ID が「3」の OPEN_CURSORS 設定ができます。

初期化パラメータをリセットする

SQL> show con_name

CON_NAME
------------------------------
PDB1

SQL> 
SQL> ALTER SYSTEM RESET OPEN_CURSORS SCOPE = BOTH;

システムが変更されました。

SQL> 
SQL> set lin 1000
SQL> col name for a20
SQL> col value for a20
SQL> SELECT name, value, ispdb_modifiable, issys_modifiable, con_id
  2  FROM v$system_parameter
  3  WHERE name = 'open_cursors'
  4  ;

NAME                 VALUE                ISPDB_MODIFIABL ISSYS_MODIFIABLE            CON_ID
-------------------- -------------------- --------------- --------------------------- ----------
open_cursors         300                  TRUE            IMMEDIATE                            0

SQL> 
SQL> show parameter open_cursors

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
open_cursors                         integer                           300

SQL> 

ALTER SYSTEM RESET 文を使用して、個別に設定した PDB 用の設定をリセットすることができます。

初期化パラメータが有効化されるタイミング

SQL> SELECT issys_modifiable, COUNT(*) CNT
  2  FROM v$system_parameter
  3  WHERE ispdb_modifiable = 'TRUE'
  4  GROUP BY issys_modifiable
  5  ORDER BY issys_modifiable
  6  ;

ISSYS_MODIFIABLE            CNT
--------------------------- ----------
DEFERRED                             7
FALSE                               28
IMMEDIATE                          125

SQL> 

V$SYSTEM_PARAMETER ビューの ISSYS_MODIFIABLE 値によって、初期化パラメータの変更が有効になるタイミングが変わります。

ISSYS_MODIFIABLE値有効化タイミング
IMMEDIATE即座に有効化される。
DEFERRED以降のセッションで有効化される。ALTER SYSTEM SET文でDEFERREDが必要。
FALSE再起動後に有効化される。SPFILE使用時のみALTER SYSTEM SET文で変更可能。

まとめ

初期化パラメータを変更することで、パフォーマンス・チューニングやリソース制限、データベースで使用するファイルの場所や名前の設定などが行えます。

マルチテナント環境では、PDB 毎に変更できる初期化パラメータもあるので、他の PDB に影響を与えずに設定変更できるケースもあります。

インスタンスの再起動が必要なパラメータもあるので、初期化パラメータを変更する際は、十分に検討する必要があります。

【Oracle】初期化パラメータを変更する
最新情報をチェックしよう!