In this topic, I will show how to Create and manage PDB:
- Create a PDB from SEED.
- Clone a PDB with No Data.
- Clone a PDB from existing local PDB.
- Clone a PDB from existing remote PDB.
- Clone a PDB from existing remote Non-CDB.
- Clone a PDB from non-CDB using DBMS_PDB Package.
- Plugging In an Unplugged PDB from one CDB to another CDB.
- Drop a PDB (Pluggable Database)
Summary of File Location Clauses and Initialization Parameters:
Create a PDB from SEED:
Clone a PDB from non-CDB using DBMS_PDB Package
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDBORCL READ WRITE NO SQL> select name from v$datafile where name like '%pdbseed%'; NAME -------------------------------------------------------------------------------- /u01/app/oracle/oradata/orcl/pdbseed/system01.dbf /u01/app/oracle/oradata/orcl/pdbseed/sysaux01.dbf
[oracle@ocm12c admin]$ mkdir -p /u01/app/oracle/oradata/salespdb
Note:::If Oracle Manage File parameter (db_file_name_convert) disable then need to provide the value for FILE_NAME_CONVERT parameter with Create Pluggable Database Command.
SQL> show parameter FILE_NAME_CONVERT NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_file_name_convert string log_file_name_convert string pdb_file_name_convert string SQL> CREATE PLUGGABLE DATABASE salespdb 2 ADMIN USER salesadm IDENTIFIED BY password 3 ROLES = (dba) 4 DEFAULT TABLESPACE sales 5 DATAFILE '/u01/app/oracle/oradata/salespdb/sales01.dbf' SIZE 25M AUTOEXTEND ON 6 FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/orcl/pdbseed/', 7 '/u01/app/oracle/oradata/salespdb/') 8 STORAGE (MAXSIZE 2G) 9 PATH_PREFIX = '/u01/app/oracle/oradata/orcl/pdbseed'; Pluggable database created. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDBORCL READ WRITE NO 4 SALESPDB MOUNTED SQL> alter pluggable database SALESPDB open; Pluggable database altered. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDBORCL READ WRITE NO 4 SALESPDB READ WRITE NO
Create PDB with Oracle Manager File Option:
SQL> select name from v$datafile where name like '%pdbseed%'; NAME -------------------------------------------------------------------------------- /u01/app/oracle/oradata/orcl/pdbseed/system01.dbf /u01/app/oracle/oradata/orcl/pdbseed/sysaux01.dbf SQL> CREATE PLUGGABLE DATABASE pdbtest ADMIN USER pdbadmin IDENTIFIED BY pdbadmin; CREATE PLUGGABLE DATABASE pdbtest ADMIN USER pdbadmin IDENTIFIED BY pdbadmin * ERROR at line 1: ORA-65016: FILE_NAME_CONVERT must be specified SQL> show parameter db_create_file_dest NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_create_file_dest string SQL> alter system set db_create_file_dest='/u01/app/oracle/oradata/orcl'; System altered. SQL> show parameter db_create_file_dest NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_create_file_dest string /u01/app/oracle/oradata/orcl SQL> CREATE PLUGGABLE DATABASE pdbtest ADMIN USER pdbadmin IDENTIFIED BY pdbadmin; Pluggable database created. SQL> SELECT name, open_mode, restricted FROM v$pdbs; NAME OPEN_MODE RES ------------------------------ ---------- --- PDB$SEED READ ONLY NO PDBORCL MOUNTED SALESPDB READ WRITE NO PDBTEST READ WRITE NO
Use below query to show list of datafiles for CDB and all PDBs:
SQL> col DATA_FILE_NAME for a60 SQL> col DB_NAME for A15 SQL> SELECT c.name DB_NAME, b.name DATA_FILE_NAME -- a.con_id, a.ts#, a.name TABLESPACE_NAME, b.name DATA_FILE_NAME, b.file#, b.blocks, b.bytes/1024/1024 SIZE_MB, b.status, b.enabled, b.creation_time FROM v$tablespace a, v$datafile b, v$containers c WHERE a.con_id = b.con_id AND a.con_id = c.con_id AND a.ts# = b.ts# ORDER BY a.con_id, a.TS#; DB_NAME DATA_FILE_NAME --------------- ------------------------------------------------------------ CDB$ROOT /u01/app/oracle/oradata/orcl/system01.dbf CDB$ROOT /u01/app/oracle/oradata/orcl/sysaux01.dbf CDB$ROOT /u01/app/oracle/oradata/orcl/undotbs01.dbf CDB$ROOT /u01/app/oracle/oradata/orcl/users01.dbf PDB$SEED /u01/app/oracle/oradata/orcl/pdbseed/system01.dbf PDB$SEED /u01/app/oracle/oradata/orcl/pdbseed/sysaux01.dbf PDBORCL /u01/app/oracle/oradata/orcl/pdborcl/system01.dbf PDBORCL /u01/app/oracle/oradata/orcl/pdborcl/sysaux01.dbf PDBORCL /u01/app/oracle/oradata/orcl/pdborcl/pdborcl_users01.dbf SALESPDB /u01/app/oracle/oradata/salespdb/system01.dbf SALESPDB /u01/app/oracle/oradata/salespdb/sysaux01.dbf SALESPDB /u01/app/oracle/oradata/salespdb/sales01.dbf PDBTEST /u01/app/oracle/oradata/orcl/ORCL/AD47DCFB4D7A165BE053DC38A8C0373F/datafile/o1_mf_system_hmvw32m1_.dbf PDBTEST /u01/app/oracle/oradata/orcl/ORCL/AD47DCFB4D7A165BE053DC38A8C0373F/datafile/o1_mf_sysaux_hmvw32m4_.dbf
SQL> conn / as sysdba Connected. SQL> show parameter pdb_file_name_convert NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ pdb_file_name_convert string SQL> Alter session set pdb_file_name_convert='/u01/app/oracle/oradata/orcl/pdbseed/','/u01/app/oracle/oradata/orcl/pdbone/'; Session altered. SQL> show parameter pdb_file_name_convert NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ pdb_file_name_convert string /u01/app/oracle/oradata/orcl/pdbseed/, /u01/app/oracle/oradata/orcl/pdbone/ SQL> show parameter db_create_file_dest NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_create_file_dest string /u01/app/oracle/oradata/orcl SQL> CREATE PLUGGABLE DATABASE pdbone1 admin user newadmin identified by oracle; Pluggable database created. SQL> alter session set container=pdbone1; Session altered. SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u01/app/oracle/oradata/orcl/undotbs01.dbf /u01/app/oracle/oradata/orcl/ORCL/AD6DEF6186271432E053DC38A8C09AE0/datafile/o1_mf_system_hn0vrzqv_.dbf /u01/app/oracle/oradata/orcl/ORCL/AD6DEF6186271432E053DC38A8C09AE0/datafile/o1_mf_sysaux_hn0vrzqx_.dbf
SQL> show parameter pdb_file_name_convert NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ pdb_file_name_convert string /u01/app/oracle/oradata/orcl/pdbseed/, /u01/app/oracle/oradata/orcl/pdbtwo/ SQL> ! [oracle@ocm12c oradata]$ mkdir -p /u01/app/oracle/oradata/orcl/pdbtwo/ [oracle@ocm12c oradata]$ exit SQL> show parameter pdb_file_name_convert NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ pdb_file_name_convert string /u01/app/oracle/oradata/orcl/pdbseed/, /u01/app/oracle/oradata/orcl/pdbtwo/ SQL> CREATE PLUGGABLE DATABASE pdbtwo admin user newadmin identified by oracle; Pluggable database created. SQL> Alter session set container=pdbtwo; Session altered. SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u01/app/oracle/oradata/orcl/undotbs01.dbf /u01/app/oracle/oradata/orcl/pdbtwo/system01.dbf /u01/app/oracle/oradata/orcl/pdbtwo/sysaux01.dbf
SQL> Alter session set container=PDBTEST; Create table tbltest (id number); Table created. SQL> Insert into tbltest values(1); 1 row created. SQL> Commit; Commit complete. SQL> conn / as sysdba Connected. SQL> alter pluggable database pdbtest close; Pluggable database altered. SQL> alter pluggable database pdbtest open read only; Pluggable database altered. SQL> alter session set db_create_file_dest='/u01/app/oracle/oradata'; Session altered. SQL> CREATE PLUGGABLE DATABASE PDBCLONETEST FROM PDBTEST; Pluggable database created. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDBORCL MOUNTED 4 SALESPDB READ WRITE NO 5 PDBTEST READ ONLY NO 6 PDBONE MOUNTED 7 PDBCLONETEST MOUNTED SQL> alter pluggable database PDBCLONETEST open; Pluggable database altered. SQL> alter session set container=PDBCLONETEST; Session altered. SQL> select * from tbltest; ID ---------- 1
Clone a PDB from existing local PDB:
SQL> alter session set container=PDBTEST; Session altered. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 5 PDBTEST READ ONLY NO SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u01/app/oracle/oradata/orcl/undotbs01.dbf /u01/app/oracle/oradata/orcl/ORCL/AD47DCFB4D7A165BE053DC38A8C0373F/datafile/o1_mf_system_hmvw32m1_.dbf /u01/app/oracle/oradata/orcl/ORCL/AD47DCFB4D7A165BE053DC38A8C0373F/datafile/o1_mf_sysaux_hmvw32m4_.dbf SQL> conn / as sysdba Connected. SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> show parameter db_create_file_dest NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_create_file_dest string /u01/app/oracle/oradata/orcl SQL> alter session set db_create_file_dest=''; Session altered. SQL> show parameter pdb_file_name_convert NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ pdb_file_name_convert string SQL> CREATE PLUGGABLE DATABASE PDBCLONETEST1 FROM PDBTEST FILE_NAME_CONVERT=('PDBTEST','PDBCLONETEST'); CREATE PLUGGABLE DATABASE PDBCLONETEST1 FROM PDBTEST FILE_NAME_CONVERT=('PDBTEST','PDBCLONETEST') * ERROR at line 1: ORA-65005: missing or invalid file name pattern for file - /u01/app/oracle/oradata/orcl/ORCL/AD47DCFB4D7A165BE053DC38A8C0373F/datafile/o1_mf_system_hmvw32m1_.dbf SQL> ! mkdir -p /u01/app/oracle/oradata/orcl/pdbclonetest1 SQL> CREATE PLUGGABLE DATABASE PDBCLONETEST1 FROM PDBTEST FILE_NAME_CONVERT=('/u01/app/oracle/oradata/orcl/ORCL/AD47DCFB4D7A165BE053DC38A8C0373F/datafile/','/u01/app/oracle/oradata/orcl/pdbclonetest1'); Pluggable database created. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDBORCL MOUNTED 4 SALESPDB READ WRITE NO 5 PDBTEST READ ONLY NO 6 PDBONE MOUNTED 7 PDBCLONETEST READ WRITE NO 8 PDBCLONETEST1 MOUNTED SQL> Alter pluggable database PDBCLONETEST1 open; Pluggable database altered. SQL> alter session set container=PDBCLONETEST1; Session altered. SQL> select * from tbltest; ID ---------- 1
Clone a PDB with No Data:
If Create any table on SYSTEM & SYSAUX tablespace by user, these data will consider to move to new database. But all others tablespace data will not consider for movement.
SQL> alter pluggable database pdbone open; Pluggable database altered. SQL> alter session set container=pdbone; Session altered. SQL> CREATE TABLESPACE TBSTEST DATAFILE '/u01/app/oracle/oradata/orcl/tbstest01.dbf' SIZE 1M AUTOEXTEND ON NEXT 1M; Tablespace created. SQL> CREATE USER JOHN IDENTIFIED BY test DEFAULT TABLESPACE tbstest QUOTA UNLIMITED ON tbstest; User created. SQL> create table JOHN.t1(id number) tablespace tbstest; Table created. SQL> create table JOHN.t2(id number) tablespace system; Table created. SQL> create table sys.t1 (id number) tablespace system; Table created. SQL> create table sys.t2 (id number) tablespace tbstest; Table created. SQL> Select OWNER, TABLE_NAME, TABLESPACE_NAME FROM DBA_TABLES WHERE TABLE_NAME IN ('T1','T2'); OWNER TABLE_NAME TABLESPACE_NAME ---------- ---------- -------------------- SYS T2 TBSTEST SYS T1 SYSTEM JOHN T2 SYSTEM JOHN T1 TBSTEST SQL> INSERT INTO SYS.T1 VALUES(10); 1 row created. SQL> INSERT INTO SYS.T1 VALUES(20); 1 row created. SQL> INSERT INTO SYS.T2 VALUES(30); 1 row created. SQL> INSERT INTO SYS.T2 VALUES(40); 1 row created. SQL> INSERT INTO JOHN.T1 VALUES(50); 1 row created. SQL> INSERT INTO JOHN.T1 VALUES(60); 1 row created. SQL> INSERT INTO JOHN.T2 VALUES(70); 1 row created. SQL> INSERT INTO JOHN.T2 VALUES(80); 1 row created. SQL> COMMIT; Commit complete. SQL> SHOW PDBS CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 6 PDBONE READ WRITE NO SQL> conn / as sysdba Connected. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDBORCL MOUNTED 4 SALESPDB MOUNTED 5 PDBTEST MOUNTED 6 PDBONE READ WRITE NO SQL> alter pluggable database pdbone close; Pluggable database altered. SQL> alter pluggable database pdbone open read only; Pluggable database altered. SQL> CREATE PLUGGABLE DATABASE PDBNODATA FROM PDBONE NO DATA; Pluggable database created. SQL> alter pluggable database pdbnodata open; Pluggable database altered. SQL> alter session set container = pdbnodata; Session altered. SQL> select * from sys.t1; ID ---------- 10 20 SQL> select * from sys.t2; no rows selected SQL> select * from john.t1; no rows selected SQL> select * from john.t2; ID ---------- 70 80 SQL> col OWNER for A10 SQL> col TABLE_NAME for A10 SQL> col TABLESPACE_NAME for A20 SQL> Select OWNER, TABLE_NAME, TABLESPACE_NAME FROM DBA_TABLES WHERE TABLE_NAME IN ('T1','T2'); OWNER TABLE_NAME TABLESPACE_NAME ---------- ---------- -------------------- SYS T2 TBSTEST SYS T1 SYSTEM JOHN T1 TBSTEST JOHN T2 SYSTEM
Clone a PDB from existing remote PDB:
We have two CDBs called ORCL and MYCDB. There is a PDB called PDBNODATA under ORCL CDB and we will close this PDB from ORCL to MYCDB.
Execute below command on ORCL:
[oracle@ocm12c datafile]$ . oraenv ORACLE_SID = [orcl] ? The Oracle base remains unchanged with value /u01/app/oracle [oracle@ocm12c datafile]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Sat Aug 22 16:25:22 2020 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> create user dblink_user identified by oracle;^C SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDBORCL MOUNTED 4 SALESPDB MOUNTED 5 PDBTEST MOUNTED 6 PDBONE MOUNTED 7 PDBNODATA READ WRITE NO SQL> alter session set container=PDBNODATA; Session altered. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 7 PDBNODATA READ WRITE NO SQL> create table john.move (id number); Table created. SQL> insert into john.move values (10); 1 row created. SQL> commit; Commit complete. SQL> create user dblink_user identified by oracle; User created. SQL> grant connect, resource, create pluggable database to dblink_user; Grant succeeded.
Execute below command on MYCDB:
[oracle@ocm12c ~]$ . oraenv ORACLE_SID = [oracle] ? mycdb The Oracle base has been set to /u01/app/oracle [oracle@ocm12c ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Sat Aug 22 15:59:36 2020 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 MYPDBT READ WRITE NO SQL> alter system register; System altered. LSNRCTL> status Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ocm12c.localdomain)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 12.1.0.2.0 - Production Start Date 22-AUG-2020 16:04:03 Uptime 0 days 0 hr. 34 min. 5 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/ocm12c/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ocm12c.localdomain)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=ocm12c.localdomain)(PORT=5500))(Security=(my_wallet_directory=/u01/app/oracle/admin/orcl/xdb_wallet))(Presentation=HTTP)(Session=RAW)) Services Summary... Service "mycdb" has 1 instance(s). Instance "mycdb", status READY, has 1 handler(s) for this service... Service "mycdbXDB" has 1 instance(s). Instance "mycdb", status READY, has 1 handler(s) for this service... Service "mypdbt" has 1 instance(s). Instance "mycdb", status READY, has 1 handler(s) for this service... Service "orcl.localdomain" has 1 instance(s). Instance "orcl", status READY, has 1 handler(s) for this service... Service "orclXDB.localdomain" has 1 instance(s). Instance "orcl", status READY, has 1 handler(s) for this service... Service "pdbnodata.localdomain" has 1 instance(s). Instance "orcl", status READY, has 1 handler(s) for this service... Service "pdbone.localdomain" has 1 instance(s). Instance "orcl", status READY, has 1 handler(s) for this service... Service "pdborcl.localdomain" has 1 instance(s). Instance "orcl", status READY, has 1 handler(s) for this service... Service "pdbtest.localdomain" has 1 instance(s). Instance "orcl", status READY, has 1 handler(s) for this service... Service "salespdb.localdomain" has 1 instance(s). Instance "orcl", status READY, has 1 handler(s) for this service... The command completed successfully PDBNODATA = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = ocm12c.localdomain)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pdbnodata.localdomain) ) ) [oracle@ocm12c admin]$ tnsping PDBNODATA TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 22-AUG-2020 16:44:44 Copyright (c) 1997, 2014, Oracle. All rights reserved. Used parameter files: /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/sqlnet.ora Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = ocm12c.localdomain)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pdbnodata.localdomain))) OK (0 msec) SQL> select name from v$database; NAME --------- MYCDB SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> create database link dblink_pdbnodata connect to dblink_user identified by oracle using 'pdbnodata'; Database link created. SQL> select sysdate from dual@dblink_pdbnodata; SYSDATE --------- 22-AUG-20 SQL> create pluggable database pdbclone from pdbnodata@dblink_pdbnodata; Pluggable database created. SQL> show parameter db_create_file_dest NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_create_file_dest string /u02/oradata SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 MYPDBT READ WRITE NO 4 PDBCLONE MOUNTED SQL> alter pluggable database pdbclone open; Pluggable database altered. SQL> alter session set container=pdbclone; Session altered. SQL> select * from john.move; ID ---------- 10 SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u02/oradata/MYCDB/datafile/o1_mf_undotbs1_hn2xz0ck_.dbf /u02/oradata/MYCDB/AD7E855251A11CBDE053DC38A8C00CE6/datafile/o1_mf_system_hn31fsgq_.dbf /u02/oradata/MYCDB/AD7E855251A11CBDE053DC38A8C00CE6/datafile/o1_mf_sysaux_hn31fsgq_.dbf /u02/oradata/MYCDB/AD7E855251A11CBDE053DC38A8C00CE6/datafile/o1_mf_tbstest_hn31fsgq_.dbf
Clone a PDB from non-CDB:
[oracle@ocm12c datafile]$ . oraenv ORACLE_SID = [orcl] ? noncdb The Oracle base remains unchanged with value /u01/app/oracle [oracle@ocm12c datafile]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Sat Aug 22 17:36:50 2020 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> select cdb from v$database; CDB --- NO SQL> create user dblink_user identified by oracle; User created. SQL> create table tbl_noncdb (id number); Table created. SQL> insert into tbl_noncdb values(10); 1 row created. SQL> commit; Commit complete. SQL> grant dba to dblink_user; Grant succeeded. SQL> alter system register; System altered.
NONCDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = ocm12c.localdomain)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = noncdb) ) ) [oracle@ocm12c admin]$ tnsping NONCDB TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 22-AUG-2020 17:44:10 Copyright (c) 1997, 2014, Oracle. All rights reserved. Used parameter files: /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/sqlnet.ora Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = ocm12c.localdomain)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = noncdb))) OK (10 msec) [oracle@ocm12c ~]$ . oraenv ORACLE_SID = [noncdb] ? mycdb The Oracle base remains unchanged with value /u01/app/oracle [oracle@ocm12c ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Sat Aug 22 17:36:18 2020 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> select cdb from v$database; CDB --- YES SQL> create database link dblink_noncdb connect to dblink_user identified by oracle using 'noncdb'; Database link created. SQL> select name from v$database@dblink_noncdb; NAME --------- NONCDB SQL> select sysdate from dual@dblink_noncdb; SYSDATE --------- 22-AUG-20 SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 MYPDBT READ WRITE NO 4 PDBCLONE READ WRITE NO SQL> create pluggable database pdbclone1 from NON$CDB@dblink_noncdb; Pluggable database created. SQL> alter pluggable database PDBCLONE1 open; Warning: PDB altered with errors. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 MYPDBT READ WRITE NO 4 PDBCLONE READ WRITE NO 5 PDBCLONE1 READ WRITE YES SQL> startup force ORACLE instance started. Total System Global Area 2516582400 bytes Fixed Size 2927528 bytes Variable Size 671089752 bytes Database Buffers 1828716544 bytes Redo Buffers 13848576 bytes Database mounted. Database opened. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 MYPDBT MOUNTED 4 PDBCLONE MOUNTED 5 PDBCLONE1 MOUNTED SQL> alter session set container=PDBCLONE1; Session altered. SQL> @$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql SQL> SET SERVEROUTPUT ON SQL> SET FEEDBACK 1 SQL> SET NUMWIDTH 10 SQL> SET LINESIZE 80 SQL> SET TRIMSPOOL ON SQL> SET TAB OFF SQL> SET PAGESIZE 100 SQL> SQL> WHENEVER SQLERROR EXIT; ... ... SQL> BEGIN 2 execute immediate '&open_sql &restricted_state'; 3 EXCEPTION 4 WHEN OTHERS THEN 5 BEGIN 6 IF (sqlcode <> -900) THEN 7 RAISE; 8 END IF; 9 END; 10 END; 11 / PL/SQL procedure successfully completed. SQL> SQL> SQL> WHENEVER SQLERROR CONTINUE; SQL> SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 5 PDBCLONE1 MOUNTED SQL> conn / as sysdba Connected. SQL> alter pluggable database PDBCLONE1 open; Pluggable database altered. SQL> alter session set container=PDBCLONE1; Session altered. SQL> select * from tbl_noncdb; ID ---------- 10 1 row selected.
Clone a non-CDB using DBMS_PDB Package to CDB:
NEWDB is a Non-CDB database. We will clone this database (NEWDB) to CDB (MYCDB) using DBMS_PDB. Run DBMS_PDB.DESCRIBE package on NEWDB to generate the xml file of this non-cdb database.
SQL> select name, cdb from v$database; NAME CDB --------- --- NEWDB NO SQL> BEGIN DBMS_PDB.DESCRIBE( pdb_descr_file => '/u02/oradata/NONCDB/noncdb.xml'); END; / PL/SQL procedure successfully completed. SQL> SQL> create table t12(id number); Table created.
Run Below command on MYCDB to check the compatibility.
SQL> conn / as sysdba Connected. SQL> SET SERVEROUTPUT ON SQL> DECLARE compatible CONSTANT VARCHAR2(3) := CASE DBMS_PDB.CHECK_PLUG_COMPATIBILITY( pdb_descr_file => '/u02/oradata/NONCDB/noncdb.xml', pdb_name => 'newdb') WHEN TRUE THEN 'YES' ELSE 'NO' END; BEGIN DBMS_OUTPUT.PUT_LINE(compatible); END; / YES PL/SQL procedure successfully completed.
Create Pluggable database using the created xml from non-cdb.
SQL> alter session set db_create_file_dest='/u02/oradata/MYCDB/datafile' ; Session altered. SQL> CREATE PLUGGABLE DATABASE newdb USING '/u02/oradata/NONCDB/noncdb.xml' COPY USER_TABLESPACES=('USERS'); Pluggable database created. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 MYPDBT MOUNTED 4 PDBCLONE MOUNTED 5 PDBCLONE1 READ WRITE NO 6 NEWDB MOUNTED SQL> alter session set container=newdb; Session altered. SQL> @$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql SQL> alter pluggable database newdb open; Pluggable database altered. SQL> alter session set container=newdb; Session altered. SQL> select * from tbl_noncdb; ID ---------- 10 1 row selected. SQL> select * from t12; select * from t12 * ERROR at line 1: ORA-00942: table or view does not exist
Plugging In an Unplugged PDB from one CDB to another CDB in Same Server:
Prerequisites before plugging in an unplugged PDB:
We have two CDB (ORCL and MYCDB) databases in a server. We will unplugged PDB (PDBONE) from ORCL and will plugging to MYCDB.
[oracle@ocm12c ~]$ . oraenv ORACLE_SID = [oracle] ? orcl The Oracle base has been set to /u01/app/oracle [oracle@ocm12c ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Sun Aug 23 16:39:27 2020 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to an idle instance. SQL> startup ORACLE instance started. Total System Global Area 1660944384 bytes Fixed Size 2925072 bytes Variable Size 989859312 bytes Database Buffers 654311424 bytes Redo Buffers 13848576 bytes Database mounted. Database opened. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 4 SALESPDB MOUNTED 5 PDBTEST MOUNTED 6 PDBONE MOUNTED 7 PDBNODATA MOUNTED SQL> alter pluggable database pdbone open; Pluggable database altered. SQL> alter session set container=pdbone; Session altered. SQL> create table tbl_plggin(id number); Table created. SQL> insert into tbl_plggin values (10); 1 row created. SQL> commit; Commit complete. SQL> alter pluggable database pdbone close; Pluggable database altered. SQL> conn / as sysdba Connected. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 4 SALESPDB MOUNTED 5 PDBTEST MOUNTED 6 PDBONE MOUNTED 7 PDBNODATA MOUNTED SQL> alter pluggable database pdbone unplug into '/u02/oradata/backup/pdbone.xml'; Pluggable database altered. SQL> drop pluggable database pdbone keep datafiles; Pluggable database dropped.
Run DBMS_PDB.check_plug_compatibility function and provide the name of PDB and the XML file to see if the PDB can be plugged to this CDB:
[oracle@ocm12c ~]$ . oraenv ORACLE_SID = [mycdb] ? The Oracle base remains unchanged with value /u01/app/oracle [oracle@ocm12c ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Sun Aug 23 18:17:51 2020 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 4 PDBCLONE MOUNTED 5 PDBCLONE1 MOUNTED 6 NEWDB MOUNTED 7 PDBPLAG MOUNTED SQL> set serveroutput on DECLARE compatible BOOLEAN := FALSE; BEGIN compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(pdb_descr_file => '/u02/oradata/backup/pdbone.xml',pdb_name=>'pdbpluggin'); if compatible then DBMS_OUTPUT.PUT_LINE('compatible'); else DBMS_OUTPUT.PUT_LINE('incompatible'); end if; END; / compatible PL/SQL procedure successfully completed. SQL> show parameter db_create_file_dest NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_create_file_dest string /u02/oradata SQL> create pluggable database pdbpluggin using '/u02/oradata/backup/pdbone.xml'; Pluggable database created. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDBPLUGGIN MOUNTED 4 PDBCLONE MOUNTED 5 PDBCLONE1 MOUNTED 6 NEWDB MOUNTED 7 PDBPLAG MOUNTED SQL> alter session set container=PDBPLUGGIN; Session altered. SQL> alter pluggable database PDBPLUGGIN open; Pluggable database altered. SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u02/oradata/MYCDB/datafile/o1_mf_undotbs1_hn2xz0ck_.dbf /u02/oradata/MYCDB/AD6DDF0DEC2C01EBE053DC38A8C05C8A/datafile/o1_mf_system_hn668c yv_.dbf /u02/oradata/MYCDB/AD6DDF0DEC2C01EBE053DC38A8C05C8A/datafile/o1_mf_sysaux_hn668c yy_.dbf /u02/oradata/MYCDB/AD6DDF0DEC2C01EBE053DC38A8C05C8A/datafile/o1_mf_tbstest_hn668 cyy_.dbf SQL> select * from tbl_plggin; ID ---------- 10
Note: You are good to delete files from source pdb database’s location.
Plugging In an Unplugged PDB from one CDB to another CDB in Different Server:
Drop a PDB (Pluggable Database):
When dropping a PDB, you can either keep or delete the PDB’s data files by using one of the following clauses:
KEEP DATAFILES, the default, retains the data files. The PDB’s temp file is removed even when KEEP DATAFILES is specified because the temp file is no longer needed. When KEEP DATAFILES is specified, the PDB must be unplugged.
INCLUDING DATAFILES removes the data files from disk. If a PDB was created with the SNAPSHOT COPY clause, then you must specify INCLUDING DATAFILES when you drop the PDB.
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 MYPDBT READ WRITE NO 4 PDBCLONE READ WRITE NO 5 PDBCLONE1 MOUNTED SQL> drop pluggable database pdbclone1 including datafiles; Pluggable database dropped.
For details, check oracle documents -> 38 Creating and Removing PDBs with SQL*Plus -> 38.5.2 Plugging In an Unplugged PDB