― PDB単位のCPU・並列制御を一括で設定するスクリプト付き解説 ―
Oracleのマルチテナント構成(CDB構成)では、複数のPDBが1つのCDBに共存します。
しかしリソース制御を行わないと、あるPDBの重い処理が他のPDBの性能を圧迫するという問題が起こり得ます。
このような事態を防ぐためには、リソースマネージャ(Resource Manager)を使ってPDBごとにリソース配分を定義するのが最善です。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
✅ この記事で学べること
- CDB構成におけるリソースマネージャの役割
PDB01,PDB02,PDB03に対して一括でCPU上限・並列処理制限を設定する方法- 実行例・確認SQL・よくあるエラーと解決策まで網羅
📊 構成イメージ
┌────────────┐
│ CDB$ROOT │
└────┬───────┘
▼
┌─────────┬─────────┬─────────┐
│ PDB01 │ PDB02 │ PDB03 │
└─────────┴─────────┴─────────┘
60% 30% 10%
🔧 ステップ①:リソースプラン(CDB_PLAN1)を作成
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
END;
/
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN(
plan => 'CDB_PLAN1',
comment => 'PDBごとのCPU制御用プラン');
END;
/
BEGIN
DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
END;
/
🔧 ステップ②:PDB01~03のディレクティブを一括定義
以下のスクリプトで、3つのPDBに対するCPUと並列処理の上限設定をまとめて1つのペンディングエリアで実行できます。
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
END;
/
BEGIN
-- PDB01:60% CPU、50% 並列
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'CDB_PLAN1',
pluggable_database => 'PDB01',
comment => 'PDB01制御',
shares => 3,
utilization_limit => 60,
parallel_server_limit => 50,
memory_min => NULL,
memory_limit => NULL);
-- PDB02:30% CPU、30% 並列
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'CDB_PLAN1',
pluggable_database => 'PDB02',
comment => 'PDB02制御',
shares => 1,
utilization_limit => 30,
parallel_server_limit => 30,
memory_min => NULL,
memory_limit => NULL);
-- PDB03:10% CPU、20% 並列
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'CDB_PLAN1',
pluggable_database => 'PDB03',
comment => 'PDB03制御',
shares => 1,
utilization_limit => 10,
parallel_server_limit => 20,
memory_min => NULL,
memory_limit => NULL);
END;
/
BEGIN
DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
END;
/
🔧 ステップ③:リソースプランの有効化
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'CDB_PLAN1';
これで CDB_PLAN1 に基づくPDB単位のリソース制御が有効化されます。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
🔍 設定確認SQL
-- 有効なリソースプランの確認
SELECT name FROM v$rsrc_plan;
-- 各PDBのディレクティブ確認
SELECT plan, pluggable_database, shares, utilization_limit, parallel_server_limit
FROM dba_cdb_rsrc_plan_directives
WHERE plan = 'CDB_PLAN1';
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
4 PDB02 READ WRITE NO
6 PDB03 READ WRITE NO
SQL> BEGIN
2 DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
3 END;
4 /
PL/SQLプロシージャが正常に完了しました。
SQL> BEGIN
2 DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN(
3 plan => 'CDB_PLAN1',
4 comment => 'PDBごとのCPU制御用プラン');
5 END;
6 /
PL/SQLプロシージャが正常に完了しました。
SQL> BEGIN
2 DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
3 END;
4 /
PL/SQLプロシージャが正常に完了しました。
SQL> BEGIN
2 DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
3 END;
4 /
PL/SQLプロシージャが正常に完了しました。
SQL> BEGIN
2 -- PDB01:60% CPU、50% 並列
3 DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
4 plan => 'CDB_PLAN1',
5 pluggable_database => 'PDB01',
6 comment => 'PDB01制御',
7 shares => 3,
8 utilization_limit => 60,
9 parallel_server_limit => 50,
10 memory_min => NULL,
11 memory_limit => NULL);
12
13 -- PDB02:30% CPU、30% 並列
14 DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
15 plan => 'CDB_PLAN1',
16 pluggable_database => 'PDB02',
17 comment => 'PDB02制御',
18 shares => 1,
19 utilization_limit => 30,
20 parallel_server_limit => 30,
21 memory_min => NULL,
22 memory_limit => NULL);
23
24 -- PDB03:10% CPU、20% 並列
25 DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
26 plan => 'CDB_PLAN1',
27 pluggable_database => 'PDB03',
28 comment => 'PDB03制御',
29 shares => 1,
30 utilization_limit => 10,
31 parallel_server_limit => 20,
32 memory_min => NULL,
33 memory_limit => NULL);
34 END;
35 /
PL/SQLプロシージャが正常に完了しました。
SQL> BEGIN
2 DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
3 END;
4 /
PL/SQLプロシージャが正常に完了しました。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'CDB_PLAN1';
システムが変更されました。
SQL> SELECT name FROM v$rsrc_plan;
NAME
-------------------------------------------
CDB_PLAN1
INTERNAL_PLAN
INTERNAL_PLAN
INTERNAL_PLAN
INTERNAL_PLAN
SQL> set lin 1000 pages 1000
SQL> col plan for a30
SQL> col pluggable_database for a30
SQL> SELECT plan, pluggable_database, shares, utilization_limit, parallel_server_limit
2 FROM dba_cdb_rsrc_plan_directives
3 WHERE plan = 'CDB_PLAN1';
PLAN PLUGGABLE_DATABASE SHARES UTILIZATION_LIMIT PARALLEL_SERVER_LIMIT
------------------------------ ------------------------------ ---------- ----------------- ---------------------
CDB_PLAN1 PDB02 1 30 30
CDB_PLAN1 PDB03 1 10 20
CDB_PLAN1 ORA$DEFAULT_PDB_DIRECTIVE 1
CDB_PLAN1 ORA$AUTOTASK 90
CDB_PLAN1 PDB01 3 60 50
⚠️ よくあるエラーと解決策
| エラー | 原因 | 解決方法 |
|---|---|---|
| ORA-29358 | プランが未作成 | CREATE_CDB_PLAN を先に実行する |
| ORA-29371 | ペンディングエリアがアクティブでない | CREATE_PENDING_AREA を忘れていないか確認 |
| PLS-00306 | 引数の数や型が一致しない | 8引数すべて明示的に指定すること(NULL含む) |
| ORA-65046 | PDBからCDBの操作をしている | SHOW CON_NAME で CDB$ROOT になっていることを確認 |
🧠 用語整理
| パラメータ名 | 意味 |
|---|---|
shares | リソースの重み(高いほど優先) |
utilization_limit | CPU使用率上限(%) |
parallel_server_limit | 並列処理の上限(%) |
memory_min, memory_limit | メモリの保証・制限(今回は未使用) |
✅ まとめ
- 複数のPDBに対して一括でディレクティブを設定可能
- ペンディングエリア→定義→一括反映の流れを守れば、効率よく設定できる
- CPU制御と並列処理制限を明示的に設定することで性能の安定性が向上
[参考]
4 CDBの作成および構成




コメント