Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
LAMI DBA

Articles autour des SGBD Oracle, SQL Server & PostgreSQL

Oracle 12cR2 : Cloner une pluggable database à chaud (Hot Cloning)

A chaque nouvelles releases oracle de nouvelles fonctionnalités apparaissent, certaines présentant plus d’intérêts que d'autres.

Avec la release 2 de la 12c il y a plusieurs nouveautés en particulier sur le Multitenant, comme la possibilité de cloner à chaud une pluggable database sur une autre container database, qu'elle soit sur un serveur distant ou non.

Auparavant, en release 12cR1, il était possible de cloner une pluggable database, mais cette dernière devait être en mode OPEN READ ONLY, ce qui forcément avait un impact et ne pouvait pas être réalisé "on demand", sans interruption de service.

C'est maintenant fini en 12.2.0.1, et nous allons donc découvrir ici comment réaliser un clone à chaud, sans mode archivelog et sans indisponibilité, d'une pluggable database.

Voici les caractéristiques de mon lab :

Base Container SOURCE nommée : CDB1
    - Pluggable Database                 : PDBPROD
    
Base container CIBLE nommée       : CDB2
    - Pluggable Database                  : PDBDEV

 

1 - Préparation de la SOURCE :

La base container "CDB1" contient la pluggable database "PDBPROD" :

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         5 PDBPROD                         READ WRITE NO

Je crée un user spécifique dans ma pluggable PDBPROD pour réaliser le clone, avec les droits qui conviennent. Ce user sera utilisé par la suite par le DBLINK qui sera créée sur l'instance CIBLE.

Histoire de changer un peu des "user1" et autres, je vais créer un user nommé "pingouin" avec mot de passe "canard", cela donnera une touche un peu plus exotique ..

SQL> alter session set container=PDBPROD;
Session altered.

SQL> grant create session, create table, create pluggable database to pingouin identified by canard;
Grant succeeded.


Je met à jour le tnsnames.ora en fonction de cette pluggable PDBPROD, ci dessous le contenu :

PDBPROD =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = SRVLAB)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = PDBPROD)
    )
  )


La confiance n'excluant pas le contrôle comme le dirait mon acolyte Laurent, un petit test de connexion permet de continuer la suite en toute sérénité (ou pas, mais on ne peux pas tout avoir)

[SRVLAB]<oracle>/oracle/product/12.2.0/network/admin[CDB1]:sqlplus pingouin/canard@PDBPROD

SQL*Plus: Release 12.2.0.1.0 Production on Fri Nov 10 10:16:13 2017
Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Last Successful login time: Thu Nov 09 2017 17:55:18 +01:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL>  select sys_context('userenv', 'db_name') from dual;
SYS_CONTEXT('USERENV','DB_NAME')
--------------------------------------------------------------------------
PDBPROD


Ok !  Afin de permettre de contrôler facilement le résultat du clone, je met en place une table "MYFLAG" sur ma pluggable source PDBPROD :

SQL> connect pingouin/canard@PDBPROD
SQL> create table Myflag (flag number, flaginfo varchar2(200));
Table created.

SQL> insert into Myflag values (1,'Flag BEFORE CLONE PDB');
1 row created.

SQL> commit;
Commit complete.


2 - Préparation de la CIBLE "CDB2" :

Sur ma cible, la base container "CDB2" ne contient aucune pluggable :

SQL> select INSTANCE_NAME,STATUS,CON_ID,DATABASE_TYPE from v$instance;

INSTANCE_NAME    STATUS           CON_ID DATABASE_TYPE
---------------- ------------ ---------- ---------------
CDB2           OPEN                  0 SINGLE

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       MOUNTED


Je vais donc créer un dblink qui pointe vers la pdb PDBPROD, en utilisant le user "pingouin" qui a été créée au préalable à l'étape 1 :

SQL>  create database link pdb_lk connect to pingouin identified by "canard" using 'PDBPROD';

Database link created.

SQL> select flag,infoflag from myflag@pdb_lk;

      FLAG FLAGINFO
---------- --------------------------------------------------
         1 Flag BEFORE CLONE PDB

 

Le dblink fonctionne, on peut donc lancer maintenant la création de la pluggable PDBDEV sur la container CIBLE "CDB2" :

[SRVLAB]<oracle>[CDB2]:sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Fri Nov 10 11:19:28 2017
Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> !mkdir /oradata/CDB2/PDBDEV

SQL> create pluggable database PDBDEV from PDBPROD@pdb_lk file_name_convert=('/oradata/CDB1/PDBPROD','/oradata/CDB2/PDBDEV');

create pluggable database PDBDEV from PDBPROD@pdb_lk file_name_convert=('/oradata/CDB1/PDBPROD','/oradata/CDB2/PDBDEV')
*
ERROR at line 1:
ORA-01276: Cannot add file
/oradata/CDB2/PDBDEV/CDB1/5D905C1D7E114082E0537338A8C0E3A9/datafile/o1_mf_system_f090z1yt_.dbf.  File has an Oracle Managed Files file name.


En mode OMF il n'est pas possible de réaliser du file_name_convert. Je vais donc passer par l'option "create_file_dest" qui permettra de gérer les datafiles de la future pluggable PDBDEV en mode OMF :

SQL> create pluggable database PDBDEV from PDBPROD@pdb_lk create_file_dest='/oradata/CDB2/PDBDEV';

Pluggable database created.

Et voici donc notre nouvelle pluggable toute fraichement clonée, que nous allons ouvrir :

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       MOUNTED
         4 PDBDEV                        MOUNTED

SQL> alter pluggable database PDBDEV open read write;
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       MOUNTED
         4 PDBDEV                        READ WRITE NO

 

En parallèle de la création de cette pluggable "PDBDEV", j'ai lancé un insert sur la pluggable SOURCE, sur la table "pingouin.Myflag" afin de vérifier que le processus de clonage embarque bien les données qui auraient été ajoutées / modifiées durant l’exécution du clone.

Je vais donc vérifier à l'issue du clone que je retrouve bien la donnée insérée : "FLAG DURING CLONE" :

 

SQL> alter session set container=PDBDEV;
Session altered.

SQL> alter session set current_schema=pingouin;
Session altered.

SQL> select * from myflag;

      FLAG FLAGINFO
---------- --------------------------------------------------
         1 Flag BEFORE CLONE PDB
         2 Flag DURING CLONE


C'est bel et bien le cas, j'ai bien ma donnée "FLAG DURING CLONE" qui a été pris en compte durant le processus de clonage.

Et voilà comment cloner à chaud, sans interruption de service, une pluggable DB en oracle 12.2 !

Cela donne quelques idées pour la suite, par exemple sur la possibilité d'effectuer des REFRESH de pluggables, de cloner depuis une single database non pluggable .. probablement de futurs articles !

Enjoy ;-)

 

Partager cet article
Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article
H
Très bon post. Quelques précisions : <br /> 1. le tnsnames.ora devra être créé sur le serveur de destination avec CDB2.<br /> 2. si l'OS source est en linux et la destination en Windows vous pouvez rencontrer le bug 24923223 avec un problème sur les redo, il faudra dans ce cas installer le dernier Bundle Pach 12.2.0.1.190416.
Répondre