0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Oracle Database:Non-CDBをPDBに変換する

0
Posted at

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ホーム所有者)を所有者にしています。

PDB構成のXMLファイル生成
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で作成した後から稼働状態です。

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>

DBMS_PDB.CHECK_PLUG_COMPATIBILITYファンクションを実行します。
以下のパラメータを指定します。

  • pdb_descr_file: Non-CDBで生成したXMLファイル
  • pdb_name: 変換元のNon-CDBのDB_NAME
Non-CDBの互換性確認
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を確認してみます。

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で接続し直して実行します。

Non-CDBのシャットダウン
$ 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に接続します。

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と同じ並びになるように指定しています。
ユーザー表領域には指定は外しています。

Non-CDBをPDBとしてプラグイン
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を確認します。

プラグイン後のPDBs
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の状態を見てみます。この状態では特に変化はありません。

スクリプト実行後の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)

PDBの読み書きモードでオープン
SQL> ALTER PLUGGABLE DATABASE OPEN;

Pluggable database altered.

SQL>

新しいPDBがオープン・モードであることを確認して状態を保持します。
(CDBが起動したときにPDBもオープン状態になるようにします)

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 Enterprise Manager 13c Cloud Control (EMCC)を構成しようと管理リポジトリを作りました。従来の習慣でNon-CDBにしていましたが、いざEMCCをインストールというところで、ふと思いつき、管理リポジトリをCDB/PDBにすることにしました。CDB/PDBで作り直してもよかったのですが製品マニュアルに「PDBとしての非CDBの適用」といった用法がありましたので参照しながら実践してみました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?