Continuiamo con la nostra serie di articoli che, attraverso esempi pratici e semplificati, dimostrano l’applicazione di strumenti fondamentali nei rispettivi ambiti. Introduciamo l’Hot cloning di un pluggable database (PDB) in ambito Oracle 12c R2 (12.2):
La necessità di clonare un database è evidente per chi gestisce qualsiasi database ma qui vediamo un paio di situazioni dove ci può essere utile.
Pensiamo a quando vogliamo testare una patch applicativa sul database di produzione; prima facciamo una clonazione del PDB, applichiamo la patch su PDB clonato e la testiamo.
Oppure quando vogliamo effettuare dei controlli sulle performance o test di regressione sull’applicazione; queste attività non possono essere eseguite in parallelo sugli ambienti di produzione e sugli stessi database, quindi ha senso clonare il PDB su un diverso CDB.
Per clonare un PDB con SQL*Plus si può utilizzare il comando CREATE PLUGGABLE DATABASE ma prima di usare questo comando vanno rispettati questi prerequisiti:
– bisogna essere connessi al CDB sul container root
– è necessario avere il system privilege di CREATE PLUGGABLE DATABASE
– il CDB in cui deve essere creato il PDB deve essere in modalità READ WRITE
– bisogna impostare il database da clonare in modalità READ ONLY prima della clonazione.
Vediamo i passaggi per clonare un PDB tramite SQL*Plus e quindi con il prompt di comandi:
Creiamo una directory di destinazione:md c:\app\oracle\oradata\orcl\PDB3
Apri una connessione su CDB$ROOT come SYS – (connessione 1):sqlplus / as sysdba
ALTER SESSION SET CONTAINER = PDB1;
ALTER USER hr ACCOUNT UNLOCK IDENTIFIED BY hr;
ALTER SESSION SET CONTAINER = CDB$ROOT;
Apri una connessione sul PDB1 come HR – (connessione 2):sqlplus hr/hr@PDB1
SELECT salary FROM hr.employees WHERE employee_id = 100;
UPDATE employees SET salary=salary * 1.1;
SELECT salary FROM hr.employees WHERE employee_id = 100;
Notare come la transazione aperta nel PDB1 non è stata Committed. Torna alla connessione 1, creiamo il PDB3 a partire dal PDB1:CREATE PLUGGABLE DATABASE PDB3 FROM PDB1 CREATE_FILE_DEST= 'c:\app\oracle\oradata\orcl/PDB3';
Verifichiamo che il PDB1 sia aperto in READ WRITE e il PDB3 sia MOUNTED:COLUMN con_id FORMAT 999
COLUMN name FORMAT A10
SELECT con_id, name, open_mode FROM v$pdbs;
ALTER PLUGGABLE DATABASE PDB3 OPEN;
SHOW PDBS
Nella connessione 2, facciamo commit della transazione pendente:COMMIT;
SELECT salary FROM hr.employees WHERE employee_id = 100
Torniamo alla connessione 1 e vediamo la situazione del PDB3:ALTER SESSION SET container = PDB3;
SELECT salary FROM hr.employees WHERE employee_id = 100;
Vediamo elenco dei servizi legati al PDB3:COLUMN name FORMAT A20
SELECT name FROM v$services;
I suoi datafiles:COLUMN name FORMAT A70
SELECT file_name, tablespace_name FROM dba_data_files;
Ed i suoi tempfiles:SELECT file_name, tablespace_name FROM dba_temp_files;
COLUMN username FORMAT A30
SELECT DISTINCT username FROM dba_users WHERE common='NO';
Torniamo alla connessione 2 dovremmo essere connessi al PDB1 come HR e riportiamo i valori della colonna SALARY al loro valore originale:SHOW con_name
UPDATE employees SET salary=salary / 1.1;
COMMIT;
SELECT salary FROM hr.employees WHERE employee_id = 100;
Possiamo notare come i dati clonati non hanno subito alcuna modifica dopo la commit sul PDB1 quindi il nuovo PDB3 è completamente disaccoppiato e risponde alle nostre necessità espresse all’inizio dell’articolo.