Oracleデータベースの 非コンテナデータベース を使用した プラガブルデータベース の作成

マルチテナント・コンテナ・データベース(CDB)はOracle12c から登場した機能ですが、古くから Oracle に携わっていた事もあり、19c の現在まで慣れ親しんだ従来のデータベース(非CDB)で構築してきました。

21c、23c の新しいバージョンでは非CDB がサポートされないこともあり、CDBへの対応が必要になります。そこで今回は既存の非CDB を用いて CDB 上の プラガブルデータベース(PDB)を作成する手順を試します。

マルチテナント・コンテナ・データベースとは

コンテナデータベース(CDB)の中に複数のプラガブルデータベース(PDB)を持たせることのできる機能です。ユーザーは PDB にデータを格納します。

1つのサーバーに1つのデータベースの構成に対して、1つのサーバー上で複数の PDB を CDB で一元管理する構成に変更すると、以下のメリットがあります。

  • ハードウェアを統合できるのでハードウェアコスト、サーバーOS管理が削減されます。
  • メモリ、プロセス共有によりリソースを効率的に利用できます。
  • パッチ適用、アップグレードは CDB にのみ実施すれば PDBに反映されるので作業が簡素化されます。

マルチテナント・コンテナ・データベースは Standard Edition 2 でも利用できますが、作成できる PDB は3つまでとなっています。Enterprise Edition では追加オプションの OracleMultitenantライセンスを用いることで 252 まで作成できます。

作業概要

元の非CDB に対して新規の CDB を用意し、非CDB のデータファイルを PDB として CDB に接続します。PDB 作成後に非CDB は削除します。

作業環境

CDB と 非CDB は同じOS,DBバージョンであることが必要です。

ソフトウェア バージョン
OS Red Hat Enterprise Linux release 8.6 (Ootpa)
Oracle Oracle Database 19c Standard Edition 2 19.16.0.0.0

データベースは CDB と 非CDB の2つを用意します。

CDB 、非CDB は同一サーバー上に構築し ORACLE_HOME は同一です。

  • CDB
名称
DB名、SID oracdb
データファイルパス /data/oradata/ORACDB
  • 非CDB
名称
DB名、SID noncdb
データファイルパス /data/oradata/NONCDB

作業手順

非CDB を読み取りモードで起動

データベースが更新されないように読み取りモードで起動します。

$ export ORACLE_SID=noncdb
$ sqlplus / as sysdba
SQL> startup open read only
ORACLEインスタンスが起動しました。

Total System Global Area 3103781608 bytes
Fixed Size          8901352 bytes
Variable Size        1090519040 bytes
Database Buffers     1996488704 bytes
Redo Buffers            7872512 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL> 

読み取り専用モードで起動したことを確認します。

SQL> select name,cdb,open_mode from v$database;

NAME      CDB OPEN_MODE
--------- --- --------------------
NONCDB    NO  READ ONLY

非CDB のデータベース情報を xmlファイルに出力

データベースを構成するデータファイルの情報を取得します。

SQL> begin
  2    DBMS_PDB.DESCRIBE(
  3      pdb_descr_file => '/home/oracle/noncdb.xml');
  4  end;
  5  /

PL/SQLプロシージャが正常に完了しました。

非CDB と CDB の互換性確認

データベースの構成が CDB と互換性があるか検証します。

$ export ORACLE_SID=oracdb
$ sqlplus / as sysdba
SQL> declare
  2    compatible constant varchar2(3) :=
  3      case dbms_pdb.check_plug_compatibility(
  4        pdb_descr_file => '/home/oracle/noncdb.xml',
  5        pdb_name       => 'noncdb')
  6      when true then 'YES'
  7      else 'NO'
  8  end;
  9  begin
 10    dbms_output.put_line(compatible);
 11  end;
 12  /
YES

PL/SQLプロシージャが正常に完了しました。

「YES」と出力されていれば互換性に問題はありません。

非CDB を CDB に接続

非CDB を停止

$ export ORACLE_SID=noncdb
$ sqlplus / as sysdba
SQL> shutdown immediate

非CDB を CDBに接続 非CDB のデータファイルは「/data/oradata/NONCDB/」から「/data/oradata/ORACDB/NONCDB/」にコピーされ PDB として認識されます。
※コピー先のディレクトリは自動で作成されます。
※ディレクトリの後の「/」をつけないとファイル名として先頭に付与されます。

$ export ORACLE_SID=oracdb
$ sqlplus / as sysdba
SQL> create pluggable database noncdb using '/home/oracle/noncdb.xml'
  2    copy
  3    file_name_convert=('/data/oradata/NONCDB/','/data/oradata/ORACDB/NONCDB/');

プラガブル・データベースが作成されました。

作成された PDB を確認します。

SQL> show pdbs

    CON_ID CON_NAME           OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED           READ ONLY  NO
     3 NONCDB         MOUNTED

ディクショナリ更新

PDBに接続します。

SQL> alter session set container = NONCDB;

セッションが変更されました。

SQL> show con_name

CON_NAME
------------------------------
NONCDB

スクリプト noncdb_to_pdb.sql を実行し、ディクショナリをpdbに合わせて更新します。
スクリプト実行時は以下メッセージが出力されます。

SQL> @?/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> WHENEVER SQLERROR EXIT;
SQL> 
SQL> DOC
DOC>#######################################################################
DOC>#######################################################################
DOC>   The following statement will cause an "ORA-01403: no data found"
DOC>   error if we're not in a PDB.
DOC>   This script is intended to be run right after plugin of a PDB,
DOC>   while inside the PDB.
DOC>#######################################################################
DOC>#######################################################################
DOC>#
SQL> 
(中略)
SQL> -- leave the PDB in the same state it was when we started
SQL> BEGIN
  2    execute immediate '&open_sql &restricted_state';
  3  EXCEPTION
  4    WHEN OTHERS THEN
  5    BEGIN
  6      IF (sqlcode <> -900) THEN
  7        RAISE;
  8      END IF;
  9    END;
 10  END;
 11  /

PL/SQLプロシージャが正常に完了しました。

SQL> 
SQL> WHENEVER SQLERROR CONTINUE;
SQL> 

データベースのオープン

データベースをオープンして PDB の状態を確認します。

SQL> show con_name

CON_NAME
------------------------------
NONCDB
SQL> alter database open;

データベースが変更されました。

読み書きモードで起動していることを確認します。

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 NONCDB                          READ WRITE NO

非CDBの削除

PDB に移行済みの非CDB が不要であればデータベースを削除します。
まずはデータベースを制限モードで起動します。

$ export ORACLE_SID=noncdb
$ sqlplus / as sysdba
SQL> startup restrict mount; 
ORACLEインスタンスが起動しました。

Total System Global Area 3103781608 bytes
Fixed Size          8901352 bytes
Variable Size        1090519040 bytes
Database Buffers     1996488704 bytes
Redo Buffers            7872512 bytes
データベースがマウントされました。

drop database を実行してデータベースを削除します。

SQL> drop database;

データベースが削除されました。

Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.16.0.0.0との接続が切断されました。

さいごに

非CDBのサポートが 19c を最後に終了することもあり、今後は PDB での構築、移行が増えると思われます。

PDB の運用を検証する環境を作成するにあたり、既存の非CDB環境を PDB へ移行する検証を行いました。今後はこの環境で PDB の運用を検証していきたいと思います。

執筆担当者プロフィール
三条 光暢

三条 光暢(日本ビジネスシステムズ株式会社)

Oracle、PostgreSQLを中心に各種データベースの設計・構築・運用を携わっています。

担当記事一覧