~open_cursorsを例にCONTAINER句とPDB個別設定の可否を理解~
Oracle 12c以降のCDB構成(マルチテナント)では、初期化パラメータの設定は CDB全体(CDB$ROOT) と 各PDB(プラガブル・データベース) で分けて行う必要があります。
この記事では、open_cursors を例にして、CONTAINER句の使い方や、PDBでの個別設定可否の確認方法までを含めて、初期化パラメータ管理の基本を解説します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
1. 初期化パラメータの適用スコープとCONTAINER句
| 設定対象 | 使用するCONTAINER句 | 効果範囲 |
|---|---|---|
| CDB全体共通 | CONTAINER=ALL | CDB$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 | 対象コンテナ |
|---|---|
| 1 | CDB$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_modifiable | PDBで個別に変更可能な場合は 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_parameterのispdb_modifiable列を使えば、PDB単位で変更可能かどうかも判定可能です。
[参考]
4 CDBの作成および構成




コメント