Datalbi  
Créé le 19/12/2015 par Laurent Bourcier

Oracle 12c Multitenant Architecture

Introduction
Création d'une CDB
Création d'une PDB
Suppression d'une PDB
Connexion
Différence entre PDB et CDB
Parametres d'initialisation
Vues du dictionnaire de données
Les statuts d'une CDB et PDB
Modifier la configuration d'une PDB
Stockage des parametres CDB et PDB

Introduction

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.

Création d'une 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"

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')
;

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

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;

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 :

ALTER PLUGGABLE DATABASE PDB01 SAVE STATE;

Pour garder une base toujours fermée, il faut :

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

Mettre la base en READ ONLY est générer un fichier XML

ALTER DATABASE OPEN READ ONLY;
EXECUTE DBMS_PDB.DESCRIBE('/data/CDB/PDB01/PDB01_desc.xml');

Créer la PDB

CREATE PLUGGABLE DATABASE PDB01
USING '/data/CDB/PDB01/PDB01_desc.xml';

Migrer la base en PDB (les tablespace SYSTEM est purgé)

connect SYS/PDB01 as SYSDBA;
@?/rdbms/admin/noncdb_to_pdb.sql

Ouvrir la PDB

ALTER PLUGGABLE DATABASE PDB01 OPEN;

Méthode 3 : Cloner une PDB

Fermer la base à cloner pluis l'ouvrir en read only

ALTER PLUGGABLE DATABASE PDB01 CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE PDB01 OPEN READ ONLY;

Créer la PDB

CREATE PLUGGABLE DATABASE PDB02
FROM PDB01
[ FILE_NAME_CONVERT = ('/data/CDB/PDB01','/data/CDB/PDB02')
 | CREATE_FILE_DEST = '/data/CDB/PDB02'
];

Ouvrir la PDB

ALTER PLUGGABLE DATABASE PDB02 OPEN;

Réouvrir la base initiale

ALTER PLUGGABLE DATABASE PDB01 CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE PDB01 OPEN;

Méthode 4 : Unplug + Plug d'une PDB provenant d'une autre CDB

Fermer la PDB et la dépluger

ALTER PLUGGABLE DATABASE PDB01 CLOSE;
ALTER PLUGGABLE DATABASE PDB01 UNPLUG INTO '/data/CDB/PDB01/PDB01_plug.xml';

Vérifier la compatibilité et pluger la PDB

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.

Ouvrir la nouvelle PDB

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 ];

Par défaut, c'est "KEEP DATAFILES", les fichiers ne sont pas supprimés.

Connexion

Connexion à une CDB :

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

Connexion à une PDB :

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

Autre possibilité pour un utilisateur global ayant les privilege "SET CONTAINER" :

SQL> ALTER SESSION SET CONTAINER = PDB01;
SQL> ALTER SESSION SET CONTAINER = PDB02;
-- pas de trigger logon activé
-- toute transaction ouverte reste active

Remarque : il existe des nouveaux triggers BEFORE/AFTER SET CONTAINER ON PLUGGABLE DATABASE.

Différences entre CDB et PDB

Fichiers et tablespaces

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

Utilisateurs, Roles et Privilèges Globaux

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 :
- 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;

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.

Resource Manager Plan

Il existe un Resource Manager pour chaque PDB et un Resource Manager pour la CDB.

Dictionnaire de données

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.

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

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.

Paramètres d'initialisation

Vues du dictionnaire de données

Les vues CDB_% ne sont accessibles que depuis la CDB.

La colonnes CON_ID est le CONTAINER ID et a pour significations :

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;

Modifier la configuration d'une PDB

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;

Stockage des parametres CDB et PDB

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'