マルチテナント・コンテナ・データベース(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 の運用を検証していきたいと思います。