Are you all trying out the latest Oracle Database 26ai Free? It is an engineer’s nature to think, “I just want to bring my local 19c environment to 26ai and test it!”
This time, I would like to share how I got stuck significantly when attempting to remote clone an on-premise 19c (Non-CDB) to a 26ai Free environment as a PDB.
To give you the conclusion first: “Give up on physical cloning, use Data Pump.”
What I Wanted to Do
- Source: Oracle 19c (Enterprise Edition / Non-CDB)
- Target: Oracle 26ai Free (CDB)
- Method:
CREATE PLUGGABLE DATABASE ... FROMusing DBLINK
I thought I could migrate quickly using the “remote clone” method, which has been the standard since 12c, and just run noncdb_to_pdb.sql at the end… until this moment.
Preparation: Creating tnsnames.ora and DBLINK
Before executing the clone, prepare the network settings and database link to connect from the Target side (26ai) to the Source side (19c). Everything was smooth up to this point.
1. tnsnames.ora Setting (Target Side)
Append the connection identifier for 19c to $ORACLE_HOME/network/admin/tnsnames.ora on the 26ai server.
# Source 19c (Non-CDB)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = orcl19c)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
2. Creating DBLINK (Target Side)
Connect to the 26ai CDB as an administrator and create a DBLINK using the identifier configured above.
-- DBLINK creation
CREATE DATABASE LINK dblink_to_noncdb
CONNECT TO c_user IDENTIFIED BY "password"
USING 'ORCL';
-- Connection check (OK if this passes)
SELECT * FROM DUAL@dblink_to_noncdb;
Trap 1: Directories Are Not Created Automatically
With preparations complete, I executed the clone command with high spirits.
CREATE PLUGGABLE DATABASE freepdb2
FROM orcl@dblink_to_noncdb
CREATE_FILE_DEST = '/opt/oracle/oradata/FREE/FREEPDB2';
Result:
ORA-65165: missing or invalid path for file creation … Linux-x86_64 Error: 2: No such file or directory
Cause: Oracle is kind enough to create the files for you, but it does not create the directories (folders). The path specified in CREATE_FILE_DEST must be created on the OS beforehand.
Solution:
$ mkdir -p /opt/oracle/oradata/FREE/FREEPDB2
Trap 2: “PDB Creation Privileges” Needed Even on Non-CDB?
I created the directory and re-executed.
Result:
ORA-17628: Oracle error 1031 returned by remote Oracle server ORA-01031: insufficient privileges
Cause: This was an assumption: “Since I’m running this on the target side (26ai), the source side (19c) just needs SELECT ANY DICTIONARY, right?” When performing a remote clone, the user on the source side also requires the CREATE PLUGGABLE DATABASE privilege. Needing PDB privileges even though it is a Non-CDB is slightly counter-intuitive, but it functions as a permit for cloning.
Solution: Execute on Source DB (19c):
GRANT CREATE PLUGGABLE DATABASE TO c_user;
The Final Boss: The Despair of ORA-39712
Finally, the text Pluggable database created. appeared! Filled with joy, I opened the PDB and was about to run the conversion script…
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/
“Database cannot be opened by an Oracle Database Free server”
Huh? Why? The first thing I suspected was the “12GB user data limit” of the Oracle Free version.
Licensing Information
Free: Use is limited to three nodes. Each node must adhere to the Oracle AI Database Free limit of 2 CPUs, 2GB RAM, and 12GB of user data.
Hypothesis Verification: Size Over?
I deleted the existing PDB and checked the size of the source DB (19c).
SELECT SUM(BYTES)/1024/1024/1024 FROM DBA_DATA_FILES;
-- Result: 1.76 GB
It is well within limits. Far from 12GB. It is not a size restriction. Then what is it?
Root Cause: The “Gap” in Editions Cannot Be Bridged
Actually, ORA-39712 occurs not only due to size limits but also when “attempting to open files from a license-incompatible edition.”
In this case:
- Source: 19c Enterprise Edition (or Standard Edition)
- Target: 26ai Free Edition
CREATE PLUGGABLE DATABASE performs a “physical copy” of the data files. The 19c data files have a stamp (metadata) engraved on them saying, “I am a file created by a Paid Version (EE/SE).”
When you try to OPEN this with 26ai Free, which is a free version, Oracle judges: “Are you trying to use paid version features for free? Blocking!”
This is the limitation of physical cloning. You cannot bring physical files from a higher edition to a lower edition (specifically the Free version).
[Reference: Alert Log Output]
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...
Final Solution: Logical Migration (Data Pump)
If physical doesn’t work, go logical. If you migrate only the data inside rather than the files themselves, you can cross the edition barrier. Since the DBLINK is already connected, Network Link Import is the shortest route.
Success Procedure:
- 26ai Side: Create a new empty PDB.
- 26ai Side: Prepare the directory (
CREATE DIRECTORY) and DBLINK. - OS Side: Pour data in using
impdp.
impdp pdbadmin/pass@freepdb2 \
NETWORK_LINK=dblink_to_19c \
DIRECTORY=dp_dir \
FULL=Y
With this, the data was successfully migrated.
Frequently Asked Questions (FAQ)
Q1: Can’t I avoid this with ALTER PLUGGABLE DATABASE ... OPEN UPGRADE? For a standard major version upgrade (e.g., 19c EE -> 26ai EE), opening with OPEN UPGRADE and performing the upgrade process is the correct answer. However, when an edition change like “Paid Version -> Free Version” is involved as in this case, the license check in the file header takes precedence, and even upgrade mode may be rejected with ORA-39712.
Q2: Is it the same if the source is Standard Edition 2 (SE2)? Yes, it is highly likely that the same phenomenon will occur. Oracle Database Free is a developer license, and there are restrictions on applying physical backups or clones from product versions (SE2/EE). Data Pump remains the most certain workaround.
Q3: If migrating with Data Pump, is noncdb_to_pdb.sql necessary? No, it is not necessary. noncdb_to_pdb.sql is for converting the data dictionary structure after a physical clone. Since Data Pump pours only the content (logical data) into the new PDB, you can start using it immediately without any conversion work.
Q4: What should I do if the source data exceeds 12GB? The Oracle Database Free limit (maximum 12GB user data) applies regardless of whether it is physical or logical. When migrating with Data Pump, you need to use the EXCLUDE option to exclude unnecessary tables or audit logs, or organize data on the source side to bring it under 12GB.
Summary
- Use
FROM NON$CDBfor PDB cloning from Non-CDB. - The source side user also needs the
CREATE PLUGGABLE DATABASEprivilege. - [Most Important] Physical cloning (PDB creation) from a Paid Version (EE/SE) to the Free Version results in a dead end with
ORA-39712. - For migrations where the edition is downgraded, simply use Data Pump.
I hope this helps when building verification environments on 26ai Free!



コメント