異なるデータベースブロックサイズを持つ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 NOSQL> show parameter db_block_sizeNAME 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 NOSQL> show parameter db_block_sizeNAME 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 0SQL> 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 a15col status for a15col refresh_mode for a15col refresh_interval for 999SQL> 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 300col pdb_name for a10col type for a15col cause for a15col status for a15col message for a80SQL> 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 8192PDBクローンCLONE16Kは何のメッセージも表示されません。しかし、リフレッシュ可能なクローンREF16Kは、パラメータの不一致に関する警告を表示しています。不思議ですね。しかし、ステータスはRESOLVEです。PDBは制限モードになっておらず、データは同期されています。
クローンされたデータファイルのブロックサイズ
コピー元のPDBのデータベースファイルは、元のブロックサイズと同じ16Kでコピーされています。
set lines 300col pdb_name for a10col tablespace_name for a15col block_size for 99999SQL> 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 16384REF16K SYSAUX 16384REF16K UNDOTBS1 16384REF16K TEMP 16384REF16K USERS 16384CLONE16K SYSTEM 16384CLONE16K SYSAUX 16384CLONE16K UNDOTBS1 16384CLONE16K TEMP 16384CLONE16K USERS 16384このため、ターゲットCDBにdb_16k_cache_sizeデータベース・パラメータを設定する必要があります。
まとめ
Oracle Multitenantでは、データベースブロックサイズが異なるCDB間でも、アンプラグ/プラグ、クローン、リフレッシュ可能なクローンを使ってPDBを移動し、ダウンタイムを最小化することができます。ただし、移動先のCDBでdb_nk_cache_sizeデータベースパラメータを適切に設定する必要があります。
参考文献

コメント
コメントを投稿