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などでデータ移行が必要でしたが、簡単に移行することができそうですね。