Oracle 12c introduit l'option payante "Multitenant".
Grace a cette option, une instance Oracle peut héberger plusieurs bases.
En jargon Oracle, une CDB (Container Database) peut contenir plusieurs PDBs (Pluggable Databases).
Les avantages mis en avant sont :
Remarque : l'accès aux metadata des objets Oracle depuis une PDB se fait par des pointeurs internes vers les metadatas de la CDB.
Le parametre d'initialisation ENABLE_PLUGGABLE_DATABASE doit etre positionne à TRUE (il est à FALSE par défaut)
Par dbca : cocher la case "Créer en tant que base de données de conteneur".
Par script SQL : ajouter la clause "ENABLE PLUGGABLE DATABASE"
La clause "SEED FILE_NAME_CONVERT (...)" permet de définir où seront créés les fichiers de la Seed PDB.
Sinon, il est possible d'utiliser le nouveau paramètre d'initialisation PDB_FILE_NAME_CONVERT qui a le même effet.
Un script chapeau nommé ?/rdbms/admin/catcdb.sql permet de créer toutes les vues du dictionnaire des données (il inclut catalog, catporc, etc).
Le compte de la clause "ADMIN USER" est obligatoire. Il recoit le role PDB_DBA.
Les parametres DB_CREATE_FILE_DEST et PDB_CREATE_FILE_DEST ont une influence sur la creation de la PDB en absence d'indication dans la clause CREATE PLUGGABLE DATABASE.
Par défaut, une pluggable database est fermée (mode MOUNT) après un startup de la CDB.
Pour garder une pluggable database toujours OPEN après un startup de la CDB, il faut utiliser :
Pour garder une base toujours fermée, il faut :
Mettre la base en READ ONLY est générer un fichier XML
Créer la PDB
Migrer la base en PDB (les tablespace SYSTEM est purgé)
Ouvrir la PDB
Fermer la base à cloner pluis l'ouvrir en read only
Créer la PDB
Ouvrir la PDB
Réouvrir la base initiale
Fermer la PDB et la dépluger
Vérifier la compatibilité et pluger la PDB
Ouvrir la nouvelle PDB
Par défaut, c'est "KEEP DATAFILES", les fichiers ne sont pas supprimés.
Connexion à une CDB :
Connexion à une PDB :
Autre possibilité pour un utilisateur global ayant les privilege "SET CONTAINER" :
Remarque : il existe des nouveaux triggers BEFORE/AFTER SET CONTAINER ON PLUGGABLE DATABASE.
Une CDB contient :
Une PDB contient :
Le fichier de controle de la CDB est mis à jour pour refléter les datafiles des PDBs.
Les fichiers redologs contiennent en interne l'identifiant de la PDB pour chaque transaction.
Le mode archivelog est partagé par toutes les PDBs
Une seul tablespace UNDO existe pour toutes les PDBs
Une CDB peut contenir des utilisateurs et roles globaux (SYS, SYSTEM, etc)
Une PDB contient les utilisateurs et roles locaux
On peut accorder des privilèges de manière globale sur toutes les PDBs.
Remarques : Les vues du dictionnaire de données DBA_USERS, DBA_ROLES, DBA_ROLE_PRIVS, DBA_SYS_PRIVS et DBA_TAB_PRIVS
contiennent une nouvelle colonne COMMON (YES/NO) qui indique si l'utilisateur / le role / le privilège est global ou pas.
Il existe un Resource Manager pour chaque PDB et un Resource Manager pour la CDB.
Le dictionnaire de données des PDB contient :
Cette séparation du dictionnaire de données permet :
La CDB contient des nouvelles vues CDB_% qui permettent d'avoir des informations à travers toutes les PDBs.
La meme vue CDB_% existe dans les PDBs mais donne des données restreintes à la PDB en cours, ce qui fait que c'est équivalent à intérroger la vue DBA_%.
Ces vues CDB_% contiennent une colonne CON_ID. Ainsi, CDB_OBJECTS donne la liste de tous les objets sur toutes les PDBs.
Les vues V$ retournent les mêmes informations pour une PDB que pour une base non-CDB. Ces vues contiennent une nouvelle colonne CON_ID.
Sur une CDB, les vues V$ retournent les données pour l'ensemble des containers.
Les vues CDB_% ne sont accessibles que depuis la CDB.
La colonnes CON_ID est le CONTAINER ID et a pour significations :
Création d'une CDB
CREATE DATABASE CDB
DATAFILE ...
SYSAUX DATAFILE ...
DEFAULT TEMPORARY TABLESPACE ...
UNDO TABLESPACE ...
CHARACTER SET ...
LOGFILE ...
USER SYS IDENTIFIED BY ...
ENABLE PLUGGABLE DATABASE
SEED FILE_NAME_CONVERT = ('/data/CDB', '/data/CDB/pdbseed')
;
Création d'une PDB
Méthode 1 : Création d'une PDB depuis la SEED PDB
CREATE PLUGGABLE DATABASE PDB01
ADMIN USER PDBADMIN IDENTIFIED BY "manager"
[ FILE_NAME_CONVERT = ('/data/CDB/pdbseed', '/data/CDB/PDB01')
| CREATE_FILE_DEST = '/data/CDB/PDB01'
];
ALTER PLUGGABLE DATABASE PDB01 OPEN;
ALTER PLUGGABLE DATABASE PDB01 SAVE STATE;
ALTER PLUGGABLE DATABASE PDBTEST CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE PDBTEST SAVE STATE;
Méthode 2 : Création d'une PDB depuis une base 12c non-CDB
ALTER DATABASE OPEN READ ONLY;
EXECUTE DBMS_PDB.DESCRIBE('/data/CDB/PDB01/PDB01_desc.xml');
CREATE PLUGGABLE DATABASE PDB01
USING '/data/CDB/PDB01/PDB01_desc.xml';
connect SYS/PDB01 as SYSDBA;
@?/rdbms/admin/noncdb_to_pdb.sql
ALTER PLUGGABLE DATABASE PDB01 OPEN;
Méthode 3 : Cloner une PDB
ALTER PLUGGABLE DATABASE PDB01 CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE PDB01 OPEN READ ONLY;
CREATE PLUGGABLE DATABASE PDB02
FROM PDB01
[ FILE_NAME_CONVERT = ('/data/CDB/PDB01','/data/CDB/PDB02')
| CREATE_FILE_DEST = '/data/CDB/PDB02'
];
ALTER PLUGGABLE DATABASE PDB02 OPEN;
ALTER PLUGGABLE DATABASE PDB01 CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE PDB01 OPEN;
Méthode 4 : Unplug + Plug d'une PDB provenant d'une autre CDB
ALTER PLUGGABLE DATABASE PDB01 CLOSE;
ALTER PLUGGABLE DATABASE PDB01 UNPLUG INTO '/data/CDB/PDB01/PDB01_plug.xml';
declare
result boolean;
begin
result := DBMS_PDB.CHECK_PLUG_COMPATIBILITY('/data/CDB/PDB01/PDB01_plug.xml','PDB03');
end;
/
Procedure PL/SQL terminee avec succes.
! mkdir /data/CDB/PDB03
! mv /data/CDB/PDB01 /data/CDB/PDB03
DROP PLUGGABLE DATABASE PDB01;
Base de donnees pluggable supprimee.
! rm /data/CDB/PDB03/temp01.dbf
CREATE PLUGGABLE DATABASE PDB03 USING '/data/CDB/PDB01/PDB01_plug.xml'
MOVE FILE_NAME_CONVERT = ('/data/CDB/PDB01','/data/CDB/PDB03');
Base de donnees pluggable creee.
ALTER PLUGGABLE DATABASE PDB03 OPEN;
select CON_ID, NAME, OPEN_MODE from V$CONTAINERS;
CON_ID NAME OPEN_MODE
---------- ------------------------------ ----------
1 CDB$ROOT READ WRITE
2 PDB$SEED READ ONLY
3 PDB03 READ WRITE
4 PDB02 READ WRITE
Limiter la taille d'une PDB
CREATE PLUGGABLE DATABASE ...
[ STORAGE (
MAXSIZE 32G
[, MAX_SHARED_TEMP_SIZE 8G ]
)
];
Suppression d'une PDB
ALTER PLUGGABLE DATABASE PDB01 CLOSE;
DROP PLUGGABLE DATABASE PDB01
[ INCLUDING DATAFILES ];
Connexion
SQL> connect SYS/manager@vmoracle01:1521/CDB.DATALBI.COM as sysdba
Connecte.
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> show con_id
CON_ID
------------------------------
1
SQL> connect SYS/manager@vmoracle01:1521/PDB01.DATALBI.COM as sysdba
Connecte.
SQL> show con_name
CON_NAME
------------------------------
PDB01
SQL> show con_id
CON_ID
------------------------------
3
SQL> ALTER SESSION SET CONTAINER = PDB01;
SQL> ALTER SESSION SET CONTAINER = PDB02;
-- pas de trigger logon activé
-- toute transaction ouverte reste active
Différences entre CDB et PDB
Fichiers et tablespaces
Utilisateurs, Roles et Privilèges Globaux
- il est possible de créer des users globaux, ils doivent être préfixés par C##
- il est possible de créer des roles globaux, ils doivent être préfixés par C##
- les privileges peuvent être accordés de manière globale
CREATE USER C##COMMONUSER IDENTIFIED BY common CONTAINER = ALL;
CREATE ROLE C##COMMONROLE CONTAINER = ALL;
GRANT C##COMMONROLE TO C##COMMONUSER CONTAINER = ALL;
Resource Manager Plan
Dictionnaire de données
SQL> desc CDB_OBJECTS
Nom NULL ? Type
----------------------------------------- -------- ----------------------------
OWNER VARCHAR2(128)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(128)
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(23)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
NAMESPACE NUMBER
EDITION_NAME VARCHAR2(128)
SHARING VARCHAR2(13)
EDITIONABLE VARCHAR2(1)
ORACLE_MAINTAINED VARCHAR2(1)
CON_ID NUMBER
Paramètres d'initialisation
Vues du dictionnaire de données
SQL> select NAME, CDB, CON_ID from V$DATABASE;
NAME CDB CON_ID
--------- --- ----------
CDB YES 0
SQL> select CON_ID, NAME, OPEN_MODE from V$PDBS;
CON_ID NAME OPEN_MODE
---------- ------------------------------ ----------
2 PDB$SEED READ ONLY
3 PDB01 READ WRITE
SQL> select CON_ID, DBID, NAME, OPEN_MODE from V$CONTAINERS order by CON_ID;
CON_ID DBID NAME OPEN_MODE
---------- ---------- ------------------------------ ----------
1 2011510676 CDB$ROOT READ WRITE
2 917321299 PDB$SEED READ ONLY
3 1619819896 PDB01 READ WRITE
4 4113159335 PDB02 READ WRITE
Les statuts d'une CDB et PDB
Commande | Statut CDB | Statut PDB |
---|---|---|
connect / as sysdba startup nomount; |
STARTED | nothing |
alter database CDB mount; | MOUNTED | MOUNTED |
alter database CDB open; | READ WRITE | MOUNTED |
alter pluggable database all open; | READ WRITE | READ WRITE |
alter pluggable database all open restricted; | READ WRITE | READ WRITE |
alter pluggable database all read only; | READ WRITE | READ ONLY |
alter pluggable database PDB01 close immediate; OU connect sys/pw@PDB01 as sysdba shutdown immediate; |
READ WRITE | MOUNTED |
Conserver l'etat au redémarrage :
ALTER PLUGGABLE DATABASE PDB01 SAVE STATE;
Annuler l'etat au redémarrage :
ALTER PLUGGABLE DATABASE PDB01 DISCARD STATE;
Changements sans redémarrage :
Changer le statut d'un datafile
ALTER PLUGGABLE DATABASE DATAFILE '/data/CDB/PDB01/user01.dbf' OFFLINE;
Changer le tablespace par defaut
ALTER PLUGGABLE DATABASE DEFAULT TABLESPACE USERS; ALTER PLUGGABLE DATABASE DEFAULT TEMPORARY TABLESPACE TEMP;
Changer la taille limite d'une PDB
ALTER PLUGGABLE DATABASE STORAGE( MAXSIZE 10G );
Changer le global name
ALTER PLUGGABLE DATABASE RENAME GLOBAL NAME TO PDB01;
Il existe un seul spfile, c'est celui de la CDB.
Les parametres de la CDB servent de valeur par défaut pour les PDB
Il est possible d'ajuster certains parametres pour une PDB (ISPDB_MODIFIABLE = TRUE dans V$PARAMETER)
Les parametres ajustés d'une PDB sont enregistrés dans son dictionnaire et sont transportés lors d'un UNPLUG/PLUG.
-- Liste des parametres modifiables pour une PDB SELECT NAME FROM V$PARAMETER WHERE ISPDB_MODIFIABLE = 'TRUE' ORDER BY NAME; NAME -------------------------------------------------------------------------------- asm_diskstring cell_offload_compaction cell_offload_decryption cell_offloadgroup_name cell_offload_parameters ... temp_undo_enabled timed_os_statistics timed_statistics workarea_size_policy xml_db_events 182 lignes selectionnees. -- Modification d'un parametre sur PDB02 SQL> connect sys/manager@vmoracle01.datalbi.com:1521/PDB02.DATALBI.COM as sysdba Connecte. SQL> alter system set open_cursors = 500 scope = both; Systeme modifie. SQL> connect / as sysdba Connecte. SQL> select NAME, VALUE from V$SYSTEM_PARAMETER where CON_ID = 4; NAME VALUE ------------------------------ ---------------------------------------- resource_manager_plan db_securefile PREFERRED open_cursors 500 SQL> select PDB_UID, NAME, VALUE$ from pdb_spfile$; PDB_UID NAME VALUE$ ---------- ------------------------------ --------------- 917321299 db_securefile 'PREFERRED' 4113159335 open_cursors 500 4113159335 db_securefile 'PREFERRED' 3077534603 db_securefile 'PREFERRED'