Non-CDBで作成したデータベースをPDBに変換(CDB構成に移行)します。
構成
- Oracle Database 19c Enterprise Edition (19.3)
- Oracle Linux Server release 8.2
前提
- 変換元のNon-CDBと変換先のCDB/PDBは同じホストに構成します。
- 変換元のNon-CDBと変換先のCDB/PDBは同じORACLEホームに構成します。
このため両データベースのバージョンは同じです。 - 変換元のNon-CDBのDB名は変換先のPDBの名前を使用します。
| 変換元 | 変換先 | 備考 | |
|---|---|---|---|
| 構成 | Non-CDB | CDB/PDB | |
| DB名(CDB名) | dbomr | cdbomr | ORACLE_SIDに使用します |
| PDB名 | - | dbomr | 変換元のNon-CDBを変換先のPDBとします |
手順の確認
製品マニュアル/アップグレード・ガイドで示されている作業項目を下表に書き出します。
それぞれの操作に対してNon-CDBとCDB/PDBのどちらで実行するかを付け加えています。
また使用するデータベースは検証用で、また作成したばかりの状態のため、一部の手順はスキップします。
| No. | 実行操作 | Non-CDB操作 | CDB/PDB操作 | 備考 |
|---|---|---|---|---|
| 1 | CDBを作成する。 | 〇 | ||
| 2 | 非CDBがトランザクション上一貫した状態にあることを確認する。 | 〇 | 本記事ではスキップ | |
| 3 | 非CDBを読取り専用モードにする。 | 〇 | ||
| 4 | DBMS_PDB.DESCRIBEプロシージャを実行する。 | 〇 | ||
| 5 | DBMS_PDB.CHECK_PLUG_COMPATIBILITYファンクションを実行する。 | 〇 | ||
| 6 | 非CDBを停止する。 | 〇 | ||
| 7 | 非CDBを接続する。 | 〇 | ||
| 8 | noncdb_to_pdb.sqlスクリプトを実行する。 | 〇 | ||
| 9 | 新しいPDBを読取り/書込みモードでオープンする | 〇 | ||
| 10 | PDBをバックアップします。 | 〇 | 本記事ではスキップ |
手順の実践
Non-CDBからPDBへの変換を実行します。
各手順の見出し末尾には前記の表に合わせて実行対象環境(Non-CDBまたはCDB/PDB)を示しています。
以下の手順のうち「(参考)」と示している部分は手順の流れからは外れています。ご了承ください。
確認操作が冗漫に感じられる部分があるかもしれません。筆者の癖です。ご容赦ください。
Non-CDBからPDBへの変換の要件や手順に関してOracle社のサポート情報がある場合は、その内容に従ってください。
1. CDBを作成する。(CDB/PDB)
以下のコマンドでPDBを持たないCDBを作成します。
dbca -silent -createdatabase \
-gdbname cdbomr \
-templatename New_Database.dbt \
-createAsContainerDatabase true
作成されたデータベースのファイル構成は以下のようになっています。
$ ls -l /u01/app/oracle/oradata/CDBOMR/*
-rw-r----- 1 oracle oinstall 18726912 Sep 9 18:34 /u01/app/oracle/oradata/CDBOMR/control01.ctl
-rw-r----- 1 oracle oinstall 18726912 Sep 9 18:34 /u01/app/oracle/oradata/CDBOMR/control02.ctl
-rw-r----- 1 oracle oinstall 209715712 Sep 9 18:34 /u01/app/oracle/oradata/CDBOMR/redo01.log
-rw-r----- 1 oracle oinstall 209715712 Sep 9 18:34 /u01/app/oracle/oradata/CDBOMR/redo02.log
-rw-r----- 1 oracle oinstall 209715712 Sep 9 18:34 /u01/app/oracle/oradata/CDBOMR/redo03.log
-rw-r----- 1 oracle oinstall 576724992 Sep 9 18:34 /u01/app/oracle/oradata/CDBOMR/sysaux01.dbf
-rw-r----- 1 oracle oinstall 943726592 Sep 9 18:34 /u01/app/oracle/oradata/CDBOMR/system01.dbf
-rw-r----- 1 oracle oinstall 39854080 Sep 9 18:26 /u01/app/oracle/oradata/CDBOMR/temp01.dbf
-rw-r----- 1 oracle oinstall 492838912 Sep 9 18:34 /u01/app/oracle/oradata/CDBOMR/undotbs01.dbf
-rw-r----- 1 oracle oinstall 5251072 Sep 9 18:34 /u01/app/oracle/oradata/CDBOMR/users01.dbf
/u01/app/oracle/oradata/CDBOMR/pdbseed:
total 913888
-rw-r----- 1 oracle oinstall 319823872 Sep 9 18:33 sysaux01.dbf
-rw-r----- 1 oracle oinstall 272637952 Sep 9 18:33 system01.dbf
-rw-r----- 1 oracle oinstall 39854080 Sep 9 18:26 temp01.dbf
-rw-r----- 1 oracle oinstall 340795392 Sep 9 18:33 undotbs01.dbf
$
なお変換元のNon-CDBの作成時のコマンドとファイル構成は以下のとおりです。
dbca -silent -createdatabase \
-gdbname dbomr \
-templatename New_Database.dbt
$ ls -l /u01/app/oracle/oradata/DBOMR/*
-rw-r----- 1 oracle oinstall 10600448 Sep 9 13:56 /u01/app/oracle/oradata/DBOMR/control01.ctl
-rw-r----- 1 oracle oinstall 10600448 Sep 9 13:56 /u01/app/oracle/oradata/DBOMR/control02.ctl
-rw-r----- 1 oracle oinstall 209715712 Sep 9 10:07 /u01/app/oracle/oradata/DBOMR/redo01.log
-rw-r----- 1 oracle oinstall 209715712 Sep 9 10:07 /u01/app/oracle/oradata/DBOMR/redo02.log
-rw-r----- 1 oracle oinstall 209715712 Sep 9 10:09 /u01/app/oracle/oradata/DBOMR/redo03.log
-rw-r----- 1 oracle oinstall 576724992 Sep 9 13:48 /u01/app/oracle/oradata/DBOMR/sysaux01.dbf
-rw-r----- 1 oracle oinstall 922755072 Sep 9 13:48 /u01/app/oracle/oradata/DBOMR/system01.dbf
-rw-r----- 1 oracle oinstall 39854080 Sep 8 13:11 /u01/app/oracle/oradata/DBOMR/temp01.dbf
-rw-r----- 1 oracle oinstall 760225792 Sep 9 13:48 /u01/app/oracle/oradata/DBOMR/undotbs01.dbf
-rw-r----- 1 oracle oinstall 5251072 Sep 9 13:48 /u01/app/oracle/oradata/DBOMR/users01.dbf
$
2. Non-CDBがトランザクション上一貫した状態にあることを確認する。(Non-CDB)
省略します。
検証用に作ったばかりのデータベースであり、また一貫性を確認するほどの更新が発生していないためです。
3. Non-CDBを読取り専用モードにする。(Non-CDB)
Non-CDBを読み取り専用モードでオープンします。
データベースはDBCAでの作成後から稼働状態のため、SQL*Plusで接続後、一旦シャットダウンします。
$ export ORACLE_SID=dbomr
$ sqlplus / as sysdba
・・・中略・・・
SQL> SELECT INSTANCE_NAME,STATUS FROM V$INSTANCE;
INSTANCE_NAME STATUS
---------------- ------------
dbomr OPEN
SQL> SELECT NAME,CDB,OPEN_MODE FROM V$DATABASE;
NAME CDB OPEN_MODE
--------- --- --------------------
DBOMR NO READ WRITE
SQL>
SQL> SHUTDOWN IMMEDIATE
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
データベースを再起動します。読み取り専用モードでオープンです。
V$DATABASEの「OPEN_MODE」には「READ ONLY」が示されます。
SQL> STARTUP OPEN READ ONLY
ORACLE instance started.
Total System Global Area 5033162888 bytes
Fixed Size 8906888 bytes
Variable Size 905969664 bytes
Database Buffers 4110417920 bytes
Redo Buffers 7868416 bytes
Database mounted.
Database opened.
SQL>
SQL> SELECT INSTANCE_NAME,STATUS FROM V$INSTANCE;
INSTANCE_NAME STATUS
---------------- ------------
dbomr OPEN
SQL> SELECT NAME,CDB,OPEN_MODE FROM V$DATABASE;
NAME CDB OPEN_MODE
--------- --- --------------------
DBOMR NO READ ONLY
SQL>
4.DBMS_PDB.DESCRIBEプロシージャを実行する。(Non-CDB)
続けて接続中のNon-CDBでDBMS_PDB.DESCRIBEプロシージャを実行し、PDBとしての構成が記述されたXMLファイルを生成します。
以下のパラメータを指定します。
- PDB_DESCR_FILE: 出力先のファイル名を完全パスで記述します。
出力先ディレクトリである/u01/softwareは事前に作成しoracleユーザー(ORACLEホーム所有者)を所有者にしています。
SQL> BEGIN
2 DBMS_PDB.DESCRIBE(
3 PDB_DESCR_FILE => '/u01/software/dbomr.xml');
4 END;
5 /
PL/SQL procedure successfully completed.
SQL>
SQL> EXIT
$
(参考) 生成されたXMLファイルの確認
ファイルのサイズはこんな感じです。
SQL> !ls -l /u01/software/dbomr.xml
-rw-r--r-- 1 oracle oinstall 6626 Sep 9 18:40 /u01/software/dbomr.xml
SQL>
5. 変換するNon-CDBがCDBと互換性があるか確認します。(CDB/PDB)
これは変換先のCDBでの操作です。
DBMS_PDB.CHECK_PLUG_COMPATIBILITYファンクションを実行して変換元のNon-CDBがCDBと互換があるか確認します。
結果が「YES」であれば問題なしとして次の手順に進みます。
接続するCDBはDBCAで作成した後から稼働状態です。
$ export ORACLE_SID=cdbomr
$ sqlplus / as sysdba
・・・中略・・・
SQL> SELECT INSTANCE_NAME,STATUS FROM V$INSTANCE;
INSTANCE_NAME STATUS
---------------- ------------
cdbomr OPEN
SQL> SELECT NAME,CDB,OPEN_MODE FROM V$DATABASE;
NAME CDB OPEN_MODE
--------- --- --------------------
CDBOMR YES READ WRITE
SQL> SHOW PDBS
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
SQL>
DBMS_PDB.CHECK_PLUG_COMPATIBILITYファンクションを実行します。
以下のパラメータを指定します。
- pdb_descr_file: Non-CDBで生成したXMLファイル
- pdb_name: 変換元のNon-CDBのDB_NAME
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 compatible CONSTANT VARCHAR2(3) :=
3 CASE DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
4 pdb_descr_file => '/u01/software/dbomr.xml',
5 pdb_name => 'dbomr')
6 WHEN TRUE THEN 'YES'
7 ELSE 'NO'
8 END;
9 BEGIN
10 DBMS_OUTPUT.PUT_LINE(compatible);
11 END;
12 /
YES
PL/SQL procedure successfully completed.
SQL>
SQL> EXIT
$
「YES」が返されたので互換性に問題はないと判断して次の手順に進みます。
少々わかりにくいのですがPL/SQLブロックの最後の行(12行目)の次の行の表示が結果です。
業務で使用する場合は出力の仕方をアレンジしたほうがよさそうです。
(参考) PDB_PLUG_IN_VIOLATIONS の確認(CDB/PDB)
DBMS_PDB.CHECK_PLUG_COMPATIBILITYファンクションの結果が「NO」の場合にはPDB_PLUG_IN_VIOLATIONSで原因を確認するよう説明されています。ERRORがある場合は問題を解決して再実行します。
前述の結果は「YES」でしたがPDB_PLUG_IN_VIOLATIONSを確認してみます。
SQL> SELECT * FROM PDB_PLUG_IN_VIOLATIONS;
TIME
---------------------------------------------------------------------------
NAME
--------------------------------------------------------------------------------
CAUSE TYPE
---------------------------------------------------------------- ---------
ERROR_NUMBER LINE
------------ ----------
MESSAGE
--------------------------------------------------------------------------------
STATUS
---------
ACTION
--------------------------------------------------------------------------------
CON_ID
----------
09-SEP-22 06.43.10.456452 PM
DBOMR
Non-CDB to PDB WARNING
0 1
PDB plugged in is a non-CDB, requires noncdb_to_pdb.sql be run.
PENDING
Run noncdb_to_pdb.sql.
1
SQL>
TYPE, MESSAGE, ACTIIONとSTATEを確認します。
MESSAGEとACTIONで、接続したPDBがNon-CDBであるためnoncdb_to_pdb.sqlを実行するよう示されています。
互換性確認の結果(TYPE)は「WARNING」です。
ステータス(STATUS)は「PEDING」なのでnoncdb_to_pdb.sqlの実行待ちということのようです。
6. Non-CDBを停止する。(Non-CDB)
これはNon-CDBの操作です。
SQL*Plusで接続し直して実行します。
$ export ORACLE_SID=dbomr
$ sqlplus / as sysdba
・・・中略・・・
SQL> SELECT INSTANCE_NAME,STATUS FROM V$INSTANCE;
INSTANCE_NAME STATUS
---------------- ------------
dbomr OPEN
SQL> SELECT NAME,CDB,OPEN_MODE FROM V$DATABASE;
NAME CDB OPEN_MODE
--------- --- --------------------
DBOMR NO READ ONLY
SQL> SHUTDOWN IMMEDIATE
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> EXIT
$
7. Non-CDBをPDBとしてプラグインする。(CDB/PDB)
これはCDBの操作です。
CDBに接続します。
$ export ORACLE_SID=cdbomr
$ sqlplus / as sysdba
・・・中略・・・
SQL> SELECT INSTANCE_NAME,STATUS FROM V$INSTANCE;
INSTANCE_NAME STATUS
---------------- ------------
cdbomr OPEN
SQL> SELECT NAME,CDB,OPEN_MODE FROM V$DATABASE;
NAME CDB OPEN_MODE
--------- --- --------------------
CDBOMR YES READ WRITE
SQL> SHOW PDBS
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
SQL>
プラグインを実行します。
変換後のファイル名(パス)はpdbseedと同じ並びになるように指定しています。
ユーザー表領域には指定は外しています。
SQL> CREATE PLUGGABLE DATABASE dbomr USING '/u01/software/dbomr.xml'
2 COPY
3 FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/DBOMR/','/u01/app/oracle/oradata/CDBOMR/dbomr/');
Pluggable database created.
SQL>
PDBを確認します。
SQL> SHOW PDBS
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 DBOMR MOUNTED
SQL>
コピーされたファイルを確認します。
dbomr ディレクトリとその配下にファイルがあります。
SQL> !ls -l /u01/app/oracle/oradata/CDBOMR/*
-rw-r----- 1 oracle oinstall 18726912 Sep 9 18:49 /u01/app/oracle/oradata/CDBOMR/control01.ctl
-rw-r----- 1 oracle oinstall 18726912 Sep 9 18:49 /u01/app/oracle/oradata/CDBOMR/control02.ctl
-rw-r----- 1 oracle oinstall 209715712 Sep 9 18:49 /u01/app/oracle/oradata/CDBOMR/redo01.log
-rw-r----- 1 oracle oinstall 209715712 Sep 9 18:34 /u01/app/oracle/oradata/CDBOMR/redo02.log
-rw-r----- 1 oracle oinstall 209715712 Sep 9 18:34 /u01/app/oracle/oradata/CDBOMR/redo03.log
-rw-r----- 1 oracle oinstall 576724992 Sep 9 18:49 /u01/app/oracle/oradata/CDBOMR/sysaux01.dbf
-rw-r----- 1 oracle oinstall 943726592 Sep 9 18:49 /u01/app/oracle/oradata/CDBOMR/system01.dbf
-rw-r----- 1 oracle oinstall 39854080 Sep 9 18:26 /u01/app/oracle/oradata/CDBOMR/temp01.dbf
-rw-r----- 1 oracle oinstall 492838912 Sep 9 18:49 /u01/app/oracle/oradata/CDBOMR/undotbs01.dbf
-rw-r----- 1 oracle oinstall 5251072 Sep 9 18:34 /u01/app/oracle/oradata/CDBOMR/users01.dbf
/u01/app/oracle/oradata/CDBOMR/dbomr:
total 2211928
-rw-r----- 1 oracle oinstall 576724992 Sep 9 18:49 sysaux01.dbf
-rw-r----- 1 oracle oinstall 922755072 Sep 9 18:49 system01.dbf
-rw-r----- 1 oracle oinstall 39854080 Sep 9 18:49 temp01.dbf
-rw-r----- 1 oracle oinstall 760225792 Sep 9 18:49 undotbs01.dbf
-rw-r----- 1 oracle oinstall 5251072 Sep 9 18:49 users01.dbf
/u01/app/oracle/oradata/CDBOMR/pdbseed:
total 913888
-rw-r----- 1 oracle oinstall 319823872 Sep 9 18:33 sysaux01.dbf
-rw-r----- 1 oracle oinstall 272637952 Sep 9 18:33 system01.dbf
-rw-r----- 1 oracle oinstall 39854080 Sep 9 18:26 temp01.dbf
-rw-r----- 1 oracle oinstall 340795392 Sep 9 18:33 undotbs01.dbf
SQL>
8. noncdb_to_pdb.sqlスクリプトの実行(CDB/PDB)
スクリプトを実行するため現行セッションのコンテナを新PDB(元Non-CDB)に切り替えます。
SQL> ALTER SESSION SET CONTAINER=dbomr;
Session altered.
SQL> SHOW PDBS
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 DBOMR MOUNTED
SQL>
noncdb_to_pdb.sqlスクリプトを実行します。スクリプトを実行するとディクショナリのPDB化が行われます。
このためそれなりに時間がかかります。感覚的にはデータベース作成と同じくらいです。
SQL> @$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql
以下、実行時出力の一部です。
SQL> SET FEEDBACK 1
SQL> SET NUMWIDTH 10
SQL> SET LINESIZE 80
SQL> SET TRIMSPOOL ON
SQL> SET TAB OFF
SQL> SET PAGESIZE 100
SQL> SET VERIFY OFF
SQL>
SQL> -- save settings
SQL> STORE SET ncdb2pdb.settings.sql REPLACE
Wrote file ncdb2pdb.settings.sql
SQL>
・・・後略・・・
次のようにプロンプトに復帰していれば完了しています。
・・・前略・・・
SQL> set timing ON
SQL> set trimout ON
SQL> set trimspool ON
SQL> set underline "-"
SQL> set verify OFF
SQL> set wrap ON
SQL> set xmloptimizationcheck OFF
SQL>
PDBの状態を見てみます。この状態では特に変化はありません。
SQL> SHOW PDBS
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 DBOMR MOUNTED
SQL>
(参考) PDB_PLUG_IN_VIOLATIONS の確認(CDB/PDB)
noncdb_to_PDB.sqlスクリプトを実行した後のPDB_PLUG_IN_VIOLATIONSの状態を見てみます。
確認のためルート・コンテナに切り替えています。
SQL> ALTER SESSION SET CONTAINER=CDB$ROOT;
Session altered.
SQL> SELECT * FROM PDB_PLUG_IN_VIOLATIONS;
TIME
---------------------------------------------------------------------------
NAME
--------------------------------------------------------------------------------
CAUSE TYPE
---------------------------------------------------------------- ---------
ERROR_NUMBER LINE
------------ ----------
MESSAGE
--------------------------------------------------------------------------------
STATUS
---------
ACTION
--------------------------------------------------------------------------------
CON_ID
----------
09-SEP-22 07.08.31.236332 PM
DBOMR
Non-CDB to PDB ERROR
0 1
PDB plugged in is a non-CDB, requires noncdb_to_pdb.sql be run.
PENDING
Run noncdb_to_pdb.sql.
3
SQL>
TYPEが「ERROR」に変わったようです。STATUS は「PENDING」のままです。
CON_IDもプラグインしたPDBのものが示されています。最初の確認では1でした。
9.新しいPDBをオープンします。(CDB/PDB)
SQL> ALTER PLUGGABLE DATABASE OPEN;
Pluggable database altered.
SQL>
新しいPDBがオープン・モードであることを確認して状態を保持します。
(CDBが起動したときにPDBもオープン状態になるようにします)
SQL> SHOW PDBS
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 DBOMR READ WRITE NO
SQL>
SQL> EXIT
(参考) PDB_PLUG_IN_VIOLATIONS を確認する。(CDB/PDB)
PDBをオープンした後のPDB_PLUG_IN_VIOLATIONSを見てみます。
ルート・コンテナに切り替えて実行します。
SQL> SELECT * FROM PDB_PLUG_IN_VIOLATIONS;
TIME
---------------------------------------------------------------------------
NAME
--------------------------------------------------------------------------------
CAUSE TYPE
---------------------------------------------------------------- ---------
ERROR_NUMBER LINE
------------ ----------
MESSAGE
--------------------------------------------------------------------------------
STATUS
---------
ACTION
--------------------------------------------------------------------------------
CON_ID
----------
09-SEP-22 07.12.34.091237 PM
DBOMR
Non-CDB to PDB ERROR
0 1
PDB plugged in is a non-CDB, requires noncdb_to_pdb.sql be run.
RESOLVED
Run noncdb_to_pdb.sql.
3
SQL>
TYPEは「ERROR」ですが、STATUSが「RESOLVED」に変わっています。
無事解決と認識してもらえたようです。
10. PDBをバックアップする。(CDB/PDB)
本検証では省略します。
以上でNon-CDBからPDBへの変換は完了です。
事後作業
実際の業務環境では、この後の作業として次のようなことも考えられます。
- 変換後のPDBのバックアップ(本検証ではスキップしたもの)
- 変換後のPDBのステート設定(自動起動設定)
- 変換前のNon-CDBおよび関連ファイルの削除
参考情報
-
Oracle Databaseデータベース・アップグレード・ガイド, 19c F16191-13(原本部品番号:E96252-42)
PDBプラグインを使用したPDBとしての非CDBの採用について
PDBとしての非CDBの適用 -
同じオペレーティング・システムでの非CDBのPDBへのアップグレードと変換, 18c 部品番号:E99109-03 (原本部品番号:E97287-06)
5 非CDBを使用したPDBの作成
あとがき
検証用にOracle Enterprise Manager 13c Cloud Control (EMCC)を構成しようと管理リポジトリを作りました。従来の習慣でNon-CDBにしていましたが、いざEMCCをインストールというところで、ふと思いつき、管理リポジトリをCDB/PDBにすることにしました。CDB/PDBで作り直してもよかったのですが製品マニュアルに「PDBとしての非CDBの適用」といった用法がありましたので参照しながら実践してみました。