ホットクローンで既存のPDBを停止せずに複製する方法

CDB/PDB(マルチテナント)

Oracle 12.2以降では、PDBをCLOSEせずにオンライン状態のまま複製(=ホットクローン)できる機能が追加されました。
この記事では、既存のPDB(例:PDB01)をREAD WRITEのまま、新しいPDB(PDB02)としてホットクローンする手順を詳しく解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


🔥 ホットクローンとは?

ホットクローン(Hot Clone)とは、クローン元のPDBをREAD WRITE状態のままクローンを作成する方法です。

✅ 特徴

項目内容
クローン元CLOSE不要・サービス継続可能
必須条件local undo mode = TRUE(ローカルUNDO)
対応バージョンOracle 12.2 以降(特に19cで安定)

🔍 前提条件の確認(ローカルUNDOの確認)

ホットクローンを実行するには、ローカルUNDOモードが有効である必要があります。以下のSQLで確認します。

SELECT property_name, property_value 
FROM database_properties
WHERE property_name = 'LOCAL_UNDO_ENABLED';

-- 結果が TRUE であればOK

🔸 FALSE の場合、ホットクローンは使用できません。コールドクローンをご利用ください。

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> set lin 1000 pages 1000
SQL> col property_name for a30
SQL> col property_value for a20
SQL> SELECT property_name, property_value
2 FROM database_properties
3 WHERE property_name = 'LOCAL_UNDO_ENABLED';

PROPERTY_NAME PROPERTY_VALUE
------------------------------ --------------------
LOCAL_UNDO_ENABLED TRUE ★

🗂 クローン元のファイルパス確認(PDB01)

-- PDB01に切り替えてファイルパス確認
ALTER SESSION SET CONTAINER = pdb01;

SELECT file_name FROM dba_data_files;

-- 例:
/u01/app/oracle/oradata/V19M/pdb01/system01.dbf
/u01/app/oracle/oradata/V19M/pdb01/sysaux01.dbf
...

🛠 ホットクローン手順:PDB01 → PDB02

以下の手順で、PDB01をクローンしてPDB03を作成します。

▼ CDB$ROOTに戻ってから実行

ALTER SESSION SET CONTAINER = cdb$root;

CREATE PLUGGABLE DATABASE pdb02 FROM pdb01
FILE_NAME_CONVERT = ('pdb01','pdb02');

🔸 FILE_NAME_CONVERTは、元のファイル名に含まれる文字列pdb01pdb02に置換する指定です。


▶ クローン後の処理

-- PDB02をOPEN
ALTER PLUGGABLE DATABASE pdb02 OPEN;
SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> ALTER SESSION SET CONTAINER = pdb01;

セッションが変更されました。

SQL> SELECT file_name FROM dba_data_files;

FILE_NAME
-------------------------------------------------------------------------
/u01/app/oracle/oradata/V19M/PDB01/system01.dbf
/u01/app/oracle/oradata/V19M/PDB01/sysaux01.dbf
/u01/app/oracle/oradata/V19M/PDB01/undotbs01.dbf
/u01/app/oracle/oradata/V19M/PDB01/users01.dbf

SQL> ALTER SESSION SET CONTAINER = cdb$root;

セッションが変更されました。

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB01 READ WRITE NO ★PDB01 はオープン状態
SQL> CREATE PLUGGABLE DATABASE pdb02 FROM pdb01 ★PDB01 を元に PDB02 を作成
2 FILE_NAME_CONVERT = ('PDB01','PDB02');

プラガブル・データベースが作成されました。

SQL> show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB01 READ WRITE NO
5 PDB02 MOUNTED ★作成された
SQL> ALTER PLUGGABLE DATABASE pdb02 OPEN;

プラガブル・データベースが変更されました。

SQL> show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB01 READ WRITE NO
5 PDB02 READ WRITE NO

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


📋 作成後の確認手順

-- 全PDBの一覧を表示
SHOW PDBS;

-- PDB02に接続
ALTER SESSION SET CONTAINER = pdb02;

-- 現在のコンテナ名を確認
SHOW CON_NAME;

-- 管理ユーザーの確認(例:ADMIN)
SELECT username FROM dba_users WHERE username = 'ADMIN';

📌 手順の流れ(テキスト図)

[PDB01: READ WRITE]

[CREATE PLUGGABLE DATABASE pdb02 FROM pdb01]

[PDB02: 作成される(MOUNT状態)]

[ALTER PLUGGABLE DATABASE pdb02 OPEN]

⚠ よくあるエラーと対処法

エラー内容対処法
ORA-65026ローカルUNDOが無効LOCAL_UNDO_ENABLED=TRUEが必要
ORA-65144管理者ユーザーが存在しないFROM句では不要、ADMIN USER句は不要です
ORA-65010ファイル名の競合またはディレクトリ誤りFILE_NAME_CONVERTを正しく指定

✅ ホットクローンとコールドクローンの違いまとめ

項目ホットクローンコールドクローン
複製元状態OPEN(READ WRITE)READ ONLY(要CLOSE)
サービス影響なし一時停止が必要
必須条件LOCAL_UNDO_ENABLED=TRUE特になし
利用可能バージョンOracle 12.2以降全バージョン(12c以降)

✅ まとめ

ホットクローンは、PDBを止めずに複製したいシーンに最適な機能です。
ローカルUNDOが有効であることを確認し、FILE_NAME_CONVERTを正しく指定すれば、システムの稼働を妨げることなくPDBの複製が可能です。

[参考]
4 CDBの作成および構成

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました