切断したPDBを別のファイルの場所に接続する方法 (2024/06/24)

切断したPDBを別のファイルの場所に接続する方法 (2024/06/24)

https://database-heartbeat.com/2024/06/24/plug-in-pdb-different-file-location/




はじめに


Oracle Multitenantを使用すると、PDB (リフレッシュ可能)クローン、PDB再配置、PDB切断および接続など、様々な方法で、プラガブル・データベース(PDB)をコンテナ・データベース(CDB)間でコピーおよび移動できます。


非常に大規模なデータベースを処理している場合は、特に並列処理をサポートしていないStandard Editionを使用している場合、scpでデータファイルをコピーする方がPDBクローニングより高速になる可能性があるため、切断および接続をお薦めします。


PDBを切断し、別のデータベース・サーバー上の別のCDBに接続すると、ターゲット・データベース・サーバー上のデータファイルの異なる場所(異なるファイル・システム・パス)がある可能性があります。このブログ投稿では、ターゲット・データベース・サーバー上の別のファイル・システム・パスにデータファイルを配置できるオプションを示します。


ただし、始める前に、マルチテナント・アーキテクチャがOracle Database 23aiで使用可能な唯一のアーキテクチャであることに注意してください。非CDBアーキテクチャをまだ使用している場合は、できるだけ早くマルチテナントに移動します。Oracle Database 19c以降、最大3つのユーザー作成PDBを持つには、マルチテナント・オプションのライセンスは必要ありません。



環境


  • CDBAD1という名前のCDBと、lvm23ad1という名前のデータベース・サーバー上のPDBAD1という名前のPDB
  • CDBAD2という名前のCDBと、lvm23ad2という名前のデータベース・サーバー上のPDBAD2という名前のPDB


ソース・データベースとターゲット・データベースの両方で、Oracle Managed Files (OMF)が使用されます。


ソースPDBAD1をCDBAD1から切断し、ターゲットCDBAD2に接続します。



ソースPDBの切断


ソースCDBで、ソースPDBのデータファイルの場所を問い合せます。


SQL> alter session set container=PDBAD1;
 
SQL> set lines 120
SQL> select name from v$datafile;
 
NAME
------------------------------------------------------------------------------------------------------------------------
/u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C5/datafile/o1_mf_system_m4v5nh58_.dbf
/u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C5/datafile/o1_mf_sysaux_m4v5n6bk_.dbf
/u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C5/datafile/o1_mf_undotbs1_m4v5np3z_.dbf
/u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C5/datafile/o1_mf_users_m4v5nrmh_.dbf


ソースPDBを切断します。


SQL> alter session set container=PDBAD1;
SQL> administer key management export keys with secret <PW_to_protect_this_file> to '/home/oracle/pdbad1.p12' force keystore identified by <TDE_wallet_PW>;
SQL> alter session set container=CDB$ROOT;
SQL> alter pluggable database PDBAD1 close immediate;
SQL> alter pluggable database PDBAD1 unplug into '/home/oracle/PDBAD1.xml';


ターゲット・データベース・サーバーへのファイルのコピー


前のステップで生成されたXMLメタデータ・ファイルおよびウォレット・ファイルを、PDBデータ・ファイルとともにターゲット・データベース・サーバーにコピーします。


[oracle@lvm23ad1 ~]$ scp -p PDBAD1.xml oracle@lvm23ad2:/home/oracle
[oracle@lvm23ad1 ~]$ scp -p pdbad1.p12 oracle@lvm23ad2:/home/oracle
[oracle@lvm23ad1 ~]$ scp -p /u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C5/datafile/* oracle@lvm23ad2:/home/oracle/datafiles


データ・ファイルの場所の確認


これで、ターゲット・データベース・サーバー上のデータファイルは/home/oracle/datafilesに格納されます。ただし、ソース・データベース・サーバーでは、それらは別のパスにあり、これはXMLメタデータ・ファイルにも格納されます。


[oracle@lvm23ad2 ~]$ cat PDBAD1.xml | grep path   
<path>/u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C5/datafile/o1_mf_system_m4v5nh58_.dbf</path>
<path>/u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C5/datafile/o1_mf_sysaux_m4v5n6bk_.dbf</path>
<path>/u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C5/datafile/o1_mf_undotbs1_m4v5np3z_.dbf</path>
<path>/u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C5/datafile/o1_mf_temp_m4v5nv3n_.tmp</path>
<path>/u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C5/datafile/o1_mf_users_m4v5nrmh_.dbf</path>


データファイルを含むPDBを別の場所に接続


PDBをターゲットCDBに接続する場合:


SQL> create pluggable database pdbnew1 as clone using '/home/oracle/PDBAD1.xml';
create pluggable database pdbnew1 as clone using '/home/oracle/PDBAD1.xml'
*
ERROR at line 1:
ORA-19505: failed to identify file
"/u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C
5/datafile/o1_mf_system_m4v5nh58_.dbf"
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 7


データ・ファイルがないため、これは予想されます。


ターゲット・データベース・サーバー上の/u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C5/datafile/



今、誰かが、そのパスを作成してデータファイルをそこに置くだけではない理由を議論することができますか?この場合、両方のシステムに/u02ディスクがあるため、これは機能します。しかし、ターゲット・システムのディスク名がまったく異なる場合はどうなりますか。また、ソース・パスにはソースCDB名「CDBAD1」が含まれ、これはターゲット・データベース・サーバーで混乱し、CDB名は「CDBAD2」になります。


オプション1: データ・ファイル名のプラグインおよび変換


SOURCE_FILE_NAME_CONVERT句を使用します。


-- first, we need to import the TDE key
SQL> administer key management import keys with secret <PW_protecting_this_file> from '/home/oracle/pdbad1.p12' force keystore identified by <TDE_wallet_PW> with backup;
 
-- plug in the PDB
SQL> create pluggable database pdbnew1 as clone using '/home/oracle/PDBAD1.xml' SOURCE_FILE_NAME_CONVERT = ('/u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C5/datafile/', '/home/oracle/datafiles/') NOCOPY TEMPFILE REUSE;
 
SQL> alter pluggable database pdbnew1 open;
SQL> alter session set container=pdbnew1;
 
SQL> set lines 120
SQL> select name from v$datafile;
 
NAME
------------------------------------------------------------------------------------------------------------------------
/home/oracle/datafiles/o1_mf_system_m4v5nh58_.dbf
/home/oracle/datafiles/o1_mf_sysaux_m4v5n6bk_.dbf
/home/oracle/datafiles/o1_mf_undotbs1_m4v5np3z_.dbf
/home/oracle/datafiles/o1_mf_users_m4v5nrmh_.dbf


ノート: クイックおよびダーティ・オプションとして、SOURCE_FILE_NAME_CONVERTを使用するかわりに、.xmlファイル内のデータファイル・パスを直接編集して、ターゲット・データベース・サーバーの現在のファイルの場所を反映することもできます。


新しいPDBはRESTRICTEDモードでオープンされます。pdb_plug_in_violationsビューを問い合せます。


set lines 300
col status for a10
col type for a10
col cause for a20
col message for a90
SQL> SELECT status, type, cause, message FROM pdb_plug_in_violations;
STATUS     TYPE       CAUSE                MESSAGE
---------- ---------- -------------------- ------------------------------------------------------------------------------------------
PENDING    ERROR      Wallet Key Needed    PDB needs to import keys from source.


そのため、今回はPDB内からインポート・キーを再度実行し、PDBをクローズして再度オープンする必要があります。


SQL> administer key management import keys with secret <PW_protecting_this_file> from '/home/oracle/pdbad1.p12' force keystore identified by <TDE_wallet_PW> with backup;
SQL> alter pluggable database PDBNEW1 close immediate;
SQL> alter pluggable database PDBNEW1 open;


新しいPDB GUID名を持つ新しいディレクトリが、空のdatafilesサブディレクトリで作成されます。


SQL> select guid from v$pdbs where name = 'PDBNEW1';
 
GUID
--------------------------------
190D53FF8AB37537E0638E000A0A16D9
 
[oracle@lvm23ad2 ~]$ ls -l /u02/app/oracle/oradata/CDBAD2_23ai/CDBAD2_23AI/190D53FF8AB37537E0638E000A0A16D9
drwxr-x--- 2 oracle oinstall 4096 May 22 15:29 datafile


これは、最終的にデータ・ファイルが必要となる場所です。幸いなことに、データファイルを一度に1つずつオンラインで移動できます。


SQL> alter database move datafile '/home/oracle/datafiles/o1_mf_system_m4v5nh58_.dbf';
SQL> alter database move datafile '/home/oracle/datafiles/o1_mf_sysaux_m4v5n6bk_.dbf';
SQL> alter database move datafile '/home/oracle/datafiles/o1_mf_undotbs1_m4v5np3z_.dbf';
SQL> alter database move datafile '/home/oracle/datafiles/o1_mf_users_m4v5nrmh_.dbf';


すべてのデータファイルは最終保存先にあります。


SQL> set lines 120
SQL> select name from v$datafile;
 
NAME
------------------------------------------------------------------------------------------------------------------------
/u02/app/oracle/oradata/CDBAD2_23ai/CDBAD2_23AI/190D53FF8AB37537E0638E000A0A16D9/datafile/o1_mf_system_m4w7qock_.dbf
/u02/app/oracle/oradata/CDBAD2_23ai/CDBAD2_23AI/190D53FF8AB37537E0638E000A0A16D9/datafile/o1_mf_sysaux_m4w7s09l_.dbf
/u02/app/oracle/oradata/CDBAD2_23ai/CDBAD2_23AI/190D53FF8AB37537E0638E000A0A16D9/datafile/o1_mf_undotbs1_m4w7sc8t_.dbf
/u02/app/oracle/oradata/CDBAD2_23ai/CDBAD2_23AI/190D53FF8AB37537E0638E000A0A16D9/datafile/o1_mf_users_m4w7smon_.dbf




オプション2: プラグイン、データ・ファイル名の変換および最終宛先への移動


これはオプション1と同じですが、MOVE句を使用してデータファイルを最終宛先に1回で移動します。


-- copy the datafiles from the source again
[oracle@lvm23ad1 ~]$ scp -p /u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C5/datafile/* oracle@lvm23ad2:/home/oracle/datafiles
 
-- create a new pdb
SQL> create pluggable database pdbnew2 as clone using '/home/oracle/PDBAD1.xml' SOURCE_FILE_NAME_CONVERT = ('/u02/app/oracle/oradata/CDBAD1_23ai/CDBAD1_23AI/16E9F79186922679E0631701F40AB0C5/datafile/', '/home/oracle/datafiles/') MOVE;
 
SQL> alter pluggable database PDBNEW2 open;
SQL> alter session set container=PDBNEW2;
SQL> administer key management import keys with secret <PW_protecting_this_file> from '/home/oracle/pdbad1.p12' force keystore identified by <TDE_wallet_PW> with backup;
SQL> alter pluggable database PDBNEW2 close immediate;
SQL> alter pluggable database PDBNEW2 open;


データファイルの場所を確認します。


SQL> select guid from v$pdbs;
GUID
--------------------------------
190EA2B51DAA2EA4E0638E000A0A2E04
 
SQL> set lines 120
SQL> select name from v$datafile;
 
NAME
------------------------------------------------------------------------------------------------------------------------
/u02/app/oracle/oradata/CDBAD2_23ai/CDBAD2_23AI/190EA2B51DAA2EA4E0638E000A0A2E04/datafile/o1_mf_system_m4w85qb8_.dbf
/u02/app/oracle/oradata/CDBAD2_23ai/CDBAD2_23AI/190EA2B51DAA2EA4E0638E000A0A2E04/datafile/o1_mf_sysaux_m4w85qbr_.dbf
/u02/app/oracle/oradata/CDBAD2_23ai/CDBAD2_23AI/190EA2B51DAA2EA4E0638E000A0A2E04/datafile/o1_mf_undotbs1_m4w85qbw_.dbf
/u02/app/oracle/oradata/CDBAD2_23ai/CDBAD2_23AI/190EA2B51DAA2EA4E0638E000A0A2E04/datafile/o1_mf_users_m4w85qc1_.dbf




オプション3: アーカイブ・ファイルへの切断


XMLメタデータ・ファイルを使用してデータファイルをコピーするかわりに、データファイルを含むアーカイブ・ファイル(.xmlではなく.pdb)に切断します。


XMLファイルには、前述のようにPDBデータファイルのフルパスが含まれています。

.pdbアーカイブ・ファイルを指定すると、XMLメタデータ・ファイルには相対ファイル名のみが含まれます。

.PDBアーカイブ・ファイルを使用したPDBの接続中に、Oracle Databaseは.PDBアーカイブを抽出し、PDBデータファイルを同じディレクトリに配置します。


ソースPDBをソースCDBに再度接続して、アーカイブ・ファイルに切断できるようにします。


SQL> drop pluggable database PDBAD1 keep datafiles;
SQL> create pluggable database PDBAD1 using '/home/oracle/PDBAD1.xml';
SQL> alter pluggable database PDBAD1 open;
SQL> alter session set container=PDBAD1;
SQL> administer key management import keys with secret <PW_protecting_this_file> from '/home/oracle/pdbad1.p12' force keystore identified by <TDE_wallet_PW> with backup;
SQL> alter pluggable database PDBAD1 close immediate;
SQL> alter pluggable database PDBAD1 open;


アーカイブ・ファイル(.pdb)に切断します。


SQL> alter session set container=PDBAD1;
administer key management export keys with secret <PW_to_protect_this_file> to '/home/oracle/pdbad1.p12' force keystore identified by <TDE_wallet_PW>;
SQL> alter session set container=CDB$ROOT;
SQL> alter pluggable database PDBAD1 close immediate;
SQL> alter pluggable database PDBAD1 unplug into '/home/oracle/PDBAD1.pdb';


ウォレット・ファイルおよびアーカイブ・ファイルをターゲット・データベース・サーバーにコピーします。


[oracle@lvm23ad1 ~]$ scp -p PDBAD1.pdb oracle@lvm23ad2:/home/oracle
[oracle@lvm23ad1 ~]$ scp -p pdbad1.p12 oracle@lvm23ad2:/home/oracle


ターゲット・データベース・サーバーにプラグインします。


-- create a new pdb
SQL> create pluggable database pdbnew3 as clone using '/home/oracle/PDBAD1.pdb' MOVE;
SQL> alter pluggable database pdbnew3 open;
SQL> alter session set container=PDBNEW3;
SQL> administer key management import keys with secret <PW_protecting_this_file> from '/home/oracle/pdbad1.p12' force keystore identified by <TDE_wallet_PW> with backup;
SQL> alter pluggable database PDBNEW3 close immediate;
SQL> alter pluggable database PDBNEW3 open;


これは間違いなくはるかに簡単です。SOURCE_FILE_NAME_CONVERTなし、データベース移動データファイルの変更コマンドなし、およびパスに関する心配はありません。


データファイルの場所を確認します。


SQL> select guid from v$pdbs where name = 'PDBNEW3';
GUID
--------------------------------
190EF9AEB78C62BDE0638E000A0A6F19
 
SQL> set lines 120
SQL> select name from v$datafile;
 
NAME
------------------------------------------------------------------------------------------------------------------------
/u02/app/oracle/oradata/CDBAD2_23ai/CDBAD2_23AI/190EF9AEB78C62BDE0638E000A0A6F19/datafile/o1_mf_system_m4w9mbj5_.dbf
/u02/app/oracle/oradata/CDBAD2_23ai/CDBAD2_23AI/190EF9AEB78C62BDE0638E000A0A6F19/datafile/o1_mf_sysaux_m4w9mbj6_.dbf
/u02/app/oracle/oradata/CDBAD2_23ai/CDBAD2_23AI/190EF9AEB78C62BDE0638E000A0A6F19/datafile/o1_mf_undotbs1_m4w9mbj6_.dbf
/u02/app/oracle/oradata/CDBAD2_23ai/CDBAD2_23AI/190EF9AEB78C62BDE0638E000A0A6F19/datafile/o1_mf_users_m4w9mbj7_.dbf


完了!全てが最後の場所にある!


/home/oracle/PDBAD1.pdbはターゲット・データベース・サーバー上にまだ存在しますが、不要になりました。削除できます。



クリーンアップ


ターゲットCDBのプラグインが成功したら、今回はデータファイルを含め、ソースCDBのPDBを削除できます。


SQL> drop pluggable database PDBAD1 including datafiles;



まとめ



Oracle Multitenantには、様々なCDB間でPDBをクローニングおよび再配置するための多数のオプションが用意されています。非常に大規模なデータベースやStandard Editionを使用している場合、scpでのコピーはPDBのクローニングより高速になる可能性があるため、切断および接続は推奨されます。


アーカイブ・ファイル(.pdb)への切断を使用すると、ターゲット・データベース・サーバーでのデータファイル・パスの処理がはるかに簡単になります。ただし、ファイル・システムにはデータベースと同じ大きさの空き領域が必要です。

続きを読む

コメント

このブログの人気の投稿

Oracle RACによるメンテナンスのためのドレインとアプリケーション・コンティニュイティの仕組み (2023/11/01)

Oracle APEXのInteractive Gridで、Oracle Formsと比較して、重複行の検証を制御/通過させる方法 (2022/07/21)

Oracle Cloudのデータベースをオブジェクト・ストレージにバックアップする3つの方法 (2021/12/13)