切断した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)への切断を使用すると、ターゲット・データベース・サーバーでのデータファイル・パスの処理がはるかに簡単になります。ただし、ファイル・システムにはデータベースと同じ大きさの空き領域が必要です。
続きを読む
コメント
コメントを投稿