CDB構成における初期化パラメータの管理方法

CDB/PDB(マルチテナント)

open_cursorsを例にCONTAINER句とPDB個別設定の可否を理解~

Oracle 12c以降のCDB構成(マルチテナント)では、初期化パラメータの設定は CDB全体(CDB$ROOT)各PDB(プラガブル・データベース) で分けて行う必要があります。

この記事では、open_cursors を例にして、CONTAINER句の使い方や、PDBでの個別設定可否の確認方法までを含めて、初期化パラメータ管理の基本を解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


1. 初期化パラメータの適用スコープとCONTAINER句

設定対象使用するCONTAINER句効果範囲
CDB全体共通CONTAINER=ALLCDB$ROOTおよびすべてのPDB
特定PDBのみCONTAINER=CURRENT接続中のPDBのみに反映

💡 ALTER SYSTEM 実行時には CONTAINER句を明示的に指定する必要があります。


2. 現在の接続先コンテナを確認

SQL> SHOW CON_NAME;

3. 現在のパラメータ値の確認:v$system_parameter

SELECT name, value, con_id
FROM v$system_parameter
WHERE name = 'open_cursors';
con_id対象コンテナ
1CDB$ROOT
2~各PDB

4. open_cursorsとは?

このパラメータは、1セッションで同時に開けるカーソルの最大数を設定します。アプリケーションによっては、デフォルト(300)では不足する場合があり、パフォーマンスやORA-01000エラーの回避に重要です。


5. パラメータの設定変更方法(SCOPE句なし)

■ CDB全体への設定(CONTAINER=ALL)

-- CDB$ROOT に接続して実行
ALTER SYSTEM SET open_cursors = 500 CONTAINER=ALL;

この設定は、全PDBに継承されます(PDB側で個別に上書きしていない場合)。


■ PDB単体への設定(CONTAINER=CURRENT)

-- PDB01に接続して実行
ALTER SYSTEM SET open_cursors = 300 CONTAINER=CURRENT;

この設定は、PDB01にのみ適用され、他のPDBやCDB$ROOTには影響しません。

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB01 READ WRITE NO
5 PDB02 READ WRITE NO
SQL> SELECT name, value, con_id
2 FROM v$system_parameter
3 WHERE name = 'open_cursors';

NAME VALUE CON_ID
------------------------------ ------------------------------ ----------
open_cursors 300 0

SQL> ALTER SYSTEM SET open_cursors = 500 CONTAINER=ALL; ★すべてのコンテナで変更

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

SQL> SELECT name, value, con_id
2 FROM v$system_parameter
3 WHERE name = 'open_cursors';

NAME VALUE CON_ID
------------------------------ ------------------------------ ----------
open_cursors 500 0 ★

SQL> alter session set container=pdb01; ★PDB01 に接続

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

SQL> show con_name

CON_NAME
------------------------------
PDB01
SQL> ALTER SYSTEM SET open_cursors = 300 CONTAINER=CURRENT; ★PDB01 で変更

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

SQL> alter session set container=cdb$root;

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

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> SELECT name, value, con_id
2 FROM v$system_parameter
3 WHERE name = 'open_cursors';

NAME VALUE CON_ID
------------------------------ ------------------------------ ----------
open_cursors 500 0
open_cursors 300 3 ★PDB01 だけ

SQL> alter session set container=pdb01;

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

SQL> show con_name

CON_NAME
------------------------------
PDB01
SQL> show parameter open_cursors

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
open_cursors integer 300
SQL> alter session set container=pdb02;

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

SQL> show con_name

CON_NAME
------------------------------
PDB02
SQL> show parameter open_cursors

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
open_cursors integer 500 ★変わっていない

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


6. 設定の継承と上書きの図解

+-----------------------------+
| CDB$ROOT |
| open_cursors = 500 |
| (CONTAINER=ALL) |
+--------------+-------------+
|
↓(PDB側で上書き可能)
+-----------------------------+ +-----------------------------+
| PDB01 | | PDB02 |
| open_cursors = 300 | | open_cursors = 500(継承) |
+-----------------------------+ +-----------------------------+

7. PDBで個別設定が可能なパラメータの確認方法

Oracleでは、PDBごとに変更可能な初期化パラメータを確認するには、v$parameter または v$system_parameter ビューの ISPDB_MODIFIABLE 列を使用します。

■ PDBで個別設定が可能か確認するSQL

SELECT name, value, ispdb_modifiable
FROM v$system_parameter
WHERE name = 'open_cursors';
列名説明
nameパラメータ名
value現在の設定値
ispdb_modifiablePDBで個別に変更可能な場合は TRUE

ispdb_modifiable = 'TRUE' であれば、PDB単位で CONTAINER=CURRENT による変更が可能です。


8. 注意点まとめ

注意点内容
CONTAINER句はCDB構成で必須指定しないとエラーになる、または意図しない変更になる可能性があります
open_cursors はPDB単位で設定可能な代表例ispdb_modifiable 列で確認できます
PDBに影響を与えるにはPDBに接続して CONTAINER=CURRENT を使用するCDB$ROOTでは実行できません

9. まとめ

  • 初期化パラメータは、CDB全体とPDBごとに分けて管理する必要があります
  • ALTER SYSTEM SET ... CONTAINER=ALL で全体に適用、CONTAINER=CURRENT で個別PDBに適用。
  • v$system_parameterispdb_modifiable 列を使えば、PDB単位で変更可能かどうかも判定可能です。


[参考]
4 CDBの作成および構成

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました