10 Novembre 2017
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 ;-)