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