2章 マルチコンテナデータベースの作成
本章ではマルチコンテナデータベースを作成する手順を確認していきます。
CDBの作成
マルチコンテナデータベース(CDB)の作成方法は、通常のデータベース(非コンテナデータベース)とほぼ同様で、DBCAもしくは、CREATE DATABASEコマンドを使用して作成します。
CDBを作成するには、事前に初期化パラメータの「enable_pluggable_database」をTRUEにします。
また「CREATE DATABASE ... ENABLE PLUGGABLE DATABASE」で作成します。
SQL> CREATE DATABASE "orcl"
2 DATAFILE '/u01/app/oracle/oradata/orcl/system01.dbf'
3 SIZE 500M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
4 EXTENT MANAGEMENT LOCAL
5 SYSAUX DATAFILE '/u01/app/oracle/oradata/orcl/sysaux01.dbf' SIZE 50M
6 SMALLFILE DEFAULT TEMPORARY TABLESPACE TEMP
7 TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf' SIZE 20M
8 SMALLFILE UNDO TABLESPACE "UNDOTBS1"
9 DATAFILE '/u01/app/oracle/oradata/orcl/undotbs01.dbf' SIZE 50M
10 CHARACTER SET AL32UTF8
11 NATIONAL CHARACTER SET AL16UTF16
12 LOGFILE GROUP 1 ('/u01/app/oracle/oradata/orcl/redo01.log') SIZE 10M,
13 GROUP 2 ('/u01/app/oracle/oradata/orcl/redo02.log') SIZE 10M,
14 GROUP 3 ('/u01/app/oracle/oradata/orcl/redo03.log') SIZE 10M
15 USER SYS IDENTIFIED BY oracle USER SYSTEM IDENTIFIED BY oracle
16 ENABLE PLUGGABLE DATABASE
17 SEED FILE_NAME_CONVERT=
18 ('/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl/pdbseed');
Database created.
SEED FILE_NAME_CONVERTの部分は、ルートDBを基にシードPDBを作成する為に指定する必要があります。
上記コマンドを使用すると、ルートDB(CDB),シードPDBが作成されます。
次にCDB用のスクリプトを実行します。
SQL> @?/rdbms/admin/catcdb.sql
上記スクリプトを実行したときに「Can't locate Term/ReadKey.pm in @INC」のエラーが出力されてしまう場合は、PATH変数に$ORACLE_HOME/perl/binを追加してみてください。
上記だけでCDB環境を作成出来ます。
CDB環境になっているかどうか確認してみましょう。
SQL> SELECT NAME, CDB, CON_ID FROM V$DATABASE;
NAME CDB CON_ID
--------- --- ----------
ORCL YES 0
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
現在の構成はルートDB(CDB)とシードDB(PDBを作成するひな形のPDB)のみが存在する最小構成となっています。
プラガブルデータベース(PDB)の作成
次にアプリケーションで使用するPDBを作成するコマンドはCREATE PLUGGABLE DATABASEです。
このコマンドはCDB上でしか発行できません。PDB上で実行してもエラーにはなりませんが、何も起こりません。
PDBを作成する方法は複数あります。
・シードPDBからPDBを作成
・既存PDBからPDBを作成
・非CDBからPDBを作成
上記の方法からPDBを作成することができます。
既存PDBからPDBを作成することも可能である為、データベースのコピーも簡単に作成できます。
シードPDBからのPDB作成
ではシードPDBからPDBを作成する構文を確認していきましょう。
[構文] シードPDBからのPDB作成
SQL> CREATE PLUGGABLE DATABASE PDB名
2 ADMIN USER ユーザ名 IDENTIFIED BY pass;
3 [FILE_NAME_CONVERT=('シードPDBのディレクトリ','新PDBのディレクトリ')]
ADMIN USER句のユーザ名はそのPDBでの管理者ユーザとなります。
FILE_NAME_CONVERT句は新PDBのデータベースファイルの作成場所です。
上記の構文例はSYSTEM,SYSAUX等のデータファイルは指定した新PDBのディレクトリに作成されます。
FILE_NAME_CONVERT句は必須ではなく、Oracle Managed Files、PDB_FILE_NAME_CONVERTパラメータが設定されている場合は、省略可能です。PDB_FILE_NAME_CONVERTはPDBを作成するディレクトリを指定する初期化パラメータです。
SQL> CREATE PLUGGABLE DATABASE PDB1
2 ADMIN USER PDBADMIN IDENTIFIED BY "oracle"
3 FILE_NAME_CONVERT=
4 ('/u01/app/oracle/oradata/orcl/pdbseed',
5 '/u01/app/oracle/oradata/orcl/pdb1');
Pluggable database created.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
PDB1が作成されました。作成したPDB1のディレクトリ配下は以下となっています。
SQL> !ls -l u01/app/oracle/oradata/orcl/pdb1
合計 921680
-rw-r----- 1 oracle dba 20979712 1月 19 12:58 2017 pdbseed_temp01.dbf
-rw-r----- 1 oracle dba 671096832 1月 19 12:58 2017 sysaux01.dbf
-rw-r----- 1 oracle dba 272637952 1月 19 12:58 2017 system01.dbf
SYSTEM,SYSAUX,TEMP表領域が作成されています。
ではもう1つPDBを作成してみたいと思います。今回はPDB_FILE_NAME_CONVERTを使用した場合です。
このパラメータを使用すると、FILE_NAME_CONVERTが不要となり、より簡単にPDBを作成することができます。
SQL> show parameter pdb
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pdb_file_name_convert string
SQL> CREATE PLUGGABLE DATABASE PDB2
2 ADMIN USER PDBADMIN IDENTIFIED BY "oracle";
ADMIN USER PDBADMIN IDENTIFIED BY "oracle"
*
ERROR at line 2:
ORA-65016: FILE_NAME_CONVERT must be specified
FILE_NAME_CONVERTを省略した構文で実行しましたが、通常はエラーになります。
ではPDB_FILE_NAME_CONVERTを設定して、実行してみます。
SQL> alter system set pdb_file_name_convert =
2 '/u01/app/oracle/oradata/orcl/pdbseed','/u01/app/oracle/oradata/orcl/pdb2';
System altered.
SQL> show parameter pdb
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pdb_file_name_convert string /u01/app/oracle/oradata/orcl/p
dbseed, /u01/app/oracle/oradata
/orcl/pdb2
SQL> CREATE PLUGGABLE DATABASE PDB2
2 ADMIN USER PDBADMIN IDENTIFIED BY "oracle";
Pluggable database created.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
4 PDB2 MOUNTED
以上がシードDBからのPDB作成の方法となります。
既存PDBからのPDB作成
では次に既存PDBからのPDB作成を行っていきます。
[構文] 既存PDBからのPDBの作成
SQL> CREATE PLUGGABLE DATABASE PDB名 FROM コピー元PDB
2 [FILE_NAME_CONVERT=('シードPDBのディレクトリ','新PDBのディレクトリ')];
では実際に既存のPDBから新規にPDBを作成してみましょう。
SQL> CREATE PLUGGABLE DATABASE PDB3 FROM PDB1
2 FILE_NAME_CONVERT=
3 ('/u01/app/oracle/oradata/orcl/pdbseed','/u01/app/oracle/oradata/orcl/pdb3')
create pluggable database pdb3 from pdb1
*
ERROR at line 1:
ORA-65081: database or pluggable database is not open in read only mode
上記エラーとなりました。コピー元であるPDB1は読み取り専用でOPENしている必要があるようです。
ただし12cR2(12.2以降)ではホットクローン機能により、読み取り専用での必要がなくなりました。
今回使用しているのは12.1のバージョンなので、読取り専用にして作成していきます。
SQL> ALTER PLUGGABLE DATABASE PDB1 OPEN READ ONLY;
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ ONLY NO
4 PDB2 MOUNTED
SQL> CREATE PLUGGABLE DATABASE PDB3 FROM PDB1
2 FILE_NAME_CONVERT=
3 ('/u01/app/oracle/oradata/orcl/pdbseed','/u01/app/oracle/oradata/orcl/pdb3')
Pluggable database created.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ ONLY NO
4 PDB2 MOUNTED
5 PDB3 MOUNTED
これだけでPDBが新規に作成できます。
$ ls -l pdb3
合計 1106012
-rw-r----- 1 oracle dba 20979712 1月 19 14:00 2017 pdbseed_temp01.dbf
-rw-r----- 1 oracle dba 734011392 1月 19 14:01 2017 sysaux01.dbf
-rw-r----- 1 oracle dba 293609472 1月 19 14:01 2017 system01.dbf
-rw-r----- 1 oracle dba 104865792 1月 19 14:01 2017 user01.dbf
$ ls -l pdb1
合計 1617708
-rw-r----- 1 oracle dba 559947776 11月 13 23:00 2016 pdbseed_temp01.dbf
-rw-r----- 1 oracle dba 734011392 1月 19 13:59 2017 sysaux01.dbf
-rw-r----- 1 oracle dba 293609472 1月 19 13:59 2017 system01.dbf
-rw-r----- 1 oracle dba 104865792 1月 19 13:59 2017 user01.dbf
PDB1,PDB3で同じデータファイルがコピーされました。
この機能を使用すれば、本番環境のPDBを検証用として簡単に作成することが可能です。
PDBの削除
次はPDBの削除方法です。検証として作成したPDBでもう不要になった場合など、
ディスクを節約する為にも削除しましょう。
[構文] PDBの削除
SQL> DROP PLUGGABLE DATABASE PDB名 [INCLUDING DATAFILES|KEEP DATAFILES];
INCLUDING DATAFILES句を指定した場合、OS上に作成されたファイルは削除されます。
KEEP DATAFILES句はファイルを残します。デフォルトはKEEP DATAFILESです。
SQL> DROP PLUGGABLE DATABASE pdb3 INCLUDING DATAFILES;
Pluggable database dropped.
$ ls -l pdb3
合計 0
INCLUDING DATAFILESを付けて削除した為、ディスク上のファイルも削除されました。
PDBのプラグイン、アンプラグ
PDBはプラグ(接続)、プラグアウト(切断)の機能を試用して、別のCDBへPDBを移行することが出来ます。
従来は別のDBに移行するとなると、エクスポート、インポートやなどを使用して移行する必要がありました。
PDBでは簡単にDBの移行が可能になっています。
[構文] PDBの切断
SQL> ALTER PLUGGABLE DATABASE PDB名 UNPLUG INTO '/oracle/data/pdb1.xml';
PDBの切断はXMLファイルを作成し、現在のCDBから切り離しを行います。
上記コマンドを実行するにはPDBをクローズしている必要があります。
それでは今回はPDB2を同じCDB内のPDB3として接続(プラグ)してみたいと思います。
SQL> SPAN>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 READ WRITE NO
SQL> alter pluggable database pdb2 close;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 MOUNTED
SQL> ALTER PLUGGABLE DATABASE pdb2
2 UNPLUG INTO '/home/oracle/pdb2_unplug.xml';
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 MOUNTED
UNPLUGコマンドを実施してもshow pdbs上ではまだ表示された状態です。
この状態でPDB2を起動してもエラーとなります。
SQL> alter pluggable database pdb2 open;
alter pluggable database pdb2 open
*
ERROR at line 1:
ORA-65086: cannot open/close the pluggable database
SQL> drop pluggable database pdb2;
Pluggable database dropped.
上記コマンドはPDB2のデータファイルは残されている状態です。
この時にデータファイルが削除されてしまうと接続できなくなるので注意してください。
では次にプラグインの方法です。先ほどアンプラグしたときに作成されたXMLファイルを使用して、
PDB3を作成していきます。
まずはXMLファイルの内容を確認してみましょう。
$ head -100 pdb2_unplug.xml
<?xml version="1.0" encoding="UTF-8"?>
<PDB>
<pdbname>PDB2</pdbname>
<cid>4</cid>
<byteorder>1</byteorder>
<vsn>202375168</vsn>
<dbid>3999893462</dbid>
<cdbid>397531058</cdbid>
<guid>466B89F856AB741EE05326C2D50A1D1B</guid>
<uscnbas>486613161</uscnbas>
<uscnwrp>0</uscnwrp>
<rdba>4194824</rdba>
<tablespace>
<name>SYSTEM</name>
<type>0</type>
<tsn>0</tsn>
<status>1</status>
<issft>0</issft>
<file>
<path>/u01/app/oracle/oradata/ORCL/pdb2/system01.dbf</path>
<afn>31</afn>
<rfn>1</rfn>
<createscnbas>485461082</createscnbas>
<createscnwrp>0</createscnwrp>
<status>1</status>
<fileblocks>33280</fileblocks>
<blocksize>8192</blocksize>
<vsn>202375168</vsn>
<fdbid>3999893462</fdbid>
<fcpsw>0</fcpsw>
<fcpsb>486613159</fcpsb>
<frlsw>0</frlsw>
<frlsb>479867061</frlsb>
<frlt>919941790</frlt>
</file>
</tablespace>
XMLにはPDB名や表領域の情報が記載されています。
今回はPDB2からPDB3を作成します。ディレクトリ名は変えておきたいと思います。
$ pwd
/u01/app/oracle/oradata/ORCL
$ ls
arch pdb1 redo01_01.log system01.dbf test_tbs02.dbf
control01.ctl pdb2 redo02.log temp01.dbf undo_apl.dbf
control02.ctl pdbseed redo03.log test.dbf undotbs01.dbf
control03.ctl redo01.log sysaux01.dbf test_tbs.dbf users01.dbf
ipet-linux2$
ipet-linux2$ mv pdb2 pdb3
ipet-linux2$ ls pdb3
sysaux01.dbf system01.dbf users01.dbf
次にXMLファイルのパスも変更してみます。
$ vi pdb2_unplug.xml
⇒ pdb2をpdb3に変更
$ grep path pdb2_unplug.xml
/u01/app/oracle/oradata/ORCL/pdb3/system01.dbf
/u01/app/oracle/oradata/ORCL/pdb3/sysaux01.dbf
/u01/app/oracle/oradata/ORCL/pdb3/pdbseed_temp01.dbf
/u01/app/oracle/oradata/ORCL/pdb3/users01.dbf
では次にプラグしてみます。プラグの方法はCREATE PLUGGABLE DATABASEでPDBを作成します。
[構文] PDBの接続
SQL> CREATE PLUGGABLE DATABASE PDB名 USING 'XMLファイルのパス' nocopy;
SQL> CREATE PLUGGABLE DATABASE pdb3
2 USING '/home/oracle/pdb2_unplug.xml' nocopy;
Pluggable database created.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB3 MOUNTED
SQL> alter pluggable database pdb3 open;
Pluggable database altered.
以上がCDB,PDBの作成方法となります。
PDBになってからは簡単にDBの複製やDBを別のサーバに移動することができるようになりました。
今までサーバのEOSLなどでデータ移行が必要でしたが、簡単に移行することができそうですね。