はじめに
PDBの初期化パラメータは基本的にCDB$ROOTの値を継承しますが、DB作成時に指定するものだけでなく実行環境であるインフラ・リソースから自動的に算出されるものも存在します。それらもPDB独自の値として設定は可能ですが、その変更後の値を持った状態で別の規模が異なるインフラ・リソースへクローンすると値がどうなるかを確認してみました。
環境と手順について
同じCPU数およびメモリ容量の2つのVMを準備し、それぞれCDBを作成します。それぞれPDB個別の初期化パラメータの一部に変更を加えて確認した後で、双方にリモートからPDB Cloneを実施します。ここでは、PDB-Aはprocesses およびsga_max_sizeをCDB設定より小さくし、PDB-Bでは CPU_COUNTを小さく設定しました。
以下が、検証前の状態です。
| CDB-A | PDB-A (継承) | CDB-B | PDB-B (継承) | |
|---|---|---|---|---|
| cpu_count | 12 | 12 | 12 | 12 |
| processes | 960 | 960 | 1920 | 1920 |
| sga_max_size | 2634022912 | 2634022912 | 7868514304 | 7868514304 |
[1] CDB-BからCDB-A上のPDB-Aをリモートでクローンを作成 (青矢印)
| PDB-A | CDB-B上のPDB-A | |
|---|---|---|
| cpu_count | 12 | 12 |
| processes | 960 | 1920 |
| sga_max_size | 2634022912 | 7868514304 |
Processesと sga_max_size はクローン先のCDBに設定されたパラメータを継承し、クローン元と比較して大きく設定された事が確認できます。
[2] CDB-AからCDB-B上のPDB-Bをリモートでクローンを作成 (赤矢印)
| PDB-B | CDB-A上のPDB-B | |
|---|---|---|
| cpu_count | 12 | 12 |
| processes | 1920 | 960 |
| sga_max_size | 7868514304 | 2634022912 |
Processesと sga_max_size はクローン先のCDBに設定されたパラメータを継承し、クローン元と比較して小さく設定された事が確認できます。
[3] CDB-B上にあるPDB-BのCPU_COUNTを12から4に設定し、その状態で CDB-Aからリモートでクローンを作成する
([1][2]と異なるのはインフラから自動的に設定されるパラメータではなく、alter文で個別設定したパラメータの変化を確認するためです)
| PDB-B | CDB-A上のPDB-B | |
|---|---|---|
| cpu_count | 4 | 12 |
結果から個別に設定した場合でも、クローン先のCDB$ROOTで持つ値(12)を継承する事が確認できます。
****** 2026/xx/xx
追加項目として – unplug & plug ではどうなるか
unplug & plug においては、unplug されたPDBの持つ構成情報がXMLファイルとして生成され、PDBを構成するデータファイルとともに保持される事から、plug 時にも参照される事から個別設定された初期化パラメータの継承が可能になると考えられるので試してみました。
これは1つのCDB上で行うものとして以下の手順により確認します。
- orcl19c16 (CDB$ROOT) の初期化パラメータの取得
- node01pdb1 の初期化パラメータの取得
- node01pdb1 の cpu_count を 12から6にして 初期化パラメータの取得
- node01pdb1 を unplug して orcl19c16 (CDB$ROOT) の初期化パラメータ を12から8へ変更
- node01pdb1 (初期化パラメータ cpu_count=6) を plug する
- node01pdb1 を unplug して orcl19c16 (CDB$ROOT) の初期化パラメータ を8から4へ変更
- もう1度、node01pdb1 (初期化パラメータ cpu_count=6) を plug する
- 手順3でPDBのcpu_count は 6
SQL> show parameter cpu_
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cpu_count integer 6
cpu_min_count string 6
resource_manager_cpu_allocation integer 0
手順4で CDB$ROOTのcpu_count を 8にして plug しますが、PDB Clone では 8を継承したのに対し、手順5にて、上記と同じ値である cpu_count = 6 を維持できました。
- 手順5のplug後の結果も同じ
SQL> show parameter cpu_
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cpu_count integer 6
cpu_min_count string 6
resource_manager_cpu_allocation integer 0
ここで生成されたXMLファイルを確認し、初期化パラメータ値が保持されているのが確認できます。
<parameters>
<parameter>processes=1920</parameter>
<parameter>nls_language='JAPANESE'</parameter>
<parameter>nls_territory='JAPAN'</parameter>
<parameter>db_block_size=8192</parameter>
<parameter>compatible='19.0.0'</parameter>
<parameter>open_cursors=300</parameter>
<parameter>pga_aggregate_target=2429550592</parameter>
<parameter>enable_pluggable_database=TRUE</parameter>
<spfile>*.cpu_count=6#HWM:6,</spfile>👈
<spfile>*.db_securefile='PREFERRED'</spfile>
</parameters>
さらに同じ工程を cpu_countを変えてやってみます。
CDB$ROOTのcpu_count を 8から4にする (plugするPDBの値より小さい)
SQL> show parameter cpu_
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cpu_count integer 4
cpu_min_count string 4
resource_manager_cpu_allocation integer 0
この初期化パラメータ値を持つCDB (CDB$ROOT)に cpu_count =6 の設定がされた PDBをplug すると、
SQL> show parameter cpu_
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cpu_count integer 4
cpu_min_count string 4
resource_manager_cpu_allocation integer 0
となり、PDBの初期化パラメータが自動的に変更される事がわかります。これは仕様としてPDB側の設定値がCDB$ROOTの値を越えられない事からも妥当な結果であると言えます。
最後に
現行(26ai)の初期化パラメータは550を超え、その中でPDB固有の値を持てるものが280以上になっています。今回は特に重要なものだけに注力しましたが、基本的には個別に設定された値でも持ち込む事はなく、クローン先のCDBに設定された値を継承するようです。PDBの移動やクローンは運用にも取り込まれ活用されていると思いますが、特にPDB固有の値を使用してリソースのバランスを最適化している場合は環境変更後の確認は欠かせないと思いました。
加えて、unplug & plug については plug 先のCDBが持つ値を越えない限りにおいて、PDBにおける設定値を維持したまま plug できるという結果になりました。
