Converting a non-CDB to PDB is very easy, thanks to DBMS_PDB package provided by Oracle from 12c onwards. DBMS_PDB allows to you create an XML and generate the metadata for non-CDB just like you'll create it when you unplug any PDB.
Here I'll be mapping a non-CDB (CDB2) database to a container database (CDB1) as a pluggable database and name it as PDB2.
Let's begin...
1) Ensure the non-CDB database is in READ ONLY state.
[oracle@oravm19c-2 admin]$ sqlplus sys@cdb2 as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 15 12:02:14 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
SQL>
SQL> shu immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup open read only;
ORACLE instance started.
Total System Global Area 1107295376 bytes
Fixed Size 8895632 bytes
Variable Size 301989888 bytes
Database Buffers 788529152 bytes
Redo Buffers 7880704 bytes
Database mounted.
Database opened.
2) Generate XML metadata using DBMS_PDB.DESCRIBE procedure as shown below.
SQL> BEGIN
DBMS_PDB.DESCRIBE(
pdb_descr_file => '/u01/cdb2.xml');
END;
/ 2 3 4 5
PL/SQL procedure successfully completed.
SQL>
3) Now you can shutdown your non-CDB instance.
SQL> shu immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> quit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
4) Connect to Container database where you want to plug this as PDB.
[oracle@oravm19c-2 admin]$ . oraenv
ORACLE_SID = [cdb2] ? cdb1
The Oracle base remains unchanged with value /u01/app/oracle
[oracle@oravm19c-2 admin]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 15 12:08:08 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> select name, open_mode from V$database;
NAME OPEN_MODE
--------- --------------------
CDB1 READ WRITE
5) Create the PDB using XML, COPY and FILE_NAME_CONVERT options.
SQL> create pluggable database pdb2 using '/u01/cdb2.xml' copy file_name_convert=('/u01/app/oracle/oradata/CDB2/', '/u01/app/oracle/oradata/CDB1/pdb2/');
Pluggable database created.
6) Switch to PDB2 and run non-CDB to PDB conversion script as shown below.
SQL> @?/rdbms/admin/noncdb_to_pdb.sql
The script will take a while to finish so be patient and output log is too long so can't paste the full version but it should finish with something like this,
12:22:03 > } h2 {font:bold 10pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; margin-top:4pt; margin-bottom:0pt;} a {font:9pt Arial,Helvetica,sans-serif; color:#663300; background:#ffffff; margin-top:0pt; margin-bottom:0pt; vertical-align:top;}</style><title>SQL*Plus Report</title>" BODY "" TABLE "border='1' width='90%' align='center' summary='Script output'" SPOOL OFF ENTMAP ON PRE OFF
12:22:03 SQL> set markup CSV OFF DELIMITER , QUOTE ON
12:22:03 SQL> set newpage 1
12:22:03 SQL> set null ""
12:22:03 SQL> set numformat ""
12:22:03 SQL> set numwidth 10
12:22:03 SQL> set pagesize 100
12:22:03 SQL> set pause OFF
12:22:03 SQL> set recsep WRAP
12:22:03 SQL> set recsepchar " "
12:22:03 SQL> set rowlimit OFF
12:22:03 SQL> set rowprefetch 1
12:22:03 SQL> set securedcol OFF
12:22:03 SQL> set serveroutput OFF
12:22:03 SQL> set shiftinout invisible
12:22:03 SQL> set showmode OFF
12:22:03 SQL> set sqlblanklines OFF
12:22:03 SQL> set sqlcase MIXED
12:22:03 SQL> set sqlcontinue "> "
12:22:03 SQL> set sqlnumber ON
12:22:03 SQL> set sqlpluscompatibility 19.0.0
12:22:03 SQL> set sqlprefix "#"
12:22:03 SQL> set sqlprompt "SQL> "
12:22:03 SQL> set sqlterminator ";"
12:22:03 SQL> set statementcache 0
12:22:03 SQL> set suffix "sql"
12:22:03 SQL> set tab OFF
12:22:03 SQL> set termout ON
12:22:03 SQL> set time OFF
SQL> set timing OFF
SQL> set trimout ON
SQL> set trimspool ON
SQL> set underline "-"
SQL> set verify OFF
SQL> set wrap ON
SQL> set xmloptimizationcheck OFF
SQL> 7) Open the newly created PDB now and validate.
SQL> show con_name;
CON_NAME
------------------------------
PDB2
SQL> alter pluggable database open;
Pluggable database altered.
SQL> col name for a20;
SQL> select name, open_mode from V$pdbs;
NAME OPEN_MODE
-------------------- ----------
PDB2 READ WRITE
1 row selected.
SQL> alter session set container=CDB$ROOT;
Session altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
5 PDB2 READ WRITE NO
The conversion has successfully completed at this point. Your newly migrated PDB is available for use now.
I hope this helps !!
No comments:
Post a Comment