Pluggable Database 環境に慣れる（３）(Oracle Database 19c)

Pluggable Databaseという名前の通り、PDBは他のCDBに対して気軽に取り外し（UNPLUG）や取り付け（PLUG）を行うことができます。ここでは文字コードが異なるCDBとPDB間でPDBの移動を行います。文字コードはCDBはAL32UTF8で、PDBはJA16SJISTILDEです。

# UNPLUGを行う

## 文字コードの確認
実行中のPDBは文字コードをJA16SJISTILDEで作成しています。

```
SQL> SELECT PARAMETER, VALUE FROM V$NLS_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

PARAMETER                                                        VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_CHARACTERSET                                                 JA16SJISTILDE

```

## UNPLUG操作

ALTER PLUGGABLE DATABASE UNPLUG文でPDBを取り外します。オープン状態ではエラーになるため、クローズしてから行うか、UNPLUGと同時にCLOSEを行います。UNPLUGを行う場合にはメタデータの保存先としてXMLファイル名を指定します。ファイルにパスを指定しない場合は、${ORACLE_HOME}/dbsディレクトリに作成されます。

```
SQL> SELECT NAME, OPEN_MODE FROM V$PDBS;

NAME                           OPEN_MODE
------------------------------ ----------
PDB$SEED                       READ ONLY
PDB4                           READ WRITE

SQL> ALTER PLUGGABLE DATABASE pdb4 UNPLUG INTO 'pdb4.xml';
ALTER PLUGGABLE DATABASE pdb4 UNPLUG INTO 'pdb4.xml'
*
ERROR at line 1:
ORA-65025: Pluggable database PDB4 is not closed on all instances.

SQL> ALTER PLUGGABLE DATABASE pdb4 CLOSE;

Pluggable database altered.

SQL> ALTER PLUGGABLE DATABASE pdb4 UNPLUG INTO 'pdb4.xml';

Pluggable database altered.

```

UNPLUGされてもPDBの情報は削除されません。完全に削除するにはDROP PLUGGABLE DATABASE文を実行します。下記の例ではKEEP DATAFILES句を指定して、OSからデータファイルは削除しません。

```
SQL> SELECT NAME, OPEN_MODE FROM V$PDBS;

NAME                           OPEN_MODE
------------------------------ ----------
PDB$SEED                       READ ONLY
PDB4                           MOUNTED

SQL> SELECT PDB_NAME, STATUS FROM CDB_PDBS;

PDB_NAME                       STATUS
------------------------------ ----------
PDB$SEED                       NORMAL
PDB4                           UNPLUGGED

SQL> DROP PLUGGABLE DATABASE pdb4 KEEP DATAFILES;

Pluggable database dropped.
```

## XMLファイルの確認
ALTER PLUGGABLE DATABASE UNPLUG文に指定したXMLファイルには、データファイルのパス以外に使用していたデータベース・オプション、稼働統計情報、バージョン等の情報が出力されています。

```
$ cat pdb4.xml
<?xml version="1.0" encoding="UTF-8"?>
<PDB>
  <xmlversion>1</xmlversion>
  <pdbname>PDB4</pdbname>
  <cid>3</cid>
  <byteorder>1</byteorder>
  <vsn>318767104</vsn>
  <vsns>
    <vsnnum>19.0.0.0.0</vsnnum>
    <cdbcompt>19.0.0.0.0</cdbcompt>
    <pdbcompt>19.0.0.0.0</pdbcompt>
    <vsnlibnum>0.0.0.0.24</vsnlibnum>
    <vsnsql>24</vsnsql>
    <vsnbsv>8.0.0.0.0</vsnbsv>
  </vsns>
  <dbid>531233205</dbid>
  <ncdb2pdb>0</ncdb2pdb>
  <cdbid>2820269750</cdbid>
  <guid>9FDA23CACBB50EC0E053D301A8C03F1A</guid>
  <uscnbas>1073514</uscnbas>
  <uscnwrp>0</uscnwrp>
  <undoscn>238</undoscn>
  <rdba>4194824</rdba>
  <tablespace>
    <name>SYSTEM</name>
    <type>0</type>
    <tsn>0</tsn>
    <status>1</status>
    <issft>0</issft>
    <isnft>0</isnft>
    <encts>0</encts>
    <flags>0</flags>
    <bmunitsize>8</bmunitsize>
    <file>
      <path>/u01/app/oracle/oradata/pdb4/pdbseed/system01.dbf</path>
      <afn>8</afn>
      <rfn>1</rfn>
      <createscnbas>1070691</createscnbas>
      <createscnwrp>0</createscnwrp>
      <status>1</status>
      <fileblocks>26880</fileblocks>
      <blocksize>8192</blocksize>
      <vsn>318767104</vsn>
      <fdbid>531233205</fdbid>
      <fcpsb>1073505</fcpsb>
      <fcpsw>0</fcpsw>
      <frlsb>1</frlsb>
      <frlsw>0</frlsw>
      <frlt>1033983222</frlt>
      <autoext>1</autoext>
      <maxsize>4194302</maxsize>
      <incsize>1280</incsize>
      <plugscn>0</plugscn>
      <plugafn>0</plugafn>
      <plugdbid>0</plugdbid>
    </file>
  </tablespace>
  <tablespace>
    <name>SYSAUX</name>
    <type>0</type>
    <tsn>1</tsn>
    <status>1</status>
    <issft>0</issft>
    <isnft>0</isnft>
    <encts>0</encts>
    <flags>0</flags>
    <bmunitsize>8</bmunitsize>
    <file>
      <path>/u01/app/oracle/oradata/pdb4/pdbseed/sysaux01.dbf</path>
      <afn>9</afn>
      <rfn>4</rfn>
      <createscnbas>1070713</createscnbas>
      <createscnwrp>0</createscnwrp>
      <status>1</status>
      <fileblocks>21120</fileblocks>
      <blocksize>8192</blocksize>
      <vsn>318767104</vsn>
      <fdbid>531233205</fdbid>
      <fcpsb>1073505</fcpsb>
      <fcpsw>0</fcpsw>
      <frlsb>1</frlsb>
      <frlsw>0</frlsw>
      <frlt>1033983222</frlt>
      <autoext>1</autoext>
      <maxsize>4194302</maxsize>
      <incsize>1280</incsize>
      <plugscn>0</plugscn>
      <plugafn>0</plugafn>
      <plugdbid>0</plugdbid>
    </file>
  </tablespace>
  <tablespace>
    <name>UNDOTBS1</name>
    <type>2</type>
    <tsn>2</tsn>
    <status>1</status>
    <issft>0</issft>
    <isnft>0</isnft>
    <encts>0</encts>
    <flags>0</flags>
    <bmunitsize>8</bmunitsize>
    <file>
      <path>/u01/app/oracle/oradata/pdb4/pdbseed/undotbs01.dbf</path>
      <afn>10</afn>
      <rfn>6</rfn>
      <createscnbas>1070716</createscnbas>
      <createscnwrp>0</createscnwrp>
      <status>1</status>
      <fileblocks>25600</fileblocks>
      <blocksize>8192</blocksize>
      <vsn>318767104</vsn>
      <fdbid>531233205</fdbid>
      <fcpsb>1073505</fcpsb>
      <fcpsw>0</fcpsw>
      <frlsb>1</frlsb>
      <frlsw>0</frlsw>
      <frlt>1033983222</frlt>
      <autoext>1</autoext>
      <maxsize>4194302</maxsize>
      <incsize>640</incsize>
      <plugscn>0</plugscn>
      <plugafn>0</plugafn>
      <plugdbid>0</plugdbid>
    </file>
  </tablespace>
  <tablespace>
    <name>TEMP</name>
    <type>1</type>
    <tsn>3</tsn>
    <status>1</status>
    <issft>0</issft>
    <isnft>0</isnft>
    <encts>0</encts>
    <flags>0</flags>
    <bmunitsize>128</bmunitsize>
    <file>
      <path>/u01/app/oracle/oradata/pdb4/pdbseed/temp01.dbf</path>
      <afn>3</afn>
      <rfn>1</rfn>
      <createscnbas>1070692</createscnbas>
      <createscnwrp>0</createscnwrp>
      <status>1</status>
      <fileblocks>2560</fileblocks>
      <blocksize>8192</blocksize>
      <vsn>318767104</vsn>
      <autoext>1</autoext>
      <maxsize>4194302</maxsize>
      <incsize>80</incsize>
      <plugscn>0</plugscn>
      <plugafn>0</plugafn>
      <plugdbid>0</plugdbid>
    </file>
  </tablespace>
  <tablespace>
    <name>USERS</name>
    <type>0</type>
    <tsn>4</tsn>
    <status>1</status>
    <issft>0</issft>
    <isnft>0</isnft>
    <encts>0</encts>
    <flags>0</flags>
    <bmunitsize>8</bmunitsize>
    <file>
      <path>/u01/app/oracle/oradata/pdb4/pdbseed/users01.dbf</path>
      <afn>11</afn>
      <rfn>11</rfn>
      <createscnbas>1071406</createscnbas>
      <createscnwrp>0</createscnwrp>
      <status>1</status>
      <fileblocks>1280</fileblocks>
      <blocksize>8192</blocksize>
      <vsn>318767104</vsn>
      <fdbid>531233205</fdbid>
      <fcpsb>1073505</fcpsb>
      <fcpsw>0</fcpsw>
      <frlsb>1</frlsb>
      <frlsw>0</frlsw>
      <frlt>1033983222</frlt>
      <autoext>1</autoext>
      <maxsize>4194302</maxsize>
      <incsize>1</incsize>
      <plugscn>0</plugscn>
      <plugafn>0</plugafn>
      <plugdbid>0</plugdbid>
    </file>
  </tablespace>
  <recover>0</recover>
  <optional>
    <ncdb2pdb>0</ncdb2pdb>
    <csid>838</csid>
    <ncsid>2000</ncsid>
    <options>
      <option>CATALOG=19.0.0.0.0</option>
      <option>CATPROC=19.0.0.0.0</option>
      <option>OWM=19.0.0.0.0</option>
      <option>XDB=19.0.0.0.0</option>
    </options>
    <dv>0</dv>
    <APEX>NULL</APEX>
    <parameters>
      <parameter>processes=300</parameter>
      <parameter>nls_language='AMERICAN'</parameter>
      <parameter>nls_territory='AMERICA'</parameter>
      <parameter>db_block_size=8192</parameter>
      <parameter>compatible='19.0.0'</parameter>
      <parameter>open_cursors=300</parameter>
      <parameter>pga_aggregate_target=1357905920</parameter>
      <parameter>enable_pluggable_database=TRUE</parameter>
      <spfile>*.db_securefile='PREFERRED'</spfile>
    </parameters>
    <sqlpatches>
      <sqlpatch>19.3.0.0.0 Release_Update 1904101227 (RU): APPLY SUCCESS</sqlpatch>
    </sqlpatches>
    <tzvers>
      <tzver>primary version:32</tzver>
      <tzver>secondary version:0</tzver>
    </tzvers>
    <walletkey>0</walletkey>
    <services/>
    <opatches>
      <opatch>29517242</opatch>
    </opatches>
    <hasclob>1</hasclob>
    <awr>
      <loadprofile>CPU used by this session=1.817317</loadprofile>
      <loadprofile>DB time=26.914942</loadprofile>
      <loadprofile>db block changes=69.265260</loadprofile>
      <loadprofile>execute count=125.443222</loadprofile>
      <loadprofile>logons cumulative=0.011393</loadprofile>
      <loadprofile>parse count (hard)=11.291935</loadprofile>
      <loadprofile>parse count (total)=60.097882</loadprofile>
      <loadprofile>physical reads=3.500227</loadprofile>
      <loadprofile>physical writes=0.829861</loadprofile>
      <loadprofile>redo size=15539.804408</loadprofile>
      <loadprofile>session logical reads=523.059404</loadprofile>
      <loadprofile>user calls=10.999888</loadprofile>
      <loadprofile>user commits=0.984531</loadprofile>
      <loadprofile>user logons cumulative=0.004292</loadprofile>
      <loadprofile>user rollbacks=0.004539</loadprofile>
    </awr>
    <hardvsnchk>0</hardvsnchk>
    <localundo>1</localundo>
    <apps/>
    <dbedition>8</dbedition>
    <dvopsctl>2</dvopsctl>
    <clnupsrcpal>1</clnupsrcpal>
  </optional>
</PDB>
```

# PLUGを行う
 PDBが使用していたデータファイルとXMLファイルをPLUGを行うデータベースに移動します。PLUG側のCDBは文字コードとしてAL32UTF8を使用しています。

##文字コードの確認

```
SQL> SELECT PARAMETER, VALUE FROM V$NLS_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

PARAMETER                                                        VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_CHARACTERSET                                                 AL32UTF8

```

## 互換性の確認

コピーしたPDBデータファイルをPLUGできるかどうかを確認します。DBMS_PDBパッケージのCHECK_PLUG_COMPATIBILITY関数を実行します。この関数にはXMLファイル名とPDB名（オプション）を指定します。TRUEが返ればPLUG操作を行うことができます。

```
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    comp BOOLEAN;
  3  BEGIN
  4    comp := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(pdb_descr_file=>'/u01/app/oracle/product/19.3.0/dbhome_1/dbs/pdb4.xml');
  5    CASE comp
  6      WHEN TRUE  THEN DBMS_OUTPUT.PUT_LINE('Yes');
  7      WHEN FALSE THEN DBMS_OUTPUT.PUT_LINE('No');
  8    END CASE;
  9  END;
 10  /
Yes

```

CHECK_PLUG_COMPATIBILITY関数は、PDBの互換性に懸念がある場合PDB_PLUG_IN_VIOLATIONSテーブルに情報を書き込みます。上記の例ではCHECK_PLUG_COMPATIBILITY関数はTRUEを返していますが、
PDB_PLUG_IN_VIOLATIONSテーブルにはいくつかの互換性に関する警告が出力されています。

```
SQL> SELECT MESSAGE FROM PDB_PLUG_IN_VIOLATIONS WHERE NAME='PDB4' ORDER BY LINE;

MESSAGE
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Database option APS mismatch: PDB installed version NULL. CDB installed version 19.0.0.0.0.
PDB not in Unicode (AL32UTF8) character set. PDB character set JA16SJISTILDE.
CDB parameter processes mismatch: Previous 300 Current 400
Database option CATJAVA mismatch: PDB installed version NULL. CDB installed version 19.0.0.0.0.
CDB parameter pga_aggregate_target mismatch: Previous 1295M Current 961M
Database option CONTEXT mismatch: PDB installed version NULL. CDB installed version 19.0.0.0.0.
Database option JAVAVM mismatch: PDB installed version NULL. CDB installed version 19.0.0.0.0.
Database option ORDIM mismatch: PDB installed version NULL. CDB installed version 19.0.0.0.0.
Database option SDO mismatch: PDB installed version NULL. CDB installed version 19.0.0.0.0.
Database option XML mismatch: PDB installed version NULL. CDB installed version 19.0.0.0.0.
Database option XOQ mismatch: PDB installed version NULL. CDB installed version 19.0.0.0.0.

11 rows selected.

```
## PLUG操作
CREATE PLUGGABLE DATABASE文にXMLファイルを指定してPDBを作成します。ファイル名の変換等のオプションを指定することができます。ここではファイルのコピーを行わない（NOCOPY）のみ指定しているので、データファイルは元と同じパスが使用されます。

```
SQL> CREATE PLUGGABLE DATABASE pdb4 USING 'pdb4.xml' NOCOPY;

Pluggable database created.

SQL> ALTER PLUGGABLE DATABASE pdb4 OPEN;

Pluggable database altered.
```

## 文字コードの確認
PLUG操作を行ったPDBに接続して文字コードを確認します。CDBとは異なる設定で作成されていることがわかります。

```
SQL> ALTER SESSION SET CONTAINER=pdb4;

Session altered.
 
SQL> SELECT PARAMETER, VALUE FROM V$NLS_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

PARAMETER                                                        VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_CHARACTERSET                                                 JA16SJISTILDE

```