Je m'amuse à vous montrer une note que j'avais écrit il y a quelques mois, que j'espère sera encore utile pour ceux qui n'ont pas encore commencé à travailler avec la version 12c
Cette fois-ci je vais vous parler de la fonctionnalité Multitenant de Oracle12c et voici quelques petits détails que j’ai réussi à vérifier.
En principe le multitenant a
besoin d’une licence, donc, ces essais ont été faits localement et juste pour
des fins démonstratives dans un environnement Windows 64bits.
En principe, une base de donné
container a été créée «CDB1 » celle-ci contient une base de données
pluggable appelée «PDB1».
Avant de commencer, est-ce que
vous vous rappelez des vues de système « USER » , « ALL »
et « DBA » ? et que des fois, certaines de ces vues ont de problèmes
de performance?
Bon, dorénavant avec 12c et cette fonctionnalité de pluggable
database on aura de vues préfixées « CDB_ » et ces vues comportent
de colonnes additionnelles telles que «con_id » qui sert
principalement à identifier l’appartenance d’un objet à un PDB ou à un CDB.
Cela dit, pour être plus clair
avec l’explication, dès le début vous avez un container root qui s’appelle CDB$ROOT.
Pour ceux qui connaissent SQL Server, le container
ressemble un peu (en gardant ses distances) à une installation SQL Server avec
son « master » et « msysdb » et ses bases de données des
utilisateurs.
Ci-dessous vous voyez la liste de
containers ID avec leur respective base de données ou service.
·
Le con_id 1 est réservé pour le vrai CDB, nommé
« CDB1 »
·
Le con_id 2 est réservé pour PDB$SEED qui est un
«template » d’un PDB
· Les con_id suivants sont assignés à tous les PDB
créés sur le CDB. Dans mon exemple le con_id 3 correspond à « PDB1 »
Dès que vous ouvrez une session
en tant que sys «sqlplus / as sysdba » vous êtes dirigé
automatiquement sur le container de CDB1
soit CDB$ROOT, vous pouvez valider cela avec les commandes ci-dessous.
· Mais, allons voir comment est-elle vraiment
enregistrée. La fenêtre ci-dessous montre les datafiles de notre base de données,
mais juste de ceux qui font partie de notre CDB, n’oubliez pas que je suis sur
un environnement Windows sans ASM.
Donc, pour aller voir la liste
complète il va falloir recourir à la vue « CDB_ » respective.
Ci-dessous on peut voir la liste complète des « datafiles » où on
peut remarquer qu’on a effectivement d’autres « datafiles » pour la
PDB appelée PDB1
La chose la plus intéressant
c’est de remarquer qu’il y a un system et un sysaux pour la CDB et des autres
pour le PDB. Mais à quel point sont-ils indépendants? On va le voir après.
· Une autre chose à remarquer selon la
documentation, il a juste un jeu de controlfile (bien sûr on peut en créer
d’autres par sécurité) mais en fait, le seul controlfile existant est celui
géré par le CDB; donc, comment sont gérés les datafiles de nos PDB’s ?
Pour cela on va créer un fichier de texte de notre
controlfile
Voici une
partie du résultat, comme on peut apprécier, il contient la liste complète de
tous les datafiles ( CDB et PDB y compris), On peut voir aussi, les redologs
partagés. Une fonctionnalité et un risque à noter.
On voit aussi,
un undo pour l’ensemble de bd’s ou plus en cas d’un RAC CDB.
Qu’est-qui
arrive avec le CONTROL_FILE_RECORD_KEEP_TIME? Si jamais on a plusieurs PDB,
étant donné ce qu’on voit, on ne serait pas capable de conserver un délai
différent par PDB. Se servir d’un
catalogue est presque une règle partout...presque. En plus, il faudrait
configurer la valeur en fonction de la plus longue besoin de rétention parmi toutes
les PDB. À noter que ces modifications on peut les faire seulement si on est
connecté sur le CDB1.
·
Avez-vous pensé aux TEMP’s ? il y en a juste un au moment de la création, cependant
on peut créer un temp pour chaque PDB ce qu’à mon avis serait mieux, pour qu’il
soit assigné comme son DEFAULT_TEMPORARY_TABLESPACE. Des autres temp’s pour les
usagers ? Oui bien sûr.
Vous avez vécu certainement des
problèmes avec le nombre grandissant des datafiles chez les clients, ceci
ajouté à un manque de prévision au moment de créer la base de données ? Donc,
il serait bon de bien choisir le MAXDATAFILES pas juste en fonction des
datafiles d’une bd sinon de toutes les PDB’s qu’on pense y ajouter.
Il reste à voir aussi l’impact du
MAXINSTANCES avec un environnement de plusieurs PDB’s, théoriquement il limite
le nombre d’instances ouvertes, donc, aussi à surveiller.
·
Et comment accède-t-on à notre PDB ? Pour ça il
y a quelques alternatives.
Soit,
ouvrir la connexion directement ou changer la session, mais, il faut faire attention
avec quelques petits détails.
Qu’est-ce
qui est arrivé dans ce cas?, on voit que le container actif est le PDB1 mais le
nombre de la base de données est celle du container CDB1. Plus mêlés encore si
on voit juste la liste des datafiles de PDB1?.
Même cas si on ouvre la connexion directement sur PDB1
Pourquoi? La réponse est simple, le V$CONTROLFILE montre
l’information contenue dans le controlfile, et état donné qu’il y en a juste
un…
Donc, si jamais vous avez des client où on fait cette
validation dans les procédures, il faudra changer ça plutôt pour une lecture du
SYS_CONTEXT.
Dans ce cas, on peut
confirmer qu’on est bel et bien sur la base de données correcte.
·
Arrêt et démarrage? Pour arrêter une pluggable
database vous avez une façon élégante et l’autre un peu plus connue, il
faudrait quand même valider si les deux méthodes sont supportées par Oracle.
Dès
qu’on est dans la session d’une pluggable database on peut faire ceci,
veuillez noter le message très court à la fermeture et démarrage.
Dès
qu’on est dans la session de la CDB, on doit faire plutôt :
Mais, … il y a toujours un
« mais », est-ce que notre pluggable database est vraiment fermée?
La
réponse est non, ceci est compréhensible étant donné qu’un seul controlfile
existe et qu’il est utilisé par le CDB, et qui pourtant il continue à accéder
sur les datafiles de toutes les PDB’s existantes et ceux de la CDB.
·
Et l’alertlog ? Bon, il y en a juste un. Moins
de complications pour gérer la rotation des logs?, oui probablement, mais plus
compliqué à retracer les erreurs. Quand tout va bien, c’est bien beau :)
Bon, j’espère vous que cette information sera toujours utile pour quelques uns.
Bonne journée.