Oracle Database 18c : Clonage Point-In-Time de PDBs dans ASM

Jusqu’à présent, si l’on souhaitait cloner « à chaud » une base de données, ou plus particulièrement pour le cas qui nous intéresse ici, un PDB, il fallait s’appuyer sur un FileSystem qui supportait la fonction Snap, c’est-à-dire basé sur la technique « COW » (Copy On Write).
De ces FileSystems, on peut citer ZFS, NFS, OCFS2, XFS et ACFS.
Exit donc ASM, ce qui nous amenait à stocker les bases de données dans ACFS plutôt que directement dans ASM si l’on souhaitait faire du snap.
C’était d’ailleurs le cas sur ODA.
Un peu aberrant, non ?
Et bien qu’à cela ne tienne : faussé comblé en 12c (12.2) et amélioré en 18c !

Il y a tout d’abord quelques contraintes à prendre en considération :

  • Grid Infrastructure en version 18c ou supérieur
  • Diskgroup ASM avec attributs « compatible.asm » et « compatible.rdbms » à « 18.0 » ou supérieur
  • Diskgroup ASM en redondance FLEX

La toute première étape, si l’on considère que la version du GI est déjà la bonne, est donc de rendre le Diskgroup ASM « accueillant ».
S’il a été créé en redondance EXTERNAL, c’est mort.
S’il a été créé en redondance NORMAL ou HIGH, alors, une fois n’est pas coutume, il peut être converti en FLEX.
A noter que c’est le seul type de conversion possible : habituellement, si l’on s’est trompé de niveau de redondance, pas le choix -> DROP/CREATE !

Exemple :

SQL> ALTER DISKGROUP DATA ATTRIBUTE 'compatible.asm' = '18.0', ATTRIBUTE 'compatible.rdbms' = '18.0';
Diskgroup altered.
SQL> ALTER DISKGROUP DATA CONVERT REDUNDANCY TO FLEX;
Diskgroup altered.

Attention !!!  A partir de là, plus question de faire fonctionner des bases de données de version inférieure à 18c dans ce Diskgroup, et Rollback impossible !

Maintenant que le stockage est prêt, un peu de théorie.
Constituer un clone « à chaud » d’une base de données (ici une PDB), implique de garantir la cohérence entre tous les Datafiles qui la compose : ils doivent tous représenter une image de la même référence temporelle, un peu comme si on avait mis le temps sur pause.
Pour ce faire, dans le Diskgroup ASM FLEX, c’est la nouvelle notion de Filegroup qui va procurer la mécanique de clonage en garantissant que tous les Datafiles qu’il contient seront tous cohérents entre eux.
Pour information, le Filegroup est arrivé en version 12.2 du GI.

Exemple :

SQL> ALTER DISKGROUP DATA CREATE FILEGROUP MYDB1 DATABASE MYDB1;
Diskgroup altered.

Et comme Oracle est gentil avec ses DBAs, lorsque c’est une PDB qui est créée dans un Diskgroup ASM FLEX, cette action manuelle n’est pas requise car un FileGroup sera automatiquement créé pour cette PDB et contiendra tous ses Datafiles.

L’étape suivante va consister à préparer une zone de « mirroring ».
Exemple :

SQL> ALTER PLUGGABLE DATABASE PREPARE MIRROR COPY mypdb1_mirror;
Pluggable database altered.

Il est possible de vérifier l’espace créé.
Exemple :

SQL> SELECT GROUP_NAME, DBCLONE_NAME, MIRRORCOPY_NAME, DBCLONE_STATUS, PARENT_DBNAME, PARENT_FILEGROUP_NAME FROM V$ASM_DBCLONE_INFO;
GROUP_NUMBER DBCLONE_NAME MIRRORCOPY_NAME DBCLONE_STATUS  PARENT_DBNAME PARENT_FILEGROUP_NAME
------------ ------------ --------------- --------------- ------------- ---------------------
           1 DB_UNKNONW   MYPDB1_MIRROR   PREPARED       MYPDB1        MYPDB1

Il ne reste plus qu’à créer le clone.
Exemple :

SQL> CREATE PLUGGABLE DATABASE mypdb2 FROM mypdb1 USING MIRROR COPY mypdb1_mirror;
Pluggable database created.

Petite vérification par l’exemple :

SQL> SELECT GROUP_NAME, DBCLONE_NAME, MIRRORCOPY_NAME, DBCLONE_STATUS, PARENT_DBNAME, PARENT_FILEGROUP_NAME FROM V$ASM_DBCLONE_INFO;
GROUP_NUMBER DBCLONE_NAME MIRRORCOPY_NAME DBCLONE_STATUS  PARENT_DBNAME PARENT_FILEGROUP_NAME
------------ ------------ --------------- --------------- ------------- ---------------------
           1 MYPDB2       MYPDB1_MIRROR   SPLIT COMPLETED MYPDB1        MYPDB1

Et pour finir, exemple de petit coup d’œil sur les Filegroups :

SQL> SELECT GROUP_NUMBER, NAME FROM V$ASM_FILEGROUP;
GROUP_NUMBER NAME
------------ -------------------------------
           1 DEFAULT_FILEGROUP
           1 CDB1_CDB$ROOT
           1 CDB1_PDB$SEED
           1 CDB1_MYPDB1
           1 MYPDB1_MIRROR

Il ne vous reste qu’à tirer profit de cette nouvelle PDB clonée en une poignée de secondes.