【Oracle 26ai Free】19c(Non-CDB)からPDBクローンしようとしてORA-39712の壁に激突した話

26ai

最新の Oracle Database 26ai Free、皆さん触っていますか? 「とりあえず手元の19c環境を26aiに持って行ってテストしたい!」と思い立つのはエンジニアの性ですよね。

今回は、オンプレの19c (Non-CDB) を、26ai Free 環境へ PDB としてリモートクローン しようとして、盛大にハマった経緯を共有します。 結論から言うと、「物理クローンは諦めろ、Data Pumpを使え」 です。

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

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

やりたかったこと

  • Source: Oracle 19c (Enterprise Edition / Non-CDB)
  • Target: Oracle 26ai Free (CDB)
  • 手法: DBLINKを使った CREATE PLUGGABLE DATABASE ... FROM

12c以降の定石である「リモートクローン」でサクッと移行し、最後に noncdb_to_pdb.sql を流せば終わり……と思っていました。この時までは。

事前準備:tnsnames.ora と DBLINK の作成

クローンを実行する前に、Target側(26ai)からSource側(19c)へ接続するためのネットワーク設定とデータベースリンクを準備します。ここまでは順調でした。

1. tnsnames.ora の設定 (Target側)

26aiサーバーの $ORACLE_HOME/network/admin/tnsnames.ora に、19cへの接続識別子を追記します。

# Source 19c (Non-CDB)
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = orcl19c)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

2. DBLINK の作成 (Target側)

26aiのCDBに管理者で接続し、上記で設定した識別子を使ってDBLINKを作成します。

-- DBLINKの作成
CREATE DATABASE LINK dblink_to_noncdb
  CONNECT TO c_user IDENTIFIED BY "password"
  USING 'ORCL';

-- 疎通確認(これが通ればOK)
SELECT * FROM DUAL@dblink_to_noncdb;

第1の罠:ディレクトリは勝手にできない

準備も整い、意気揚々とクローンコマンドを実行。

CREATE PLUGGABLE DATABASE freepdb2
  FROM orcl@dblink_to_noncdb
  CREATE_FILE_DEST = '/opt/oracle/oradata/FREE/FREEPDB2';

結果:

ORA-65165: missing or invalid path for file creation … Linux-x86_64 Error: 2: No such file or directory

原因: Oracleは優しいのでファイルは作ってくれますが、ディレクトリ(フォルダ)までは作ってくれません。 CREATE_FILE_DEST で指定したパスは、OS上で事前に作成しておく必要があります。

解決策:

$ mkdir -p /opt/oracle/oradata/FREE/FREEPDB2

第2の罠:Non-CDBにも「PDB作成権限」が必要?

ディレクトリを作って再実行。

結果:

ORA-17628: Oracle error 1031 returned by remote Oracle server ORA-01031: insufficient privileges

原因: 「ターゲット側(26ai)で実行してるんだから、ソース側(19c)は SELECT ANY DICTIONARY くらいあればいいでしょ?」という思い込みです。 リモートクローンを行う際、ソース側のユーザーにも CREATE PLUGGABLE DATABASE 権限が必要です。Non-CDBなのにPDB権限が必要というのは少し直感的ではないですが、クローンの許可証として機能します。

解決策: ソースDB(19c)で実行:

GRANT CREATE PLUGGABLE DATABASE TO c_user;

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

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

ラスボス:ORA-39712 の絶望

ようやく Pluggable database created. の文字が! 喜び勇んでPDBをオープンし、変換スクリプトを流そうとした瞬間です。

SQL> CREATE PLUGGABLE DATABASE freepdb2
2 FROM orcl@dblink_to_noncdb
3 CREATE_FILE_DEST = '/opt/oracle/oradata/FREE/FREEPDB2';

Pluggable database created.

SQL> conn / as sysdba
Connected.
SQL> show user
USER is "SYS"
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 FREEPDB1 READ WRITE NO
5 FREEPDB2 MOUNTED
SQL> alter pluggable database all open;
alter pluggable database all open
*
ERROR at line 1:
ORA-39712: database cannot be opened by an Oracle Database Free server
Help: https://docs.oracle.com/error-help/db/ora-39712/

「Oracle Database Free サーバーではデータベースを開けません」

え? なんで? 真っ先に疑ったのは Oracle Free版の「ユーザーデータ12GB制限」 です。

ライセンス情報

Free: ノードの使用は3個に制限されます。各ノードは、2つのCPU、2GBのRAMおよび12GBのユーザー・データというOracle AI Database Freeの制限に準拠する必要があります。

仮説検証:サイズオーバー?

既存のPDBを消し、ソースDB(19c)のサイズを確認しました。

SELECT SUM(BYTES)/1024/1024/1024 FROM DBA_DATA_FILES;
-- 結果: 1.76 GB

余裕です。12GBには程遠い。サイズ制限ではない。では何なのか?

真因:エディションの「格差」は埋められない

実は ORA-39712 は、サイズ制限だけでなく 「ライセンス的に互換性のないエディションのファイルを開こうとした」 時にも発生します。

今回の場合:

  • Source: 19c Enterprise Edition (or Standard Edition)
  • Target: 26ai Free Edition

CREATE PLUGGABLE DATABASE はデータファイルの「物理コピー」を行います。 19cのデータファイルには 「私は有償版(EE/SE)で作られたファイルです」 という刻印(メタデータ)が刻まれています。

これを無償版である 26ai Free で OPEN しようとすると、Oracleはこう判断します。 「有償版の機能をタダで使おうとしてない? ブロックするね!」

これが物理クローンの限界です。上位エディションから下位エディション(特にFree版)への物理ファイルの持ち込みはできません。

【参考:アラートログの出力】

2026-01-06T22:32:16.143278-05:00
Completed: CREATE PLUGGABLE DATABASE freepdb2
FROM orcl@dblink_to_noncdb
CREATE_FILE_DEST = '/opt/oracle/oradata/FREE/FREEPDB2'
2026-01-06T22:32:46.816236-05:00
alter pluggable database all open
(5):--ATTENTION--
(5):PARALLEL_MAX_SERVERS (with value 1) is insufficient. This may affect transaction recovery performance.
Modify PARALLEL_MAX_SERVERS parameter to a value > 2 (= parallel servers count computed from parameter FAST_START_PARALLEL_ROLLBACK) in PDB ID 5
FREEPDB2(5):Autotune of undo retention is turned on.
2026-01-06T22:32:47.669384-05:00
Opatch validation is skipped for PDB FREEPDB2 (con_id=5)
FREEPDB2(5):Deleting old file#1 from file$
FREEPDB2(5):Deleting old file#2 from file$
FREEPDB2(5):Deleting old file#3 from file$
FREEPDB2(5):Deleting old file#4 from file$
FREEPDB2(5):Deleting old file#5 from file$
FREEPDB2(5):Deleting old file#7 from file$
FREEPDB2(5):Adding new file#16 to file$(old file#1). fopr-1, newblks-116480, oldblks-64000
FREEPDB2(5):Adding new file#17 to file$(old file#3). fopr-1, newblks-70400, oldblks-51200
FREEPDB2(5):Adding new file#18 to file$(old file#4). fopr-1, newblks-44160, oldblks-3200
FREEPDB2(5):Adding new file#19 to file$(old file#7). fopr-1, newblks-640, oldblks-640
****************************************************************
Post plug operations are now complete.
Pluggable database FREEPDB2 with pdb id - 5 is now marked as NEW.
****************************************************************
2026-01-06T22:32:48.081650-05:00
FREEPDB2(5):Errors in file /opt/oracle/diag/rdbms/free/FREE/trace/FREE_ora_6908.trc:
ORA-39712: database cannot be opened by an Oracle Database Free server ★
2026-01-06T22:32:48.082047-05:00
Errors in file /opt/oracle/diag/rdbms/free/FREE/trace/FREE_ora_6908.trc:
ORA-39712: database cannot be opened by an Oracle Database Free server
FREEPDB2(5):JIT: pid 6908 requesting stop
FREEPDB2(5):Buffer Cache flush started: 5
FREEPDB2(5):Buffer Cache flush finished: 5
ORA-39712 signalled during: alter pluggable database all open...

最終的な解決策:論理移行 (Data Pump)

物理がダメなら論理です。ファイルそのものではなく、中身のデータだけを移行すればエディションの壁は越えられます。 DBLINKは既に繋がっているので、Network Link Import が最短ルートです。

成功手順:

  1. 26ai側: 空っぽのPDBを新規作成する。
  2. 26ai側: ディレクトリ(CREATE DIRECTORY)とDBLINKを準備。
  3. OS側: impdp で流し込む。
impdp pdbadmin/pass@freepdb2 \
  NETWORK_LINK=dblink_to_19c \
  DIRECTORY=dp_dir \
  FULL=Y

これで無事にデータが移行されました。

よくある質問 (FAQ)

Q1: ALTER PLUGGABLE DATABASE ... OPEN UPGRADE で回避できませんか?

通常のメジャーバージョンアップ(例: 19c EE → 26ai EE)であれば OPEN UPGRADE で開いてアップグレード処理を行うのが正解です。しかし、今回のように 「有償版 → Free版」 というエディション変更が伴う場合、ファイルヘッダーのライセンスチェックが優先され、アップグレードモードでも ORA-39712 で拒否されることがあります。

Q2: ソースが Standard Edition 2 (SE2) の場合も同様ですか?

はい、同様の現象が発生する可能性が高いです。Oracle Database Free は開発者ライセンスであり、製品版(SE2/EE)からの物理バックアップやクローンの適用に対して制限があります。やはり Data Pump が最も確実な回避策です。

Q3: Data Pump で移行した場合、noncdb_to_pdb.sql は必要ですか?

いいえ、不要です。noncdb_to_pdb.sql は物理クローン後のデータディクショナリ構造を変換するためのものです。Data Pump はデータの中身(論理データ)のみを新しい PDB に流し込むため、変換作業なしですぐに利用開始できます。

Q4: 移行元のデータが 12GB を超えている場合はどうすればいいですか?

Oracle Database Free の制限(ユーザーデータ最大12GB)は物理・論理問わず適用されます。Data Pump で移行する際、EXCLUDE オプションを使って不要なテーブルや監査ログを除外するか、移行元でデータを整理して 12GB 未満にする必要があります。

まとめ

  • Non-CDBからのPDBクローンは FROM NON$CDB を使う。
  • ソース側ユーザーにも CREATE PLUGGABLE DATABASE 権限が必要。
  • 【最重要】有償版(EE/SE) から Free版 への物理クローン(PDB作成)は ORA-39712 で詰む。
  • エディションが下がる移行は、素直に Data Pump を使いましょう。

26ai Free で検証環境を作る際の参考になれば幸いです!

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

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

コメント

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