異なるデータベースブロックサイズを持つCDB間でPDBを最小限のダウンタイムで移動する方法 (2022/08/29)

異なるデータベースブロックサイズを持つCDB間でPDBを最小限のダウンタイムで移動する方法 (2022/08/29)

https://database-heartbeat.com/2022/08/29/clone-pdbs-different-block-sizes/



はじめに


Doc ID 2027614.1 にあるように、異なるデータベースブロックサイズを持つ CDB に PDB をプラグインすることは可能です。ターゲットのCDBバッファキャッシュがプラグインされるPDBのブロックサイズのバッファを持つように設定する必要があるだけです。これはターゲットCDBでdb_nk_cache_sizeデータベースパラメータを設定することで行われます。


しかし、アンプラグ/プラグにはダウンタイムが必要で、特に大規模なデータベースの場合、ネットワーク上でデータファイルを移動する必要があります。最近、PDBクローン、特にリフレッシュ可能なクローンが、異なるデータベースブロックサイズを持つCDB間でも動作するのかという疑問がわきました。


いくつか調べてみましたが、このような使用例に関する情報は見つかりませんでした。私は、プラグインが機能するように、クローニングも機能するものと思っていました。しかし、これまで何度、思い込んだことが間違いだと証明されたことでしょう。


そこで、試してみることにしました。



環境について


Oracle Cloudで稼働している19cのデータベースで、データベースブロックサイズが8kのものをターゲットCDBとして使うことにします。


しかし、待ってください、異なるデータベースブロックサイズを持つソースCDBをどこで入手すればよいのでしょうか?Oracle Cloudのデータベースはすべて、デフォルトで推奨の8kブロックサイズになっています。考える...考える...考える...あ、DBCAというのがあった。最後に使ったのは、Oracleに入社して100%Cloudで仕事をする前の2018年のいつかのことでした。確かにGoogleで検索してみると、dbcaは$ORACLE_HOME/bin/の中にあることがわかりました。Linuxマシンに表示転送の設定をして、dbcaを実行しました。デフォルト以外のデータベースブロックサイズを指定するには、「高度な構成」と「カスタムデータベース」テンプレートを選択する必要があることを知るために、再びGoogleで検索する必要がありました。ようやく、ソースCDBとして使えるデータベースブロックサイズが16kのCDBができました。



ソース CDB の準備 (db_block_size=16k)


ソースCDBにC#SYSOPERユーザーを用意します。

SQL> grant create session, sysoper to C##SYSOPER identified by SysOperPw__16k container=all;
  
Grant succeeded.
 
SQL> show pdbs
 
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB16K                         READ WRITE NO
 
SQL> show parameter db_block_size
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     16384


ターゲットCDBの準備 (db_block_size=8k)


ターゲットCDB上に、ソースCDBを指すデータベースリンクを作成します。

SQL> create database link DBLINK_TO_16K connect to C##SYSOPER identified by SysOperPw__16k using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.1.99)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = cdb16k.subnet1.primaryvcn.oraclevcn.com)))';
  
Database link created.
 
SQL> show pdbs
 
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ WRITE NO
 
SQL> show parameter db_block_size
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192


ターゲットCDBにPDBクローンを作成


16K PDBを8K CDBにクローンする時が来ました。

SQL> create pluggable database CLONE16K from PDB16K@DBLINK_TO_16K;
create pluggable database CLONE16K from PDB16K@DBLINK_TO_16K
*
ERROR at line 1:
ORA-65176: system tablespace block size (16384) does not match configured block sizes


では、db_16k_cache_sizeデータベース・パラメータを設定しましょう。

SQL> show parameter db_16k_cache_size;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_16k_cache_size                    big integer 0
 
SQL> alter system set db_16k_cache_size=1G scope=both;
 
System altered.
 
SQL> show parameter db_16k_cache_size;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_16k_cache_size                    big integer 1G

もう一度クローンを作ってみてください。

SQL> create pluggable database CLONE16K from PDB16K@DBLINK_TO_16K;
 
Pluggable database created.
 
SQL> alter pluggable database CLONE16K open;
 
Pluggable database altered.


いいね! クローン作成がうまくいきました。



ターゲットCDBにリフレッシュ可能なクローンを作成


さて、リフレッシュ可能なクローンです。

SQL> create pluggable database REF16K from PDB16K@DBLINK_TO_16K refresh mode every 1 minutes;
 
Pluggable database created.
 
col pdb_name for a15
col status for a15
col refresh_mode for a15
col refresh_interval for 999
SQL> select pdb_name, status, refresh_mode, refresh_interval from dba_pdbs where pdb_name='REF16K';
 
PDB_NAME        STATUS          REFRESH_MODE    REFRESH_INTERVAL
--------------- --------------- --------------- ----------------
REF16K          REFRESHING      AUTO                           1


また、リフレッシュ元のPDBにテーブルを作成して数行挿入し、1分待って(文字通り)リフレッシュ可能なクローンをREAD ONLYモードで開いたところ、リフレッシュ元で作成したデータが既に同期されていることが確認できました。従って、リフレッシュ可能なPDBクローンも同様に機能します。

SQL> show pdbs;
 
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ WRITE NO
         4 CLONE16K                       READ WRITE NO
         5 REF16K                         READ ONLY  NO


同期を継続するために、リフレッシュ可能なPDBを閉じることを忘れないでください。マイグレーションでは、リフレッシュ可能なクローンを本番で使う準備ができたときに READ WRITE モードでオープンすることだけが必要です。



pdb_plug_in_violations


PDB_PLUG_IN_VIOLATIONSビューのメッセージについてはどうでしょうか。クローン作成は本当に成功したのでしょうか?

set lines 300
col pdb_name for a10
col type for a15
col cause for a15
col status for a15
col message for a80
SQL> select p.pdb_name, v.type, v.cause, v.message
from pdb_plug_in_violations v join cdb_pdbs p on (v.con_id = p.con_id)
where p.pdb_name in ('CLONE16K', 'REF16K') and cause != 'OPTION';
 
PDB_NAME   TYPE            CAUSE           STATUS          MESSAGE
---------- --------------- --------------- --------------- --------------------------------------------------------------------------------
REF16K     WARNING         Parameter       RESOLVED        CDB parameter db_block_size mismatch: Previous 16384 Current 8192


PDBクローンCLONE16Kは何のメッセージも表示されません。しかし、リフレッシュ可能なクローンREF16Kは、パラメータの不一致に関する警告を表示しています。不思議ですね。しかし、ステータスはRESOLVEです。PDBは制限モードになっておらず、データは同期されています。



クローンされたデータファイルのブロックサイズ


コピー元のPDBのデータベースファイルは、元のブロックサイズと同じ16Kでコピーされています。

set lines 300
col pdb_name for a10
col tablespace_name for a15
col block_size for 99999
SQL> select p.pdb_name, t.tablespace_name, t.block_size
from cdb_tablespaces t join cdb_pdbs p on (t.con_id = p.con_id)
where p.pdb_name in ('CLONE16K', 'REF16K');
 
PDB_NAME   TABLESPACE_NAME BLOCK_SIZE
---------- --------------- ----------
REF16K     SYSTEM               16384
REF16K     SYSAUX               16384
REF16K     UNDOTBS1             16384
REF16K     TEMP                 16384
REF16K     USERS                16384
CLONE16K   SYSTEM               16384
CLONE16K   SYSAUX               16384
CLONE16K   UNDOTBS1             16384
CLONE16K   TEMP                 16384
CLONE16K   USERS                16384


このため、ターゲットCDBにdb_16k_cache_sizeデータベース・パラメータを設定する必要があります。



まとめ


Oracle Multitenantでは、データベースブロックサイズが異なるCDB間でも、アンプラグ/プラグ、クローン、リフレッシュ可能なクローンを使ってPDBを移動し、ダウンタイムを最小化することができます。ただし、移動先のCDBでdb_nk_cache_sizeデータベースパラメータを適切に設定する必要があります。


参考文献

コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

ミリ秒の問題: BCCグループとOCIが市場データ・パフォーマンスを再定義する方法(AWSに対するベンチマークを使用) (2025/11/13)

Oracle Enterprise Manager 24aiの概要 (2024/12/18)