CDB e PDB
L'architettura multi-tenant consente a un database Oracle di funzionare come container database (CDB) multi-tenant.
A partire da Oracle Database 21c, un container database multi-tenant è l'unica architettura supportata. Nelle release precedenti, Oracle supportava database non di tipo container (non CDB).
-
Informazioni sui contenitori in un CDB Un contenitore è una raccolta di schemi, oggetti e strutture correlate in un contenitore CDB (Multitenant Container Database). All'interno di un CDB, ogni contenitore ha un ID e un nome univoci.
-
Contenitore radice e sistema CDB La root CDB, detta anche semplicemente root, è una raccolta di schemi, oggetti schema e oggetti non schema a cui appartengono tutti i PDB.
-
PDB Un PDB è un set di schemi, oggetti e strutture correlate creato dall'utente che viene visualizzato logicamente in un'applicazione client come database separato.
Informazioni sui contenitori in un CDB
Un contenitore è una raccolta di schemi, oggetti e strutture correlate in un contenitore CDB (Multitenant Container Database). All'interno di un CDB, ogni contenitore ha un ID e un nome univoci.
Un CDB include zero, uno o più pluggable database (PDB) e container di applicazioni creati dal cliente. Un PDB è una raccolta portatile di schemi, oggetti di schema e oggetti non di schema che viene visualizzata in un client Oracle Net come database separato. Un contenitore dell'applicazione è un componente CDB facoltativo creato dall'utente che memorizza dati e metadati per uno o più backend dell'applicazione. Un CDB include zero o più container di applicazioni.
Nota: "Contenitori delle applicazioni" spiega in dettaglio i contenitori delle applicazioni.
La figura seguente rappresenta i contenitori possibili in un CDB.
Figura 1: Contenitori in un CDB

Descrizione dell'illustrazione admin112.png
Ogni CDB dispone dei seguenti contenitori:
-
Esattamente un contenitore root CDB (chiamato anche semplicemente root)
La root CDB è una raccolta di schemi, oggetti schema e oggetti non schema a cui appartengono tutti i PDB (vedere "CDB e PDB"). Nella radice vengono memorizzati i metadati forniti da Oracle e gli utenti comuni. Un esempio di metadati è il codice sorgente per i package PL/SQL forniti da Oracle. Un utente comune è un utente del database noto in ogni contenitore (vedere "Account utente comuni"). Il contenitore radice è denominato
CDB$ROOT. -
Esattamente un contenitore di sistema
Il contenitore di sistema include il CDB root e tutti i PDB nel CDB. Pertanto, il contenitore del sistema è il contenitore logico per il CDB stesso.
-
Zero o più contenitori di applicazioni
Un contenitore dell'applicazione è costituito esattamente da una root dell'applicazione e dai PDB collegati a questa radice. Mentre il contenitore del sistema contiene la radice CDB e tutti i PDB all'interno del CDB, un contenitore dell'applicazione include solo i PDB collegati alla radice dell'applicazione. Una radice applicazione appartiene alla radice CDB e nessun altro contenitore.
-
Zero o più PDB creati dall'utente
Un PDB contiene i dati e il codice necessari per un set specifico di funzioni (vedere "PDB"). Ad esempio, un PDB può supportare un'applicazione specifica, ad esempio risorse umane o applicazioni di vendita. Nessun PDB esistente alla creazione del CDB. È possibile aggiungere PDB in base ai requisiti aziendali.
Un PDB appartiene esattamente a zero o a un contenitore di applicazioni. Se un PDB appartiene a un contenitore applicazioni, si tratta di un PDB applicazione. Ad esempio, i PDB dell'applicazione
cust1_pdbecust2_pdbpotrebbero appartenere al contenitore dell'applicazionesaas_sales_ac, nel qual caso non appartengono ad altri container di applicazioni. Un seed applicazione è un PDB applicazione facoltativo che funge da modello PDB creato dall'utente e consente di creare rapidamente nuovi PDB applicazione. -
Esattamente un PDB seed
Il PDB iniziale è un modello fornito dal sistema che il CDB può utilizzare per creare nuovi PDB. Il PDB iniziale è denominato
PDB$SEED. Impossibile aggiungere o modificare oggetti inPDB$SEED.
Esempio di CDB 2-1 senza container di applicazioni
Questo esempio mostra un CDB semplice con cinque contenitori: il contenitore di sistema (l'intero CDB), la radice CDB, il seed del PDB (PDB$SEED) e due PDB. Ogni PDB dispone di una propria applicazione dedicata. Un amministratore PDB diverso gestisce ogni PDB. Un utente comune esiste in un CDB con una singola identità. In questo esempio, l'utente comune SYS può gestire la root e ogni PDB. A livello fisico, questo CDB è gestito da una o più istanze di database e contiene un set di file di dati per ogni PDB e per il CDB stesso.
Figura 2: CDB senza container applicativi

Descrizione dell'illustrazione cncpt345.png
Esempio di CDB da 2 a 2 con un contenitore applicazioni
In questa variante, il CDB contiene un contenitore di applicazioni denominato saas_sales_ac. All'interno del contenitore dell'applicazione, il PDB dell'applicazione cust1_pdb supporta un'applicazione per un cliente e il PDB dell'applicazione cust2_pdb supporta un'applicazione per un cliente diverso. Il CDB contiene anche un PDB denominato hrpdb, che supporta un'applicazione HR, ma non appartiene a un contenitore dell'applicazione.
Figura 3: CDB con un contenitore di applicazioni

Descrizione dell'illustrazione cncpt383.png
In questo esempio, più DBA gestiscono l'ambiente CDB:
-
Un amministratore CDB gestisce il CDB stesso.
-
Un amministratore del contenitore delle applicazioni gestisce il contenitore
saas_sales_ac, inclusi l'installazione e gli aggiornamenti delle applicazioni. -
Un amministratore PDB dell'applicazione gestisce i due PDB nel contenitore
saas_sales_ac:cust1_pdbecust2_pdb. -
Un amministratore PDB gestisce
hrpdb.
Contenitore root e di sistema CDB
La root CDB, detta anche semplicemente root, è una raccolta di schemi, oggetti schema e oggetti non schema a cui appartengono tutti i PDB.
Ogni CDB dispone di un solo contenitore radice denominato CDB$ROOT. La radice memorizza i metadati di sistema necessari per gestire i PDB. Tutti i PDB appartengono alla radice. Il contenitore di sistema è la radice CDB e tutti i PDB che appartengono a questa radice.
La radice del CDB non memorizza i dati utente. Oracle consiglia di non aggiungere oggetti comuni alla root o di modificare gli schemi forniti da Oracle nella root. È tuttavia possibile creare utenti e ruoli comuni per l'amministrazione del database. Un utente comune con i privilegi necessari può passare da un contenitore all'altro.
Oracle consiglia AL32UTF8 per il set di caratteri root. I PDB con set di caratteri diversi possono risiedere nello stesso CDB senza richiedere la conversione del set di caratteri.
Esempio 2-3 Tutti i container in un CDB
La query seguente, eseguita da un utente amministrativo connesso alla radice del CDB, elenca tutti i container nel CDB (inclusi seed e root CDB), ordinati da CON_ID.
COL NAME FORMAT A15
SELECT NAME, CON_ID, DBID, CON_UID, GUID
FROM V$CONTAINERS ORDER BY CON_ID;
NAME CON_ID DBID CON_UID GUID
------------- ------ ---------- ---------- --------------------------------
CDB$ROOT 1 1895287725 1 2003321EDD4F60D6E0534E40E40A41C5
PDB$SEED 2 2795386505 2795386505 200AC90679F07B55E05396C0E40A23FE
SAAS_SALES_AC 3 1239646423 1239646423 200B4CE0A8DC1D24E05396C0E40AF8EE
SALESPDB 4 3692549634 3692549634 200B4928319C1BCCE05396C0E40A2432
HRPDB 5 3784483090 3784483090 200B4928319D1BCCE05396C0E40A2432
Vedere anche: "Common User Accounts"
PDB
Un PDB è un set di schemi, oggetti e strutture correlate creato dall'utente che viene visualizzato logicamente in un'applicazione client come database separato.
Ogni PDB è di proprietà di SYS, indipendentemente dall'utente che ha creato il PDB. SYS è un utente comune nel CDB, ovvero l'utente che ha la stessa identità nella radice e in ogni PDB esistente e futuro nel CDB.
-
Tipi di PDB Tutti i PDB vengono creati dall'utente con l'istruzione
CREATE PLUGGABLE DATABASE, ad eccezione diPDB$SEED, fornita da Oracle. -
Scopo dei PDB Per un'applicazione, un PDB è un database Oracle autonomo e completamente funzionale. Puoi consolidare i PDB in un singolo CDB per ottenere economie di scala, mantenendo al contempo l'isolamento tra i PDB.
-
Proxy PDB Un proxy PDB si riferisce a un PDB remoto, denominato referenced PDB.
-
I contenitori Nomi per PDB in un CDB condividono lo stesso spazio di nomi, il che significa che devono avere nomi univoci all'interno di questo spazio di nomi.
-
Database link tra PDB Per impostazione predefinita, un utente connesso a un PDB deve utilizzare i database link per accedere agli oggetti in un PDB diverso.
Tipi di PDB
Tutti i PDB vengono creati dall'utente con l'istruzione CREATE PLUGGABLE DATABASE ad eccezione di PDB$SEED, che è fornito da Oracle.
È possibile creare i seguenti tipi di PDB.
PDB standard
Questo tipo di PDB deriva dall'esecuzione di CREATE PLUGGABLE DATABASE senza specificare il PDB come seed, PDB proxy o root dell'applicazione. Le sue funzionalità dipendono dal contenitore in cui è stato creato:
-
PDB collegato alla root CDB
Questo PDB appartiene al contenitore radice CDB e non a un contenitore dell'applicazione. Questo tipo di PDB non può utilizzare oggetti comuni dell'applicazione. Vedere "Oggetti comuni dell'applicazione".
-
PDB applicazione
Un PDB applicazione appartiene esattamente a un contenitore applicazione. A differenza dei PDB collegati alla radice CDB, i PDB dell'applicazione possono condividere una definizione di applicazione principale all'interno di un contenitore dell'applicazione. Ad esempio, una tabella
usa_zipcodesin una radice dell'applicazione potrebbe essere un oggetto comune collegato ai dati, ovvero contiene dati accessibili da tutti i PDB dell'applicazione collegati a questa radice. I PDB che non risiedono all'interno del contenitore dell'applicazione non possono accedere agli oggetti comuni dell'applicazione.
Radice applicazioni
Prendere in considerazione una radice applicazione come contenitore radice specifico dell'applicazione. Serve come repository per una definizione master di un'applicazione backend, inclusi dati e metadati comuni. Per creare una radice applicazione, connettersi alla radice CDB e specificare la clausola AS APPLICATION CONTAINER in un'istruzione CREATE PLUGGABLE DATABASE. Vedere "Radice applicazione".
Popola PDB
A differenza di un PDB standard, un PDB iniziale non è destinato a supportare un'applicazione. Piuttosto, il seed è un modello per la creazione di PDB che supportano le applicazioni. Un seme può essere uno dei seguenti:
-
Seed PDB collegato alla radice CDB (
PDB$SEED)È possibile utilizzare questo modello fornito dal sistema per creare nuovi PDB in un contenitore di applicazioni o nel contenitore di sistema. Il contenitore di sistema contiene esattamente un seed PDB. Non è possibile eliminare
PDB$SEED, né aggiungere o modificare oggetti al suo interno. -
PDB iniziale applicazione
Per accelerare la creazione dei PDB dell'applicazione all'interno di un contenitore dell'applicazione, è possibile creare un seed dell'applicazione facoltativo. Un contenitore applicazione contiene zero o un seed applicazione.
Per creare un seed dell'applicazione, connettersi al contenitore dell'applicazione ed eseguire l'istruzione
CREATE PLUGGABLE DATABASE ... AS SEED. Vedere "Inizio applicazione".
PDB proxy
Un proxy PDB è un PDB che utilizza un database link per fare riferimento a un PDB in un CDB remoto. Quando si emette un'istruzione in un PDB proxy mentre il PDB è aperto, l'istruzione viene eseguita nel PDB di riferimento.
È necessario creare un PDB proxy durante la connessione alla radice CDB o all'applicazione radice. È possibile modificare o eliminare un PDB proxy come è possibile per un PDB standard.
Scopo dei PDB
Per un'applicazione, un PDB è un database Oracle autonomo e completamente funzionale. Puoi consolidare i PDB in un singolo CDB per ottenere economie di scala, mantenendo al contempo l'isolamento tra i PDB.
È possibile utilizzare i PDB per raggiungere gli obiettivi specifici riportati di seguito.
-
Memorizza dati specifici di un'applicazione
Ad esempio, un'applicazione Sales può avere un proprio PDB dedicato e un'applicazione Human Resources può avere un proprio PDB dedicato. In alternativa, è possibile creare un contenitore dell'applicazione, che è una raccolta denominata di PDB, per memorizzare un backend dell'applicazione contenente dati e metadati comuni.
-
Spostare i dati in un CDB diverso
Un database è "pluggable" perché è possibile raggrupparlo come unità autonoma, denominata PDB scollegato, quindi spostarlo in un altro CDB.
-
Esegui aggiornamenti rapidi
È possibile scollegare un PDB da CDB in una release di database Oracle inferiore, quindi collegarlo a un CDB in una release successiva.
-
Copia rapidamente i dati senza perdita di disponibilità
Per il test e lo sviluppo, è possibile duplicare un PDB finché rimane aperto, memorizzando la copia nello stesso CDB o in un CDB diverso. Facoltativamente, è possibile specificare il PDB come clone PDB aggiornabile. In alternativa, utilizzare il PDB seed fornito da Oracle o un seed dell'applicazione creato dall'utente per copiare nuovi PDB.
-
Dati di riferimento in un CDB diverso
È possibile creare un proxy PDB che si riferisce a un PDB diverso, nello stesso CDB o in un CDB separato. Quando si emettono istruzioni nel PDB proxy, queste vengono eseguite nel PDB di riferimento.
-
Isola privilegi all'interno dei PDB
Un utente locale o comune con privilegi appropriati può concedere privilegi
EXECUTEsu un oggetto schema aPUBLICall'interno di un singolo PDB.
Vedere anche:
-
Oracle AI Database Security Guide per informazioni su come concedere ruoli e privilegi in un CDB
PDB proxy
Un proxy PDB fa riferimento a un PDB remoto, denominato referenced PDB.
Sebbene si eseguano istruzioni SQL nel PDB proxy (che fa riferimento), le istruzioni vengono eseguite nel PDB di riferimento. A questo proposito, un PDB proxy è approssimativamente analogo a un file di collegamento simbolico in Linux.
I PDB proxy offrono i vantaggi riportati di seguito.
-
Aggrega dati da più modelli di applicazione
I PDB proxy consentono di creare applicazioni trasparenti dalla posizione in grado di aggregare i dati provenienti da più origini. Queste origini possono trovarsi nello stesso data center o essere distribuite tra i data center.
-
Abilitare una radice applicazione in un CDB per propagare le modifiche dell'applicazione a una radice applicazione diversa
Si supponga che i CDB
cdb_prodecdb_testabbiano lo stesso modello di applicazione. Si crea un PDB proxy in un contenitore applicazioni incdb_prodche fa riferimento a una radice applicazione incdb_test. Quando si eseguono script di installazione e aggiornamento nella radice dell'applicazione incdb_prod, Oracle AI Database propaga queste istruzioni al PDB proxy, che a sua volta le invia in remoto alla radice dell'applicazione incdb_test. In questo modo, la radice dell'applicazione incdb_testdiventa una replica della radice dell'applicazione incdb_prod.
Per creare un PDB proxy, eseguire CREATE PLUGGABLE DATABASE con la clausola AS PROXY FROM, in cui FROM specifica il nome del PDB di riferimento e un database link. L'istruzione di creazione copia solo i file di dati appartenenti alle tablespace SYSTEM e SYSAUX.
Esempio 2-4 Creazione di un PDB proxy
Questo esempio si connette al contenitore saas_sales_ac in un CDB di produzione locale. L'utente comune sales_admin crea un PDB proxy denominato sales_sync_pdb. Questo PDB dell'applicazione fa riferimento a una radice dell'applicazione denominata saas_sales_test_ac in un CDB di sviluppo remoto a cui accede utilizzando il database link cdb_dev_rem. Quando un aggiornamento dell'applicazione si verifica in saas_sales_ac nel CDB di produzione, l'aggiornamento si propaga automaticamente alla radice dell'applicazione saas_sales_test_ac nel CDB di sviluppo remoto.
CONNECT sales_admin@saas_sales_ac
Password: ***********
CREATE PLUGGABLE DATABASE sales_sync_pdb AS PROXY FROM saas_sales_test_ac@cdb_dev_rem;
Nomi per PDB
I contenitori in un CDB condividono lo stesso spazio di nomi, il che significa che devono avere nomi univoci all'interno di questo spazio di nomi.
I nomi dei seguenti contenitori non devono creare conflitti all'interno dello stesso CDB:
-
La radice del CDB
-
PDB collegati alla radice CDB
-
Radici applicazione
-
PDB applicazione
Ad esempio, se lo stesso CDB contiene i container di applicazioni saas_sales_ac e saas_sales_test_ac, due PDB di applicazione denominati entrambi cust1 non possono risiedere contemporaneamente in entrambi i container. Le regole dello spazio di nomi impediscono inoltre la creazione di un PDB denominato cust1pdb nella radice CDB e di un PDB denominato cust1pdb in una radice dell'applicazione.
I nomi dei PDB e dei contenitori radice dell'applicazione devono seguire le stesse regole dei nomi dei servizi di rete. Inoltre, poiché un PDB o una radice applicazione dispone di un servizio con il proprio nome, il nome del contenitore deve essere univoco in tutti i CDB i cui servizi sono esposti tramite un listener specifico. Il primo carattere di un nome contenitore creato dall'utente deve essere alfabetico, con i restanti caratteri alfanumerici o il carattere di sottolineatura (_). Poiché i nomi dei servizi non fanno distinzione tra maiuscole e minuscole, i nomi dei container non fanno distinzione tra maiuscole e minuscole anche se vengono specificati utilizzando identificativi delimitati.
Vedere anche: Oracle AI Database Net Services Reference per le regole relative ai nomi dei servizi
Collegamenti database tra PDB
Per impostazione predefinita, un utente connesso a un PDB deve utilizzare i database link per accedere agli oggetti in un PDB diverso.
Figura 4: Database link tra PDB

Descrizione dell'illustrazione cncpt384.png
Di seguito sono riportate alcune eccezioni alla regola.
-
Un oggetto comune collegato ai dati, accessibile da tutti i PDB dell'applicazione che contengono un collegamento dati che punta a questo oggetto. Ad esempio, il contenitore dell'applicazione
saas_sales_acpotrebbe contenere la tabellausa_zipcodescollegata ai dati all'interno dell'applicazione. In questo caso, l'utente CDB comunec##dbapuò connettersi a un PDB dell'applicazione in questo contenitore, quindi eseguire una query suusa_zipcodesanche se la tabella effettiva risiede nella radice dell'applicazione. In questo caso, non è richiesto alcun database link. -
La clausola
CONTAINERS()in SQL emessa dalla radice CDB o dalla radice dell'applicazione. Questa clausola consente di eseguire query sui dati in tutti i PDB collegati alla radice del contenitore.
Quando si crea un PDB proxy, è necessario specificare un nome di database link nella clausola FROM dell'istruzione CREATE PLUGGABLE DATABASE ... AS PROXY. Se il PDB proxy e il PDB di riferimento risiedono in CDB separati, il database link deve essere definito nella radice del CDB che conterrà il PDB proxy. Il database link deve connettersi al PDB di riferimento remoto o alla radice CDB del CDB remoto.
Vedere anche: "Oggetti comuni e locali"