Database Cloud ServiceにPDBを移動してみた


# 概要
オンプレミス環境に作っているOracle Datatabase 12c環境から、Database Cloud Serviceへ**プラガブル・データベース**を移動し、クラウド上に同一データ環境を再現してみます。

![plug-unplug.png](https://qiita-image-store.s3.amazonaws.com/0/127983/d348a662-e83c-d2c9-f558-1223d1877db6.png)

## プラガブル・データベースとは
Oracle Database 12cには**プラガブル・データベース(以降、PDB)**と呼ぶ機能があります。
これは、データベース内に仮想的にデータベースを構成する機能で、この仮想的なデータベースの事がPDBです。
PDBは、複数のPDB間でメモリ領域やプロセス、制御ファイルなどを共有します。そしてPDB単位で移動（プラグ/アンプラグ）する事が可能です。

- Oracle公開資料より引用

![プラガブル・データベース](http://image.slidesharecdn.com/oracledatabase12cnewfeatures-131126013157-phpapp01/95/oracle-database-12c-r1-3-638.jpg?cb=1385429627)

# 移動対象のプラガブル・データベース
オンプレミスに構成済みのプラガブル・データベースを確認してみます。

## プラガブル・データベース一覧
```bash
SQL> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB                            READ WRITE  NO
```

PDBという名前のプラガブル・データベースがあります。

## テーブル一覧
PDBに接続して構成済みのテーブルを確認してみます。

```bash
[oracle@db01 ~]$ sqlplus medrec/medrec@localhost:1521/pdb.jp.oracle.com
```

```sql
select table_name, tablespace_name, status from user_tables;

TABLE_NAME             TABLESPACE_NAME      STATUS
---------------------- -------------------- --------
ADMINISTRATORS         USERS                VALID
PATIENTS               USERS                VALID
PATIENTS_RECORDS       USERS                VALID
PHYSICIANS             USERS                VALID
PRESCRIPTIONS          USERS                VALID
RECORDS                USERS                VALID
RECORDS_PRESCRIPTIONS  USERS                VALID
SEQUENCE               USERS                VALID

8 rows selected.
```

8つのテーブルがあります。

## データファイル
移動対象のPDBのデータファイルを確認してみます。

```sql
set lines 120
set pages 100
set term off
clear col
col TABLESPACE_NAME  format a10
col FILE_NAME        format a35
col STATUS           format a10
col MBYTES           format 9,999,990
col INCRE            format 9,999,990
col AUTOEXTENSIBLE   format a5
col ONLINE_STATUS    format a6
select
  tablespace_name,
  file_name,
  status,
  bytes/1024/1024 mbytes,
  increment_by,
  autoextensible,
  online_status
from
  dba_data_files;

TABLESPACE FILE_NAME                           STATUS         MBYTES INCREMENT_BY AUTOE ONLINE
---------- ----------------------------------- ---------- ---------- ------------ ----- ------
SYSTEM     /u01/app/oracle/oradata/orcl12c/pdb AVAILABLE         250         1280 YES   SYSTEM
           /system01.dbf

SYSAUX     /u01/app/oracle/oradata/orcl12c/pdb AVAILABLE         570         1280 YES   ONLINE
           /sysaux01.dbf

USERS      /u01/app/oracle/oradata/orcl12c/pdb AVAILABLE           5          160 YES   ONLINE
           /pdb_users01.dbf
```

```bash
[oracle@db01 pdb]$ ls -l /u01/app/oracle/oradata/orcl12c/pdb
total 844888
-rw-r-----. 1 oracle oinstall   5251072 Nov  7 06:50 pdb_users01.dbf
-rw-r-----. 1 oracle oinstall 597696512 Nov  7 06:50 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 262152192 Nov  7 06:50 system01.dbf
-rw-r-----. 1 oracle oinstall  20979712 Nov  7 05:11 temp012016-11-07_04-38-41-AM.dbf
```

/u01/app/oracle/oradata/orcl12c/pdb ディレクトリの配下にデータファイルがあります。

# プラガブル・データベースのアンプラグ
プラガブル・データベースを取り出すことを**アンプラグ**と呼びます。
アンプラグをするとプラガブル・データベースに関する情報がXMLファイルとして出力されます。

## アンプラグの実施
以下のSQLでプラガブル・データベースをアンプラグします。
```sql
SQL> alter pluggable database pdb unplug into '/home/oracle/for_cloud/pdb.xml';

Pluggable database altered.
```

指定したディレクトリにXMLファイルが出力されています。

```bash
$ ls -l /home/oracle/for_cloud/pdb.xml
-rw-r--r--. 1 oracle oinstall 4367 Nov  7 06:50 /home/oracle/for_cloud/pdb.xml
```

# Database Cloud Service インスタンスの作成
プラガブル・データベースの移動先となるDatabase Cloud Serviceのインスタンスを作成しておきます。

- インスタンスサマリー

![dbcs.emea.oraclecloud.com_2016-11-07_15-58-46.png](https://qiita-image-store.s3.amazonaws.com/0/127983/6cd9b3f8-6602-2d1e-e73d-e4b1d4b76520.png)

- 作成したインスタンス

![dbcs.emea.oraclecloud.com_2016-11-07_16-33-03.png](https://qiita-image-store.s3.amazonaws.com/0/127983/3f55e179-84a6-e919-3540-91830aa4ed6e.png)

# Database Cloud Serviceへの移動
オンプレミスでアンプラグしたPDB(XMLファイル)とデータファイルをDatabase Cloud Serviceへ移動します。

## データファイル配置先の準備
Database Cloud Service環境にデータファイルを配置するディレクトリを作っておきます。

- データファイルディレクトリ：**/u02/app/oracle/oradata/**

```bash
$ ls -l /u02/app/oracle/oradata/ORCL
total 2282704
drwxr-x--- 2 oracle oinstall      4096 Nov  7 16:18 changetracking
-rwxr-x--- 1 oracle oinstall  17973248 Nov  7 16:56 control01.ctl
drwxr-x--- 2 oracle oinstall      4096 Nov  7 16:15 PDB1
drwxr-x--- 2 oracle oinstall      4096 Sep 12 16:35 pdbseed
-rwxr-x--- 1 oracle oinstall 702554112 Nov  7 16:52 sysaux01.dbf
-rwxr-x--- 1 oracle oinstall 828383232 Nov  7 16:55 system01.dbf
-rwxr-x--- 1 oracle oinstall 206577664 Nov  7 16:27 temp01.dbf
-rwxr-x--- 1 oracle oinstall 576724992 Nov  7 16:55 undotbs01.dbf
-rwxr-x--- 1 oracle oinstall   5251072 Nov  7 16:35 users01.dbf
```

/u02/app/oracle/oradata/ORCLにディレクトリを作成しておきます。

```bash
$ mkdir /u02/app/oracle/oradata/ORCL/pdb_from_onpremise
$ ls -l /u02/app/oracle/oradata/ORCL/
total 2282708
drwxr-x--- 2 oracle oinstall      4096 Nov  7 16:18 changetracking
-rwxr-x--- 1 oracle oinstall  17973248 Nov  7 17:02 control01.ctl
drwxr-x--- 2 oracle oinstall      4096 Nov  7 16:15 PDB1
drwxr-xr-x 2 oracle oinstall      4096 Nov  7 17:02 pdb_from_onpremise
drwxr-x--- 2 oracle oinstall      4096 Sep 12 16:35 pdbseed
-rwxr-x--- 1 oracle oinstall 702554112 Nov  7 17:01 sysaux01.dbf
-rwxr-x--- 1 oracle oinstall 828383232 Nov  7 17:00 system01.dbf
-rwxr-x--- 1 oracle oinstall 206577664 Nov  7 17:01 temp01.dbf
-rwxr-x--- 1 oracle oinstall 576724992 Nov  7 16:59 undotbs01.dbf
-rwxr-x--- 1 oracle oinstall   5251072 Nov  7 16:35 users01.dbf
```

## データファイルの移動
データファイルをクラウドへコピーします。

```bash
$ scp pdb_users01.dbf oracle@<DBCS-IPアドレス>:/u02/app/oracle/oradata/ORCL/pdb_from_onpremise/
$ scp sysaux01.dbf oracle@<DBCS-IPアドレス>:/u02/app/oracle/oradata/ORCL/pdb_from_onpremise/
$ scp system01.db oracle@<DBCS-IPアドレス>:/u02/app/oracle/oradata/ORCL/pdb_from_onpremise/
```

## アンプラグPDB XMLファイルの移動
アンプラグしたPDB XMLファイルをクラウドへコピーします。

```bash
$ scp pdb.xml oracle@<DBCS-IPアドレス>:/u02/app/oracle/oradata/ORCL/pdb_from_onpremise/
```

# プラガブル・データベースをプラグ
すでにDatabase Cloud Service上にはプラガブル・データベースが作られているので、まず削除した後に移動したきたPDBをプラグします。

## Database Cloud Service上のプラガブル・データベースを削除
```bash
SQL> alter pluggable database pdb1 close;
Pluggable database altered.
SQL> drop pluggable database pdb1 including datafiles;
Pluggable database dropped.
SQL> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
```

## アンプラグしたPDBのXMLを編集
XMLには、データファイルの配置場所がハードコードされているので、今回のケースであれば*/u02/app/oracle/oradata/ORCL/pdb_from_onpremise/*でパスを書き換える

## プラガブル・データベースのプラグ
以下のSQLでアンプラグしたPDBをプラグする

```bash
SQL> create pluggable database pdb1
  2  using '/u02/app/oracle/oradata/ORCL/pdb_from_onpremise/pdb.xml'
  3  file_name_convert = (
  4  '/u02/app/oracle/oradata/ORCL/pdb_from_onpremise/',
  5  '/u02/app/oracle/oradata/ORCL/pdb_migrated/'
  6  );

Pluggable database created.
```

## 確認

```sql
SQL>  select table_name, tablespace_name, status from user_tables;

TABLE_NAME            TABLESPACE_NAME      STATUS
--------------------- -------------------- --------
ADMINISTRATORS        USERS                VALID
PATIENTS              USERS                VALID
PATIENTS_RECORDS      USERS                VALID
PHYSICIANS            USERS                VALID
PRESCRIPTIONS         USERS                VALID
RECORDS               USERS                VALID
RECORDS_PRESCRIPTIONS USERS                VALID
SEQUENCE              USERS                VALID
```

# まとめ
PDBでの移動は、構成ファイルとデータファイルを移動先に配置し、認識させるという直感的に分かりやすい操作です。
オンプレミスからクラウドへの移動もとても簡単に実施できました。