Skip to main content

How to create a PDB manually using SQL




Clone the existing PDB.

1. We will create a clone PDB "TESTPDB" from existing PDB "ORCLPDB".

Take precheck.
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO SQL> select name from v$datafile where con_id=3; NAME -------------------------------------------------- /u01/app/oracle/oradata/ORCL/orclpdb/system01.dbf /u01/app/oracle/oradata/ORCL/orclpdb/sysaux01.dbf /u01/app/oracle/oradata/ORCL/orclpdb/undotbs01.dbf /u01/app/oracle/oradata/ORCL/orclpdb/users01.dbf /u01/app/oracle/oradata/ORCL/orclpdb/users02.dbf /u01/app/oracle/oradata/ORCL/orclpdb/OGGPDB01.dbf /u01/app/oracle/oradata/ORCL/orclpdb/audit_data01.dbf 7 rows selected. SQL> select name from v$tempfile where con_id=3; NAME -------------------------------------------------- /u01/app/oracle/oradata/ORCL/orclpdb/temp01.dbf SQL> alter session set container=ORCLPDB; Session altered. SQL> select sum(BYTES)/1024/1024/1024 as "Size(GB)" from dba_data_files; Size(GB) ---------- 2.43359375 SQL> select sum(BYTES)/1024/1024/1024 as "Size(GB)" from dba_segments; Size(GB) ---------- 1.11358643 SQL> select status,count(*) from dba_objects group by status; STATUS COUNT(*) ------- ---------- VALID 73176 INVALID 12 SQL> select USERNAME,ACCOUNT_STATUS,EXPIRY_DATE,PROFILE from dba_users where oracle_maintained='N'; USERNAME ACCOUNT_STATUS EXPIRY_DA PROFILE ------------------------------ -------------------------------- --------- -------------------- PDBADMIN OPEN 21-JUL-25 DEFAULT C##CLONE OPEN DEFAULT CDBTEST OPEN DEFAULT TESTAUDIT OPEN 19-FEB-26 DEFAULT C##TEST OPEN DEFAULT TEST OPEN 26-NOV-25 DEFAULT C##OGG OPEN DEFAULT OGG OPEN 29-NOV-25 DEFAULT 8 rows selected. SQL> select count(*) from test.COMPANY; COUNT(*) ---------- 7 Create directory for PDB datafiles.
[oracle@orcl ~]$ mkdir -p /u01/app/oracle/oradata/ORCL/testpdb Clone the PDB.
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO SQL> CREATE PLUGGABLE DATABASE TESTPDB from ORCLPDB FILE_NAME_CONVERT=('/u01/app/oracle/oradata/ORCL/orclpdb','/u01/app/oracle/oradata/ORCL/testpdb'); Pluggable database created. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO 4 TESTPDB MOUNTED SQL> alter PLUGGABLE DATABASE TESTPDB open; Pluggable database altered. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO 4 TESTPDB READ WRITE NO Take postcheck.
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO 4 TESTPDB READ WRITE NO SQL> set lines 333 pages 333 SQL> col name for a50 SQL> select name from v$datafile where con_id=4; NAME -------------------------------------------------- /u01/app/oracle/oradata/ORCL/testpdb/system01.dbf /u01/app/oracle/oradata/ORCL/testpdb/sysaux01.dbf /u01/app/oracle/oradata/ORCL/testpdb/undotbs01.dbf /u01/app/oracle/oradata/ORCL/testpdb/users01.dbf /u01/app/oracle/oradata/ORCL/testpdb/users02.dbf /u01/app/oracle/oradata/ORCL/testpdb/OGGPDB01.dbf /u01/app/oracle/oradata/ORCL/testpdb/audit_data01.dbf 7 rows selected. SQL> select name from v$tempfile where con_id=4; NAME -------------------------------------------------- /u01/app/oracle/oradata/ORCL/testpdb/temp01.dbf SQL> alter session set container=TESTPDB; Session altered. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 4 TESTPDB READ WRITE NO SQL> select sum(BYTES)/1024/1024/1024 as "Size(GB)" from dba_data_files; Size(GB) ---------- 2.43359375 SQL> select sum(BYTES)/1024/1024/1024 as "Size(GB)" from dba_segments; Size(GB) ---------- 1.11358643 SQL> select status,count(*) from dba_objects group by status; STATUS COUNT(*) ------- ---------- VALID 73263 INVALID 12 SQL> select USERNAME,ACCOUNT_STATUS,EXPIRY_DATE,PROFILE from dba_users where oracle_maintained='N'; USERNAME ACCOUNT_STATUS EXPIRY_DA PROFILE ------------------------------ -------------------------------- --------- -------------------- PDBADMIN OPEN 21-JUL-25 DEFAULT C##CLONE OPEN DEFAULT CDBTEST OPEN DEFAULT TESTAUDIT OPEN 19-FEB-26 DEFAULT C##TEST OPEN DEFAULT TEST OPEN 26-NOV-25 DEFAULT C##OGG OPEN DEFAULT OGG OPEN 29-NOV-25 DEFAULT 8 rows selected. SQL> select count(*) from test.COMPANY; COUNT(*) ---------- 7

Blank PDB creation.

2. Now we will create a blank PDB. The blank PDB will use the PDB$SEED template for its datafiles.
 
Create directory for PDB datafiles.
[oracle@orcl ~]$ mkdir -p /u01/app/oracle/oradata/ORCL/testpdb2 Create blank PDB.
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO 4 TESTPDB READ WRITE NO SQL> SQL> CREATE PLUGGABLE DATABASE TESTPDB2 ADMIN USER pdb_admin IDENTIFIED BY Oracle#123 FILE_NAME_CONVERT=('/u01/app/oracle/oradata/ORCL/pdbseed','/u01/app/oracle/oradata/ORCL/testpdb2'); Pluggable database created. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO 4 TESTPDB READ WRITE NO 5 TESTPDB2 MOUNTED SQL> SQL> ALTER PLUGGABLE DATABASE testpdb2 OPEN; Warning: PDB altered with errors. Check PDB violations.
SQL> set lines 333 pages 333 SQL> col NAME for a20 SQL> col CAUSE for a30 SQL> col MESSAGE for a70 SQL> select name,cause,type,message,status,action from PDB_PLUG_IN_VIOLATIONS where name='PROD'; NAME CAUSE TYPE MESSAGE STATUS --------- ------------- ------ ----------------------------------------------------------------------------- --------- TESTPDB2 Sync Failure ERROR Sync PDB failed with ORA-959 during 'alter user c##ogg quota unlimited on OGG'. PENDING We need to create one tablespace OGG for user c##ogg as this database is being used for Golden Gate. Then try to open the PDB.
SQL> ALTER SESSION SET CONTAINER=testpdb2; Session altered. SQL> CREATE TABLESPACE ogg DATAFILE '/u01/app/oracle/oradata/ORCL/testpdb2/ogg01.dbf' SIZE 100M AUTOEXTEND ON; Tablespace created. SQL> ALTER SESSION SET CONTAINER=CDB$ROOT; Session altered. SQL> ALTER PLUGGABLE DATABASE testpdb2 close immediate; Pluggable database altered. SQL> ALTER PLUGGABLE DATABASE testpdb2 OPEN; Pluggable database altered. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO 4 TESTPDB READ WRITE NO 5 TESTPDB2 READ WRITE NO SQL> ALTER PLUGGABLE DATABASE testpdb2 save state; Pluggable database altered.

Clone the existing PDB via Database Link.

3. We can also clone the the existing PDB from a different database via database link. So let's procced for that.
Environemnt:
Source:ORCLDC
Target:TESTDB
 
Create a user in source CDB database and provide the required grants.
SQL> def DEFINE _DATE = "11-AUG-25" (CHAR) DEFINE _CONNECT_IDENTIFIER = "orcldc" (CHAR) DEFINE _USER = "SYS" (CHAR) DEFINE _PRIVILEGE = "AS SYSDBA" (CHAR) DEFINE _SQLPLUS_RELEASE = "1927000000" (CHAR) DEFINE _EDITOR = "vi" (CHAR) DEFINE _O_VERSION = "Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.27.0.0.0" (CHAR) DEFINE _O_RELEASE = "1927000000" (CHAR) SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO SQL> CREATE USER c##clone IDENTIFIED BY oracle#123; User created. SQL> GRANT CREATE PLUGGABLE DATABASE TO c##clone CONTAINER=ALL; Grant succeeded. Create a public database link in target with source userr & its TNS alias.
SQL> def DEFINE _DATE = "11-AUG-25" (CHAR) DEFINE _CONNECT_IDENTIFIER = "testdb" (CHAR) DEFINE _USER = "SYS" (CHAR) DEFINE _PRIVILEGE = "AS SYSDBA" (CHAR) DEFINE _SQLPLUS_RELEASE = "1927000000" (CHAR) DEFINE _EDITOR = "vi" (CHAR) DEFINE _O_VERSION = "Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.27.0.0.0" (CHAR) DEFINE _O_RELEASE = "1927000000" (CHAR) SQL> SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 TESTPDB READ WRITE NO SQL> create database link PDB_LINK connect to c##clone identified by oracle#123 using 'orclpdb'; Database link created. SQL> select * from dual@PDB_LINK; D - X Create directory for PDB datafiles.
[oracle@orcl ~]$ mkdir -p /u01/app/oracle/oradata/TESTDB/orclpdb Now create the PDB via database link and open it.
SQL> create pluggable database ORCLPDB from ORCLPDB@PDB_LINK file_name_convert=('/u01/app/oracle/oradata/ORCL/orclpdb','/u01/app/oracle/oradata/TESTDB/orclpdb'); Pluggable database created. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 TESTPDB READ WRITE NO 5 ORCLPDB MOUNTED SQL> alter pluggable database ORCLPDB open; Pluggable database altered. SQL> alter pluggable database ORCLPDB save state; Pluggable database altered. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 TESTPDB READ WRITE NO 5 ORCLPDB READ WRITE NO

Rename the PDB.

4. Now we will rename the existing PDB. For this we need to modify global_name parameter for that particular PDB. So let's procced for that.
  
Here we will rename TESTPDB to MYPDB.
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO 4 TESTPDB READ WRITE NO SQL> SQL> ALTER PLUGGABLE DATABASE testpdb CLOSE IMMEDIATE; Pluggable database altered. SQL> alter pluggable database TESTPDB open restricted; Pluggable database altered. SQL> select name, open_mode, restricted from v$pdbs; NAME OPEN_MODE RES -------------------- ---------- --- PDB$SEED READ ONLY NO ORCLPDB READ WRITE NO TESTPDB READ WRITE YES SQL> alter session set container=TESTPDB; Session altered. SQL> alter pluggable database rename global_name to mypdb; Pluggable database altered. SQL> select name, open_mode, restricted from v$pdbs; NAME OPEN_MODE RES -------------------- ---------- --- MYPDB READ WRITE YES SQL> ALTER PLUGGABLE DATABASE MYPDB CLOSE IMMEDIATE; Pluggable database altered. SQL> ALTER PLUGGABLE DATABASE MYPDB open; Pluggable database altered. SQL> ALTER PLUGGABLE DATABASE MYPDB save state; Pluggable database altered. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 4 MYPDB READ WRITE NO SQL> SQL> conn /as sysdba Connected. SQL> SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO 4 MYPDB READ WRITE NO SQL>
Please note that, this method of renamimg PDB, will not change the location & name of its datafile. If you want to rename the datafiles, use "ALTER DATABASE RENAME FILE" command.
Further if you want to rename the datafile while renaming the PDB, you can use Unplug & Plug method which is described below.

5. Here we will use Unplug & Plug method for renaming the PDB.

Create directory for datafiles.
[oracle@orcl ~]$ mkdir -p /u01/app/oracle/oradata/ORCL/mypdb Fetch TESTPDB details.
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO 4 TESTPDB READ WRITE NO SQL> SQL> select name from v$datafile where con_id=4; NAME -------------------------------------------------- /u01/app/oracle/oradata/ORCL/testpdb/system01.dbf /u01/app/oracle/oradata/ORCL/testpdb/sysaux01.dbf /u01/app/oracle/oradata/ORCL/testpdb/undotbs01.dbf /u01/app/oracle/oradata/ORCL/testpdb/users01.dbf /u01/app/oracle/oradata/ORCL/testpdb/users02.dbf /u01/app/oracle/oradata/ORCL/testpdb/OGGPDB01.dbf /u01/app/oracle/oradata/ORCL/testpdb/audit_data01.dbf 7 rows selected. SQL> select name from v$tempfile where con_id=4; NAME -------------------------------------------------- /u01/app/oracle/oradata/ORCL/testpdb/temp01.dbf Unplug the PDB.
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO 4 TESTPDB READ WRITE NO SQL> ALTER PLUGGABLE DATABASE TESTPDB CLOSE IMMEDIATE; Pluggable database altered. SQL> ALTER PLUGGABLE DATABASE TESTPDB UNPLUG INTO '/home/oracle/testpdb.xml'; Pluggable database altered. Drop the PDB & keep datafiles.
SQL> DROP PLUGGABLE DATABASE TESTPDB KEEP DATAFILES; Pluggable database dropped. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO Now Plug the PDB & rename datafiles.
SQL> CREATE PLUGGABLE DATABASE MYPDB USING '/home/oracle/testpdb.xml' FILE_NAME_CONVERT = ( '/u01/app/oracle/oradata/ORCL/testpdb', '/u01/app/oracle/oradata/ORCL/mypdb' ); Pluggable database created. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO 6 MYPDB MOUNTED SQL> Verify the details & open the PDB.
SQL> select name from v$datafile where con_id=6; NAME ------------------------------------------------------------ /u01/app/oracle/oradata/ORCL/mypdb/system01.dbf /u01/app/oracle/oradata/ORCL/mypdb/sysaux01.dbf /u01/app/oracle/oradata/ORCL/mypdb/undotbs01.dbf /u01/app/oracle/oradata/ORCL/mypdb/users01.dbf /u01/app/oracle/oradata/ORCL/mypdb/users02.dbf /u01/app/oracle/oradata/ORCL/mypdb/OGGPDB01.dbf /u01/app/oracle/oradata/ORCL/mypdb/audit_data01.dbf 7 rows selected. SQL> select name from v$tempfile where con_id=6; NAME ------------------------------------------------------------ /u01/app/oracle/oradata/ORCL/mypdb/temp01.dbf SQL> alter pluggable DATABASE MYPDB open; Pluggable database altered. SQL> alter pluggable DATABASE MYPDB save state; Pluggable database altered. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB READ WRITE NO 6 MYPDB READ WRITE NO

Drop the existing PDB.

6. Now we will drop the PDB.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ WRITE NO
         6 MYPDB                          READ WRITE NO

SQL> ALTER PLUGGABLE DATABASE MYPDB CLOSE IMMEDIATE;

Pluggable database altered.

SQL> DROP PLUGGABLE DATABASE MYPDB INCLUDING DATAFILES;

Pluggable database dropped.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ WRITE NO
SQL>


Thank you for reading!

I hope this content has been helpful to you. Your feedback and suggestions are always welcome — feel free to leave a comment or reach out with any queries.

Abhishek Shrivastava

📧 Email: oraeasyy@gmail.com
🌐 Website: www.oraeasy.com

Follow Us

Comments