===== 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.