===== Multitenant Architecture =====
==== Advantages ====
* Database Consolidation
* Reduced Costs
* Rapid Implementation
* Simplified Management
* Separation of Duties
* Simplified Tuning
* Simplified Patching
==== Creating a CDB ====
Create spfile setting parameter ENABLE_PLUGGABLE_DATABASES = TRUE\\
Create instance by specifying STARTUP NOMOUNT\\
Create database using CREATE DATABASE command, adding new clause ENABLE_PLUGGABLE_DATABASES. \\
If you are not using OMF you must either ... \\
Use the SEED FILE_NAME_CONVERT option or set PDB_FILE_NAME_CONVERT in spfile \\
Connect to root and run scripts to create data dictionary\\
==== Opening / Closing Pluggable Databases ====
SQL> alter session set container = pdb2;
Session altered.
SQL> shutdown
Pluggable Database closed.
SQL> startup
Pluggable Database opened.
SQL> alter pluggable database pdb2 close;
Pluggable database altered.
SQL> alter pluggable database pdb2 open;
Pluggable database altered.
I think it always safer to use the "alter pluggable" command so you definitely know which database you are closing.
Sometimes you may get an error when opening a pluggable database
SQL> alter pluggable database pdb2 open;
Warning: PDB altered with errors.
The "show pdbs" reveals that pluggable database pdb2 has been opened in restricted mode.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 READ WRITE YES
Use the view PDB_PLUG_IN_VIOLATIONS to see what the error is.\\
The full error message is not always written to the Alert Log.
select time, message from pdb_plug_in_violations;
TIME MESSAGE
------------------------- --------------------------------------------------------------------------------
28-JUL-15 08.59.31.507182 Sync PDB failed with ORA-959 during 'CREATE USER c##ian IDENTIFIED BY *DEFAULT T
ABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" container = all'
In the above case I had forgotten to create the tablespace users in database pdb2.
==== Unplugging a PDB ====
SQL> alter session set container=pdb2;
Session altered.
SQL> shutdown immediate;
Pluggable Database closed.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
4 PDB2 MOUNTED
SQL> conn / as sysdba
Connected.
SQL> alter pluggable database pdb2 unplug into '/home/oracle/pdb2.xml';
Pluggable database altered.
SQL> select pdb_name, status from dba_pdbs;
PDB_NAME STATUS
--------------- ---------
PDB$SEED NORMAL
PDB1 NORMAL
PDB2 UNPLUGGED
SQL> drop pluggable database pdb2;
Pluggable database dropped.
==== Plugging In an Unplugged PDB ====
For this example I will simply plug back in the database that was dropped from above.\\
If I was moving the PDB to a new location on the server I would need to use the 'copy' parameter at the end of the command.
SQL> create pluggable database pdb3 using '/home/oracle/pdb2.xml';
Pluggable database created.
The database is in MOUNTED mode and must be opened after it has been created.\\
The Service Name was created automatically when the PDB was plugged in.