DBA SQL Scripts

Oracle 12c Multitenant Option

Database GURU Il DBA (DataBase Administrator) utilizza statement SQL particolari per estrarre le informazioni piu' interessanti sui DB che amministra.
Questa pagina raccoglie e descrive gli script SQL piu' utili ed interessanti per l'opzione Multitenant introdotta nella versione Oracle 12c.

L'opzione Multitenant consente di montare piu' PDB (Plugable Database) sulla stessa istanza container. Si tratta di una variazione significativa dell'architettura che consente una gestione piu' flessibile delle istanze/database Oracle in ottica di servizio o, come e' certamente piu' di moda in questo periodo, per un'utilizzo in Cloud.

Gli esempi riportati riguardano: Creazione database, Elenco PDB, Riconoscere la connessione, Storico attivita', ...

Il documento e' volutamente breve e pratico con esempi funzionanti di statement SQL.
Informazioni di dettaglio si possono trovare nella relativa documentazione.

Introduzione

Nella versione 12c e' possibile ospitare piu' istanze di database (PDB: Pluggable Database) all'interno di un unico container chiamato CDB (Container Database). Si tratta di una variazione significativa dell'architettura che consente una gestione piu' flessibile delle istanze Oracle in ottica di servizio.

In tale architettura l'istanza CDB mantiene al suo interno uno o piu' PDB utilizzando lo stesso set di processi, la stessa SGA (System Global Area) e gli stessi Redo Log. In pratica tutti le componenti di sistema sono condivise. Dal punto di vista logico invece i PDB sono completamente separati ed utilizzano data dictionary distinti, utenti diversi, ... e naturalmente datafile separati.
In una configurazione di default oltre al Root database, che corrisponde al database del container, e' sempre presente un Seed database montato in READ ONLY. Dal Seed Database vengono tipicamente ricavati i PDB con un semplice comando di duplicazione.

L'attivazione di un CDB avviene come quella di una normale instanza Oracle con il comando di startup da SQL*Plus. I PDB vanno invece aperti esplicitamente con un comando di OPEN. Ogni PDB si registra come servizio sul listener, rendendo cosi' completamente trasparente l'accesso alle applicazioni.

Creazione database

Le istanze container CDB (Container Database) vengono create normalmente utilizzando l'utility dbca arricchita nella versione 12c di tutte le opzioni necessarie.
I database PDB (Pluggable Database) possono essere creati con l'utility dbca oppure con un semplice comando SQL partendo dal Seed Database:

CREATE PLUGGABLE DATABASE PlugDbName ADMIN USER AdminUserName IDENTIFIED BY Password;

La gestione dei PDB all'interno dei CDB e' molto dinamica. Possono essere infatti essere aperti e chiusi (open, close, open read only, ...) in modo indipendente, e migrati tra CDB (unplug e plug).
E' infine possibile convertire una normale istanza Oracle 12c in PDB con alcuni semplici passi:

shutdown immediate; startup mount; alter database open read only; exec dbms_pdb.describe (PDB_DESCR_FILE=>'/u01/app/oracle/oradata/myDB/myDB.xml'); mkdir -p /u02/app/oracle/oradata/cdb/plug3 CREATE PLUGGABLE DATABASE myDB USING '/u01/app/oracle/oradata/myDB/myDB.xml' COPY file_name_convert=('/u01/app/oracle/myDB/myDB','/u02/app/oracle/oradata/cdb/plug03');

E' stato utilizzato il parametro file_name_convert poiche' la creazione del PDB e' avvenuta in modalita' COPY.
I parametri del PDB debbono essere compatibili con il CDB. In caso di problemi risultano utili la procedura di verifica in PL/SQL e la relativa vista con i risultati del controllo:

declare controllo boolean := FALSE; begin controllo := dbms_pdb.check_plug_compatibility('/u01/app/oracle/oradata/myDB/myDB.xml'); end; / set lines 120 col cause format a10 col name format a10 col message format a75 word_wrapped select name,cause,type,message,status from PDB_PLUG_IN_VIOLATIONS order by name, line;

Elenco PDB

La vista principale, che contiene l'elenco dei PDB definiti e' la V$PDBS:

column pdb_name format a20 column cloned_from format a20 column total_size format 999,999,999,999,999 select name pdb_name, open_mode, total_size from v$pdbs;

Ecco l'elenco dei PDB presenti, la loro dimensione e, importantissimo, il loro stato. Infatti un PDB, all'avvio dell'istanza CDB e' in stato MOUNTED, quindi utilizzabile solo per attivita' amministrative e di controllo. Per attivare un PDB va utilizzato il comando

alter pluggable database PlugDbName open;

L'avvio di tutti i PDB contenuti in un CDB puo' essere automatizzato con:
create or replace trigger Sys.After_Startup after startup on database begin execute immediate 'alter pluggable database all open'; end; /

Per ottenere il risultato voluto si definisce un trigger di Startup sul CDB che attiva tutti i PDB.

Riconoscere la connessione

Il primo dubbio che si ha quando si lavora con l'opzione Multitenant e' riconoscere se si e' connessi con il root DB o con un PDB. Questo e' possibile da SQL*Plus con il comando SHOW CON_NAME ma e' anche possibile richiedere l'informazione con una query SQL:

column connection_name format a20 column connection_id format a20 select Sys_Context('Userenv', 'Con_Name') Connection_Name, Sys_Context('Userenv', 'Con_Id') Connection_ID, decode(Sys_Context('Userenv', 'Con_Id'), 0, 'Entire CDB', 1, 'Root', 2, 'Seed', 'PDB') Data_Scope from dual;

La select e' molto semplice ed utilizza il context per riconoscere l'ambiente in cui opera. E' da notare la conversione effettuata con il DECODE(). I primi ID sono riservati all'intero CDB, al Root ed Seed database. Gli ID successivi sono quelli relativi ai PDB che possono essere fino a 250 gestiti da un unico CDB.

La vista di sistema V$DATABASE contiene la colonna CDB che indica se la base dati e' un CDB o meno. Questa colonna non e' utile per riconosce un PDB, infatti vale YES sia con un CDB che con un PDB poiche' entrambe contenuti in una base dati di tipo CDB.

Storico attivita'

Lavorando con un numero elevato di PDB e' sicuramente utile disporre di un elenco delle principali attivita' svolte.
La vista CDB_PDB_HISTORY e' sicuramente di grande aiuto:

column db_name format a20 column pdb_name format a20 column cloned_from format a20 select DB_NAME, CON_ID, PDB_NAME, OPERATION, OP_TIMESTAMP, CLONED_FROM_PDB_NAME cloned_from from CDB_PDB_HISTORY where CON_ID>2 order by OP_TIMESTAMP;

La query e' banale: si ottiene l'elenco delle attivita' svolte sui PDB in ordine temporale. La condizione CON_ID>2 restringe la storia ai soli PDB: root e seed non sono interessanti!

Ulteriori informazioni

Un'introduzione ad Oracle si trova in Oracle RDBMS mentre Novita' Architettura Oracle 12c riporta gli ultimi aggiornamenti introdotti nella versione 12c. L'evoluzione delle funzionalita' dell'RDBMS Oracle nel tempo e' stata notevole... La storia delle versioni Oracle negli ultimi 20 anni viene descritta in C'era una volta... Maggiori dettagli tecnici sulle diverse versioni di Oracle e le date di rilascio di ogni versione sono riportate in questo documento.
Il sito Oracle ufficiale contiene tutta la documentazione ufficiale.

Volete leggere altre pagine come questa? Provate qui!


Titolo: SQL4DBA - Oracle 12c Multitenant Option
Livello: Esperto (4/5)
Data: 15 Agosto 2013
Versione: 1.0.0 - 15 Agosto 2013
Autore: mail [AT] meo.bogliolo.name