This is an old revision of the document!
Overview
Multitenancy is a new concept in Oracle 12c. The basis of it is that, you can separate the application data from the system data. Up to and including 11g, all the data in the database was residing in the same dimension as the system data or any other data for that matter. Data related to different application, were in the same tablespaces or even managed by the same user. Well, from 12c, all this can go under the table, now you can have many databases PDBs (pluggable databases), inside one big database, the root container. There are even more possibilities like application containers and so on, but we will see that later.
With the multi-tenancy, we have a:
- root container - Where the system data resides. Also you can choose if you want the UNDO tablespace in the root to be used for all PDBs, or each PDB to have its own undo, SYSTEM and SYSAUX tablespace, making it completely independent from the root container.
- Application Container - Container which consist of 1 or many PDBs which host a specific application. We are able to assign versions and name to such container, furthermore we can initiate installation and upgrade modes.
Creation
Firstly, we need to create our container. From 12c, we can create a database to be either as it always has been, a normal database, OR we can create it to allow other databases as well. So it will be a container, let's see how we can do both:
Create Normal DB
Actually, the creation of a normal database isn't that hard, you can just type:
Create simple database
SQL> Create database;
Simply that, will create us a normal database, well after that you will have to run the catproc and the catalog scripts, but you get the gist.
Create container DB
To create a container, database we NEED to allow it to have PLUGGABLE databases, as follows:
Create CDB
SQL> CREATE DATABASE CDB1 ENABLE PLUGGABLE DATABASE SEED FILE_NAME_CONVERT = ('/loc1/data','/loc2/data');
That will create us a container database called CDB1 and a SEED, after that you will have to run script:
@$ORACLE_HOME/rdbms/admin/catcdb.sql
But other than that, all will be ok. So we have a container, big deal, what then. Well, now we can create PLUGGABLE databases as follows:
Create Pluggable DB (PDB)
As I said before, pluggable databases, are totally separate databases from one another. Imagine it having many databases (PDBs) within one big database (CDB). These PDBs, can have separate user totally individual from each other. So let's see how it is done:
Create PDB
CREATE PLUGGABLE DATABASE pdb2 ADMIN USER pdb_adm IDENTIFIED BY Password1 FILE_NAME_CONVERT=('/u01/app/oracle/oradata/cdb1/pdbseed/','/u01/app/oracle/oradata/cdb1/pdb2/');
You can use either:
- FILE_NAME_CONVERT, or
- CREATE_FILE_DEST, or
- PDB_FILE_NAME_CONVERT
Either in the session level or on the CREATE statement, up to you, the result will be the same.
Once created, you can list all PDBs in a certain CDB as follows:
List PDBs
COLUMN pdb_name FORMAT A20 SELECT pdb_name, status FROM dba_pdbs ORDER BY pdb_name; PDB_NAME STATUS -------------------- ------------- PDB$SEED NORMAL PDB1 NORMAL PDB2 NEW PDB3 NEW COLUMN name FORMAT A20 SELECT name, open_mode FROM v$pdbs ORDER BY name; NAME OPEN_MODE ------------------------------ ---------- PDB$SEED READ ONLY PDB1 MOUNTED PDB2 MOUNTED PDB3 MOUNTED
Remember, 1 PDB can be in only 1 ROOT$CDB, but 1 CDB can have many PDBs. Furthermore, from 12.2, we have also applicational containers, which are containers within the CDB, but we will speak about them in a second.
Management
We can perform several actions with a PDB:
- OPEN
- Plug & Unplig
- Close
- Restore / Recover
Open
After we create a CDB, we need to open it, as follows:
Open PDB
SQL> ALTER PLUGGABLE DATABASE pdb2 OPEN;
That command, will open us a database and it will become available to the users. We can also close a pluggable database as follows:
Close PDB
ALTER PLUGGABLE DATABASE pdb2 CLOSE;
Unplug a PDB
In 12.1 we could unplug a PDB into .xml file and the migration of the PDB, would be the migration of that XML file AND the relevant database files. From 12.2 we can also unplug the PDB into a .pdb archive file, which contains information about the PDB AND the relevant database files. That will ease our migration.
Unplug to .pdb file
export ORAENV_ASK=NO export ORACLE_SID=cdb3 . oraenv export ORAENV_ASK=YES sqlplus / as sysdba ALTER PLUGGABLE DATABASE pdb5 CLOSE; ALTER PLUGGABLE DATABASE pdb5 UNPLUG INTO '/u01/pdb5.pdb';
That assumes, you are using OMF file. The resulting file contains all the necessary data:
List .pdb file
HOST ls -al /u01/pdb5.pdb -rw-r--r--. 1 oracle oinstall 161702502 Jan 7 21:01 /u01/pdb5.pdb SQL>
Plug a PDB
To plug a database, we need the file from above and we need to verify the compatibility as follows:
Plug a PDB
SET SERVEROUTPUT ON DECLARE l_result BOOLEAN; BEGIN l_result := DBMS_PDB.check_plug_compatibility( pdb_descr_file => '/u01/pdb5.pdb', pdb_name => 'pdb5'); IF l_result THEN DBMS_OUTPUT.PUT_LINE('compatible'); ELSE DBMS_OUTPUT.PUT_LINE('incompatible'); END IF; END; / compatible PL/SQL procedure successfully completed. SQL>
Create a PDB using the source file
Then we can create a PDB using the .pdb file as follows:
Plug-in PDB
CREATE PLUGGABLE DATABASE pdb5 USING '/u01/pdb5.pdb'; ALTER PLUGGABLE DATABASE pdb5 OPEN READ WRITE; SELECT name, open_mode FROM v$pdbs ORDER BY name; NAME OPEN_MODE ------------------------------ ---------- PDB$SEED READ ONLY PDB5 READ WRITE SQL>