株式会社コーソル

コーソルDatabaseエンジニアのブログ

技術ブログ

PDBのUnPlugとPlug – (全部俺)某Oracle書籍を25日後に脱稿するXX歳の+JPOUG Advent Calendar 2021 2日目

Oracle ACEの渡部です。

この記事は、 JPOUG Advent Calendar 2021 2日目の記事です。1日目は Hiroshi Sekiguchi さんの記事『Mac De Oracle: 誰がどんな名前のペットを飼っているのかな? その1 / JPOUG Advent Calendar Day 1』でした。

また、この記事は(全部俺)某Oracle書籍を25日後に脱稿するXX歳の Advent Calendar 2021の2日目の記事でもあります。1日目の記事は(全部俺)某Oracle書籍を25日後に脱稿するXX歳の Advent Calendar 2021 やりますよ / PDB作成についてでした。

オラクルマスター教科書 Bronze DBA Oracle Database Fundamentalsオラクルマスター教科書 Silver DBA Oracle Database Administration Iに続く「某Oracle書籍」を執筆中のOracle ACE 渡部が、12月25日のドラフト脱稿目指して1日1記事頑張って投稿してゆきたいと思います!

(注意点) 一連の投稿について

  • 「某Oracle書籍」執筆中に実施した下調べの内容や、「某Oracle書籍」のターゲットを超える内容、内容的に関連するセミナー資料の抜粋などを記載する予定です。

  • 2021年12月時点で「某Oracle書籍」の発売時期は未定です。もう少々お待ちを。

  • 万が一、関係者から怒られたら途中でやめるかも(たぶん大丈夫だと思うのだけど)

  • 執筆中の「某Oracle書籍」の記載内容と、一連の投稿の記載内容は異なります

    • そもそも、同じ内容を投稿したら「問題」になる!
  • 「某Oracle書籍」の記載と、一連の投稿は品質が全く異なります

    • 「某Oracle書籍」の記載は、十分に推敲を重ねた、図や表を用いた丁寧なものです。一方、一連の投稿はメモ書きの延長のレベルで、概して推敲が不十分で図や表はあまり使っていません。
    • 「某Oracle書籍」の記載は、先頭から読んでいけばスンナリ理解できるように工夫された完結性・完備性が高いものです。一方、一連の投稿は特定の観点やトピックにのみ関連するものです。内容を理解するには前提知識が求められます。

[宣伝] これまでに渡部が執筆した書籍の一覧

2022/3/25 追記

12月中の脱稿には失敗してしまいましたが、その後鋭意執筆を進め、2022年5月27日に「オラクルマスター教科書 Gold DBA Oracle Database Administration II」を販売開始します。詳細は以下をご覧ください。

ORACLE MASTER Bronze DBA 2019試験対策本の発売日が決定しました

PDBの切断(アンプラグ、UnPlug)

PDBは切断して接続できます。これにより異なるCDBにPDBを移動することができます。

PDBを切断するには、ALTER PLUGGABLE DATABASE UNPLUG INTO 文を実行します。

SQL> ALTER PLUGGABLE DATABASE pdb1 UNPLUG INTO '/var/tmp/pdb1.xml';

プラガブル・データベースが変更されました。

このとき、PDBのメタデータを記録したXMLファイルが作成されます。

[oracle@ol78n12 ~]$ cat /var/tmp/pdb1.xml
<?xml version="1.0" encoding="UTF-8"?>
<PDB>
  <xmlversion>1</xmlversion>
  <pdbname>PDB1</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>488255261</dbid>
  <ncdb2pdb>0</ncdb2pdb>
  <cdbid>2204331272</cdbid>
  <guid>CFEDB86C8C2A16DFE0530C38A8C03CB0</guid>
  <uscnbas>2146859</uscnbas>
  <uscnwrp>0</uscnwrp>
  <undoscn>280</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/CDB/pdb1/system01.dbf</path>
      <afn>9</afn>
      <rfn>1</rfn>
      <createscnbas>2131059</createscnbas>
      <createscnwrp>0</createscnwrp>
      <status>1</status>
      <fileblocks>34560</fileblocks>
      <blocksize>8192</blocksize>
      <vsn>318767104</vsn>
      <fdbid>488255261</fdbid>
      <fcpsb>2146850</fcpsb>
      <fcpsw>0</fcpsw>
      <frlsb>1920977</frlsb>
      <frlsw>0</frlsw>
      <frlt>1087727754</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/CDB/pdb1/sysaux01.dbf</path>
      <afn>10</afn>
      <rfn>4</rfn>
      <createscnbas>2131063</createscnbas>
      <createscnwrp>0</createscnwrp>
      <status>1</status>
      <fileblocks>42240</fileblocks>
      <blocksize>8192</blocksize>
      <vsn>318767104</vsn>
      <fdbid>488255261</fdbid>
      <fcpsb>2146850</fcpsb>
      <fcpsw>0</fcpsw>
      <frlsb>1920977</frlsb>
      <frlsw>0</frlsw>
      <frlt>1087727754</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/CDB/pdb1/undotbs01.dbf</path>
      <afn>11</afn>
      <rfn>9</rfn>
      <createscnbas>2131067</createscnbas>
      <createscnwrp>0</createscnwrp>
      <status>1</status>
      <fileblocks>12800</fileblocks>
      <blocksize>8192</blocksize>
      <vsn>318767104</vsn>
      <fdbid>488255261</fdbid>
      <fcpsb>2146850</fcpsb>
      <fcpsw>0</fcpsw>
      <frlsb>1920977</frlsb>
      <frlsw>0</frlsw>
      <frlt>1087727754</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/CDB/pdb1/temp01.dbf</path>
      <afn>3</afn>
      <rfn>1</rfn>
      <createscnbas>2131060</createscnbas>
      <createscnwrp>0</createscnwrp>
      <status>1</status>
      <fileblocks>4608</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>5</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/CDB/pdb1/users01.dbf</path>
      <afn>12</afn>
      <rfn>12</rfn>
      <createscnbas>2132582</createscnbas>
      <createscnwrp>0</createscnwrp>
      <status>1</status>
      <fileblocks>640</fileblocks>
      <blocksize>8192</blocksize>
      <vsn>318767104</vsn>
      <fdbid>488255261</fdbid>
      <fcpsb>2146850</fcpsb>
      <fcpsw>0</fcpsw>
      <frlsb>1920977</frlsb>
      <frlsw>0</frlsw>
      <frlt>1087727754</frlt>
      <autoext>1</autoext>
      <maxsize>4194302</maxsize>
      <incsize>160</incsize>
      <plugscn>0</plugscn>
      <plugafn>0</plugafn>
      <plugdbid>0</plugdbid>
    </file>
  </tablespace>
  <recover>0</recover>
  <optional>
    <ncdb2pdb>0</ncdb2pdb>
    <csid>873</csid>
    <ncsid>2000</ncsid>
    <options>
      <option>APS=19.0.0.0.0</option>
      <option>CATALOG=19.0.0.0.0</option>
      <option>CATJAVA=19.0.0.0.0</option>
      <option>CATPROC=19.0.0.0.0</option>
      <option>CONTEXT=19.0.0.0.0</option>
      <option>DV=19.0.0.0.0</option>
      <option>JAVAVM=19.0.0.0.0</option>
      <option>OLS=19.0.0.0.0</option>
      <option>ORDIM=19.0.0.0.0</option>
      <option>OWM=19.0.0.0.0</option>
      <option>SDO=19.0.0.0.0</option>
      <option>XDB=19.0.0.0.0</option>
      <option>XML=19.0.0.0.0</option>
      <option>XOQ=19.0.0.0.0</option>
    </options>
    <olsoid>0</olsoid>
    <dv>0</dv>
    <APEX>NULL</APEX>
    <parameters>
      <parameter>processes=300</parameter>
      <parameter>nls_language='JAPANESE'</parameter>
      <parameter>nls_territory='JAPAN'</parameter>
      <parameter>db_block_size=8192</parameter>
      <parameter>compatible='19.0.0'</parameter>
      <parameter>open_cursors=300</parameter>
      <parameter>pga_aggregate_target=615514112</parameter>
      <parameter>enable_pluggable_database=TRUE</parameter>
    </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=37.127825</loadprofile>
      <loadprofile>DB time=45.604454</loadprofile>
      <loadprofile>db block changes=1541.945762</loadprofile>
      <loadprofile>execute count=618.041616</loadprofile>
      <loadprofile>logons cumulative=1.050821</loadprofile>
      <loadprofile>parse count (hard)=23.400930</loadprofile>
      <loadprofile>parse count (total)=362.455812</loadprofile>
      <loadprofile>physical reads=136.681189</loadprofile>
      <loadprofile>physical writes=2.196912</loadprofile>
      <loadprofile>redo size=339788.290485</loadprofile>
      <loadprofile>session logical reads=4898.472274</loadprofile>
      <loadprofile>user calls=5.393047</loadprofile>
      <loadprofile>user commits=1.296906</loadprofile>
      <loadprofile>user rollbacks=0.037975</loadprofile>
    </awr>
    <hardvsnchk>0</hardvsnchk>
    <localundo>1</localundo>
    <apps/>
    <dbedition>8</dbedition>
    <dvopsctl>2</dvopsctl>
    <clnupsrcpal>1</clnupsrcpal>
  </optional>
</PDB>

切断したPDBをOPEN →ORA-65086

一度切断したPDBはOPENできません。OPENしようとすると、ORA-65086で失敗します。

SQL> ALTER PLUGGABLE DATABASE pdb1 OPEN;
ALTER PLUGGABLE DATABASE pdb1 OPEN
*
行1でエラーが発生しました。:
ORA-65086: プラガブル・データベースをオープン/クローズできません

切断したPDBを切断元のCDBに再接続 → ORA-65012 / ORA-65122

切断したPDBを切断元のCDBに再接続してみます。 同一のPDB名の場合ORA-65012、異なるPDB名でもORA-65122で失敗します。

SQL> CREATE PLUGGABLE DATABASE pdb1 USING '/var/tmp/pdb1.xml' NOCOPY;
CREATE PLUGGABLE DATABASE pdb1 USING '/var/tmp/pdb1.xml' NOCOPY
*
行1でエラーが発生しました。:
ORA-65012: プラガブル・データベースPDB1はすでに存在しています。

SQL> CREATE PLUGGABLE DATABASE pdb0 USING '/var/tmp/pdb1.xml' NOCOPY;
CREATE PLUGGABLE DATABASE pdb0 USING '/var/tmp/pdb1.xml' NOCOPY
*
行1でエラーが発生しました。:
ORA-65122:
プラガブル・データベースのGUIDが既存のコンテナのGUIDと競合しています。

理由は、切断したPDBの情報がCDBに残っているためです。

SQL> select pdb_name, GUID, status from cdb_pdbs;

PDB_NAME     GUID                             STATUS
------------ -------------------------------- ----------
PDB1         CFEDB86C8C2A16DFE0530C38A8C03CB0 UNPLUGGED ←★
PDB$SEED     CFED97BB79780DFFE0530C38A8C06278 NORMAL
PDB2         CFEDB91B222A174EE0530C38A8C0A61D NORMAL
PDB9         CFEE86FC5E4A1D07E0530C38A8C0214B NORMAL
PDB8         CFEEA753BB111F37E0530C38A8C01647 NORMAL

切断したPDBを削除すると、接続可能になります。

SQL> DROP PLUGGABLE DATABASE pdb1;

プラガブル・データベースが削除されました。

SQL> select pdb_name, GUID, status from cdb_pdbs;

PDB_NAME     GUID                             STATUS
------------ -------------------------------- ----------
PDB$SEED     CFED97BB79780DFFE0530C38A8C06278 NORMAL
PDB2         CFEDB91B222A174EE0530C38A8C0A61D NORMAL
PDB9         CFEE86FC5E4A1D07E0530C38A8C0214B NORMAL
PDB8         CFEEA753BB111F37E0530C38A8C01647 NORMAL

SQL> CREATE PLUGGABLE DATABASE pdb1 USING '/var/tmp/pdb1.xml' NOCOPY;

プラガブル・データベースが作成されました。

SQL> select pdb_name, GUID, status from cdb_pdbs;

PDB_NAME     GUID                             STATUS
------------ -------------------------------- ----------
PDB$SEED     CFED97BB79780DFFE0530C38A8C06278 NORMAL
PDB2         CFEDB91B222A174EE0530C38A8C0A61D NORMAL
PDB9         CFEE86FC5E4A1D07E0530C38A8C0214B NORMAL
PDB8         CFEEA753BB111F37E0530C38A8C01647 NORMAL
PDB1         CFEDB86C8C2A16DFE0530C38A8C03CB0 NEW

SQL> ALTER PLUGGABLE DATABASE pdb1 OPEN;

プラガブル・データベースが変更されました。

SQL> select pdb_name, GUID, status from cdb_pdbs;

PDB_NAME     GUID                             STATUS
------------ -------------------------------- ----------
PDB$SEED     CFED97BB79780DFFE0530C38A8C06278 NORMAL
PDB2         CFEDB91B222A174EE0530C38A8C0A61D NORMAL
PDB9         CFEE86FC5E4A1D07E0530C38A8C0214B NORMAL
PDB8         CFEEA753BB111F37E0530C38A8C01647 NORMAL
PDB1         CFEDB86C8C2A16DFE0530C38A8C03CB0 NORMAL

SQL>

PDBの接続

切断したPDBはCDBに接続できます。通常、これまで接続していたCDBとは異なるCDBに接続することになるでしょう。

PDBを接続するには、ALTER PLUGGABLE DATABASE USING 文を実行します。

SQL> CREATE PLUGGABLE DATABASE pdb1 USING '/var/tmp/pdb1.xml';
CREATE PLUGGABLE DATABASE pdb1 USING '/var/tmp/pdb1.xml'
                                                       *
行1でエラーが発生しました。:
ORA-65018: FILE_NAME_CONVERTまたはNOCOPYを指定する必要があります

ただし、データファイルの扱いについて指定しないとエラーとなります。

この環境ではすでにXMLファイルの通りにデータファイルが存在しているので、 いい感じに使ってくれても良い気がしますが、データファイルの扱いを指定するCOPY、MOVE、NOCOPYにおいて、デフォルトはCOPYなのでエラーとなるようです。

SQL> host grep path /var/tmp/pdb1.xml
      <path>/u01/app/oracle/oradata/CDB/pdb1/system01.dbf</path>
      <path>/u01/app/oracle/oradata/CDB/pdb1/sysaux01.dbf</path>
      <path>/u01/app/oracle/oradata/CDB/pdb1/undotbs01.dbf</path>
      <path>/u01/app/oracle/oradata/CDB/pdb1/temp01.dbf</path>
      <path>/u01/app/oracle/oradata/CDB/pdb1/users01.dbf</path>

SQL> host ls -1 /u01/app/oracle/oradata/CDB/pdb1/*.dbf
/u01/app/oracle/oradata/CDB/pdb1/sysaux01.dbf
/u01/app/oracle/oradata/CDB/pdb1/system01.dbf
/u01/app/oracle/oradata/CDB/pdb1/temp01.dbf
/u01/app/oracle/oradata/CDB/pdb1/undotbs01.dbf
/u01/app/oracle/oradata/CDB/pdb1/users01.dbf

ということで、既存のファイルをそのまま使うNOCOPY句を明示的に指定して実行しますが、 別のエラーが発生します。

SQL> CREATE PLUGGABLE DATABASE pdb1 USING '/var/tmp/pdb1.xml' NOCOPY;
CREATE PLUGGABLE DATABASE pdb1 USING '/var/tmp/pdb1.xml' NOCOPY
*
行1でエラーが発生しました。:
ORA-27038: 作成したファイルはすでに存在します ORA-01119:
データベース・ファイル'/u01/app/oracle/oradata/CDB/pdb1/temp01.dbf'の作成中にエ
ラーが発生しました。

どうやら、PDB作成時に自動的に一時ファイルを作成する動作が走るようで、 このときにすでに一時ファイルが存在しているため、エラーとなっているように見えます。

ということで、あらかじめ一時ファイルを削除してから同じコマンドを実行すると、 今度は成功します。

SQL> host rm /u01/app/oracle/oradata/CDB/pdb1/temp01.dbf

SQL> CREATE PLUGGABLE DATABASE pdb1 USING '/var/tmp/pdb1.xml' NOCOPY;

プラガブル・データベースが作成されました。

COPY句を指定 - 非OMF

NOCOPY句を指定したPDB接続の動きを確認したので、次にCOPY句を指定してPDBを接続してみます。

SQL> CREATE PLUGGABLE DATABASE pdb1 USING '/var/tmp/pdb1.xml' COPY;
CREATE PLUGGABLE DATABASE pdb1 USING '/var/tmp/pdb1.xml' COPY
                                                            *
行1でエラーが発生しました。:
ORA-65018: FILE_NAME_CONVERTまたはNOCOPYを指定する必要があります

COPY句を指定したにもかかわらず、さっきと同じエラーが出てきました。

ただ、意味的に考えれば当たり前で、与えた情報からでは新しいファイル名を決められませんから、新しいファイル名を決めるために必要な情報を与える必要があります。エラーメッセージではFILE_NAME_CONVERT句の指定が促されていますので、これで試してみます。

SQL> CREATE PLUGGABLE DATABASE pdb1 USING '/var/tmp/pdb1.xml' COPY
  2    FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/CDB/', '/u01/app/oracle/oradata/CDB2/');

プラガブル・データベースが作成されました。

SQL> ALTER PLUGGABLE DATABASE pdb1 OPEN;

プラガブル・データベースが変更されました。

SQL> CONNECT system/Password123@localhost:1521/pdb1
接続されました。
SQL> SELECT file_name FROM DBA_DATA_FILES;

FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/CDB2/pdb1/system01.dbf
/u01/app/oracle/oradata/CDB2/pdb1/sysaux01.dbf
/u01/app/oracle/oradata/CDB2/pdb1/undotbs01.dbf
/u01/app/oracle/oradata/CDB2/pdb1/users01.dbf

SQL>

うまく行きました。

COPY句を指定 - OMF

空のPDBを作成した場合と同様に、OMFも使用可能なハズです。 ということで、DB_CREATE_FILE_DEST初期化パラメータを指定して接続してみます。

SQL> ALTER SESSION SET DB_CREATE_FILE_DEST = '/u01/app/oracle/oradata';

セッションが変更されました。

SQL> CREATE PLUGGABLE DATABASE pdb2 USING '/var/tmp/pdb2.xml' COPY;

プラガブル・データベースが作成されました。

SQL> ALTER PLUGGABLE DATABASE pdb2 OPEN;

プラガブル・データベースが変更されました。

SQL> CONNECT system/Password123@localhost:1521/pdb2
接続されました。
SQL> SELECT file_name FROM DBA_DATA_FILES;

FILE_NAME
-----------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/CDB2/CFEDB91B222A174EE0530C38A8C0A61D/datafile/o1_mf_system_jsrqv579_.dbf
/u01/app/oracle/oradata/CDB2/CFEDB91B222A174EE0530C38A8C0A61D/datafile/o1_mf_sysaux_jsrqv57b_.dbf
/u01/app/oracle/oradata/CDB2/CFEDB91B222A174EE0530C38A8C0A61D/datafile/o1_mf_undotbs1_jsrqv57b_.dbf
/u01/app/oracle/oradata/CDB2/CFEDB91B222A174EE0530C38A8C0A61D/datafile/o1_mf_users_jsrqv57c_.dbf

SQL>

うまくいきました。

ということで、3日目に続く・・・

2022/3/25 追記

12月中の脱稿には失敗してしまいましたが、その後鋭意執筆を進め、2022年5月27日に「オラクルマスター教科書 Gold DBA Oracle Database Administration II」を販売開始します。詳細は以下をご覧ください。

ORACLE MASTER Bronze DBA 2019試験対策本の発売日が決定しました

プロフィール

On7tWW6m1Ul4

渡部 亮太

・Oracle ACE
・AWS Certified Solutions Architect - Associate
・ORACLE MASTER Platinum Oracle Database 11g, 12c 他多数

カテゴリー

アーカイブ