CDBs e PDBs
A arquitetura multilocatário permite a um banco de dados Oracle funcionar como um banco de dados contêiner multitenant (CDB).
A partir do Oracle Database 21c, um banco de dados contêiner multitenant é a única arquitetura suportada. Em versões anteriores, os bancos de dados não contêineres (não CDBs) suportados pela Oracle.
-
Sobre Contêineres em um CDB Um contêiner é uma coleção de esquemas, objetos e estruturas relacionadas em um CDB (banco de dados contêiner) multitenant. Em um CDB, cada contêiner tem um ID e um nome exclusivos.
-
A Raiz do CDB e o Contêiner do Sistema A raiz do CDB, também chamada simplesmente de a raiz, é uma coleção de esquemas, objetos de esquema e objetos não-esquema aos quais todos os PDBs pertencem.
-
PDBs Um PDB é um conjunto de esquemas, objetos e estruturas relacionadas criados pelo usuário que aparece logicamente em um aplicativo cliente como um banco de dados separado.
Sobre Contêineres em um CDB
Um contêiner é uma coleção de esquemas, objetos e estruturas relacionadas em um banco de dados contêiner (CDB) multitenant. Em um CDB, cada contêiner tem um ID e um nome exclusivos.
Um CDB inclui zero, um ou muitos bancos de dados plugáveis (PDBs) criados pelo cliente e contêineres de aplicativos. Um PDB é uma coleção portátil de esquemas, objetos de esquema e objetos não esquema que aparece para um cliente do Oracle Net como um banco de dados separado. Um contêiner de aplicativos é um componente CDB opcional criado pelo usuário que armazena dados e metadados para um ou mais back-ends de aplicativos. Um CDB inclui zero ou mais contêineres de aplicativos.
Observação: "Contêineres de Aplicativos" explica detalhadamente os contêineres de aplicativos.
A figura a seguir representa possíveis contêineres em um CDB.
Figura 1: Contêineres em um CDB

Descrição da ilustração admin112.png
Cada CDB tem os seguintes contêineres:
-
Exatamente um contêiner de raiz CDB (também chamado simplesmente de raiz)
A raiz do CDB é um conjunto de esquemas, objetos de esquema e objetos de não esquema aos quais todos os PDBs pertencem (consulte "CDBs e PDBs"). A raiz armazena metadados fornecidos pelo Oracle e usuários comuns. Um exemplo de metadados é o código-fonte dos pacotes PL/SQL fornecidos pelo Oracle. Um usuário comum é um usuário de banco de dados conhecido em cada contêiner (consulte "Contas de Usuários Comuns"). O contêiner raiz é chamado
CDB$ROOT. -
Exatamente um contêiner de sistema
O contêiner do sistema inclui o CDB raiz e todos os PDBs no CDB. Assim, o contêiner do sistema é o contêiner lógico do próprio CDB.
-
Zero ou mais contêineres de aplicativos
Um contêiner de aplicativos consiste exatamente em uma raiz de aplicativo e nos PDBs conectados a essa raiz. Enquanto o contêiner do sistema contém a raiz do CDB e todos os PDBs no CDB, um contêiner de aplicativos inclui apenas os PDBs conectados à raiz do aplicativo. Uma raiz do aplicativo pertence à raiz do CDB e nenhum outro contêiner.
-
Zero ou mais PDBs criados pelo usuário
Um PDB contém os dados e o código necessários para um conjunto específico de recursos (consulte "PDBs"). Por exemplo, um PDB pode suportar um aplicativo específico, como um aplicativo de recursos humanos ou de vendas. Não existem PDBs na criação do CDB. Você adiciona PDBs com base em seus requisitos de negócios.
Um PDB pertence exatamente a zero ou a um contêiner de aplicativos. Se um PDB pertencer a um contêiner de aplicativos, ele será um PDB de aplicativo. Por exemplo, os PDBs dos aplicativos
cust1_pdbecust2_pdbpodem pertencer ao contêiner de aplicativossaas_sales_ac. Nesse caso, eles não pertencem a nenhum outro contêiner de aplicativos. Uma implantação de aplicativo é um PDB de aplicativo opcional que atua como um modelo de PDB criado pelo usuário, permitindo que você crie novos PDBs de aplicativo rapidamente. -
Exatamente um PDB de semente
O PDB de teste é um modelo fornecido pelo sistema que o CDB pode usar para criar novos PDBs. O PDB pré-implantado é chamado
PDB$SEED. Não é possível adicionar ou modificar objetos noPDB$SEED.
Exemplo 2-1 CDB sem Contêineres de Aplicativo
Este exemplo mostra um CDB simples com cinco contêineres: o contêiner do sistema (o CDB inteiro), a raiz do CDB, a implantação do PDB (PDB$SEED) e dois PDBs. Cada PDB tem seu próprio aplicativo dedicado. Um administrador de PDB diferente gerencia cada PDB. Existe um usuário comum em um CDB com uma única identidade. Neste exemplo, o usuário comum SYS pode gerenciar a raiz e cada PDB. No nível físico, esse CDB é gerenciado por uma ou mais instâncias de banco de dados e contém um conjunto de arquivos de dados para cada PDB e para o próprio CDB.
Figura 2: CDB sem contêineres de aplicativos

Descrição da ilustração cncpt345.png
Exemplo 2-2 CDB com um Contêiner de Aplicativos
Nesta variação, o CDB contém um contêiner de aplicativos chamado saas_sales_ac. No contêiner de aplicativos, o PDB do aplicativo cust1_pdb suporta um aplicativo para um cliente e o PDB do aplicativo cust2_pdb suporta um aplicativo para outro cliente. O CDB também contém um PDB chamado hrpdb, que suporta um aplicativo de RH, mas não pertence a um contêiner de aplicativos.
Figura 3: CDB com um Contêiner de Aplicativos

Descrição da ilustração cncpt383.png
Neste exemplo, vários DBAs gerenciam o ambiente CDB:
-
Um administrador do CDB gerencia o próprio CDB.
-
Um administrador de contêiner de aplicativos gerencia o contêiner
saas_sales_ac, incluindo instalação e upgrades de aplicativos. -
Um administrador do PDB do aplicativo gerencia os dois PDBs no contêiner
saas_sales_ac:cust1_pdbecust2_pdb. -
Um administrador de PDB gerencia
hrpdb.
A raiz do CDB e o contêiner do sistema
A raiz do CDB, também chamada simplesmente de raiz, é um conjunto de esquemas, objetos de esquema e objetos de não esquema aos quais todos os PDBs pertencem.
Cada CDB tem um e somente um contêiner raiz chamado CDB$ROOT. A raiz armazena os metadados de sistema necessários para gerenciar PDBs. Todos os PDBs pertencem à raiz. O contêiner do sistema é a raiz do CDB e todos os PDBs que pertencem a essa raiz.
A raiz do CDB não armazena dados do usuário. A Oracle recomenda que você não adicione objetos comuns à raiz ou modifique os esquemas fornecidos pela Oracle na raiz. No entanto, você pode criar usuários e atribuições comuns para administração de banco de dados. Um usuário comum com os privilégios necessários pode alternar entre contêineres.
A Oracle recomenda AL32UTF8 para o conjunto de caracteres raiz. PDBs com conjuntos de caracteres diferentes podem residir no mesmo CDB sem exigir a conversão do conjunto de caracteres.
Exemplo 2-3 Todos os Contêineres em um CDB
A consulta a seguir, emitida por um usuário administrativo conectado à raiz do CDB, lista todos os contêineres no CDB (incluindo o seed e a raiz do CDB), ordenados por 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
Consulte Também: "Contas de Usuário Comuns"
PDBs
Um PDB é um conjunto de esquemas, objetos e estruturas relacionadas criados pelo usuário que aparece logicamente em um aplicativo cliente como um banco de dados separado.
Cada PDB pertence a SYS, independentemente de qual usuário criou o PDB. SYS é um usuário comum no CDB, o que significa que esse usuário que tem a mesma identidade na raiz e em cada PDB existente e futuro no CDB.
-
Tipos de PDBs Todos os PDBs são criados pelo usuário com a instrução
CREATE PLUGGABLE DATABASE, excetoPDB$SEED, que é fornecida pela Oracle. -
Finalidade dos PDBs Para um aplicativo, um PDB é um banco de dados Oracle independente e totalmente funcional. Você pode consolidar PDBs em um único CDB para obter economias de escala, mantendo o isolamento entre PDBs.
-
PDBs Proxy Um PDB proxy refere-se a um PDB remoto, chamado PDB referenciado.
-
Os Contêineres Nomes para PDBs em um CDB compartilham o mesmo namespace, o que significa que eles devem ter nomes exclusivos nesse namespace.
-
Links do Banco de Dados Entre PDBs Por padrão, um usuário conectado a um PDB deve usar links de banco de dados para acessar objetos em outro PDB.
Tipos de PDBs
Todos os PDBs são criados pelo usuário com a instrução CREATE PLUGGABLE DATABASE, exceto PDB$SEED, que é fornecida pela Oracle.
Você pode criar os seguintes tipos de PDBs.
PDB Padrão
Esse tipo de PDB resulta da execução de CREATE PLUGGABLE DATABASE sem especificar o PDB como um PDB de teste, proxy ou raiz de aplicativo. Seus recursos dependem do contêiner no qual você o cria:
-
PDB conectado à raiz do CDB
Este PDB pertence ao contêiner raiz do CDB e não a um contêiner de aplicativos. Este tipo de PDB não pode usar objetos comuns do aplicativo. Consulte "Objetos Comuns do Aplicativo".
-
Aplicativo PDB
Um PDB de aplicativo pertence exatamente a um contêiner de aplicativos. Ao contrário dos PDBs conectados à raiz do CDB, os PDBs de aplicativos podem compartilhar uma definição mestra de aplicativo em um contêiner de aplicativos. Por exemplo, uma tabela
usa_zipcodesem uma raiz de aplicativo pode ser um objeto comum vinculado a dados, o que significa que ela contém dados acessíveis por todos os PDBs de aplicativo conectados a essa raiz. Os PDBs que não residem no contêiner de aplicativos não podem acessar seus objetos comuns do aplicativo.
Raiz do Aplicativo
Considere uma raiz do aplicativo como um contêiner raiz específico do aplicativo. Ele serve como um repositório para uma definição principal de um back-end de aplicativo, incluindo dados e metadados comuns. Para criar uma raiz de aplicativo, conecte-se à raiz do CDB e especifique a cláusula AS APPLICATION CONTAINER em uma instrução CREATE PLUGGABLE DATABASE. Consulte "Application Root".
Pré-implantar PDBs
Ao contrário de um PDB padrão, um PDB pré-implantado não se destina a suportar um aplicativo. Em vez disso, o seed é um modelo para a criação de PDBs que suportam aplicativos. Uma semente pode ser uma das seguintes:
-
Pré-implantar PDB conectado à raiz do CDB (
PDB$SEED)Você pode usar esse modelo fornecido pelo sistema para criar novos PDBs em um contêiner de aplicativos ou no contêiner do sistema. O contêiner do sistema contém exatamente um seed de PDB. Você não pode eliminar
PDB$SEED, nem adicionar objetos a ou modificar objetos dentro dele. -
PDB de implantação do aplicativo
Para acelerar a criação de PDBs de aplicativos em um contêiner de aplicativos, você pode criar uma implantação de aplicativos opcional. Um contêiner de aplicativos contém zero ou um seed de aplicativos.
Você cria uma implantação de aplicativo conectando-se ao contêiner de aplicativos e executando a instrução
CREATE PLUGGABLE DATABASE ... AS SEED. Consulte "Implantação do Aplicativo".
PDBs de proxy
Um PDB de proxy é um PDB que usa um link de banco de dados para fazer referência a um PDB em um CDB remoto. Quando você emite uma instrução em um PDB de proxy enquanto o PDB está aberto, a instrução é executada no PDB referenciado.
Crie um PDB proxy enquanto estiver conectado à raiz do CDB ou à raiz do aplicativo. Você pode alterar ou eliminar um PDB proxy da mesma forma que pode um PDB padrão.
Finalidade dos PDBs
Para um aplicativo, um PDB é um banco de dados Oracle independente e totalmente funcional. Você pode consolidar PDBs em um único CDB para obter economias de escala, mantendo o isolamento entre PDBs.
Você pode usar PDBs para atingir as seguintes metas específicas:
-
Armazenar dados específicos de um aplicativo
Por exemplo, um aplicativo de vendas pode ter seu próprio PDB dedicado, e um aplicativo de recursos humanos pode ter seu próprio PDB dedicado. Como alternativa, você pode criar um contêiner de aplicativos, que é uma coleção nomeada de PDBs, para armazenar um back-end de aplicativo que contenha dados e metadados comuns.
-
Mover dados para outro CDB
Um banco de dados é "pluggable" porque você pode empacotá-lo como uma unidade autocontida, chamada de PDB desconectado e, em seguida, movê-lo para outro CDB.
-
Executar atualizações rápidas
Você pode desconectar um PDB do CDB em uma release inferior do banco de dados Oracle e, em seguida, conectá-lo a um CDB em uma release superior.
-
Copie dados rapidamente sem perda de disponibilidade
Para teste e desenvolvimento, você pode clonar um PDB enquanto ele permanece aberto, armazenando o clone no mesmo CDB ou em outro. Opcionalmente, você pode especificar o PDB como um PDB de clone atualizável. Como alternativa, você usa o PDB implantado fornecido pela Oracle ou uma implantação de aplicativo criada pelo usuário para copiar novos PDBs.
-
Dados de referência em um CDB diferente
Você pode criar um PDB de proxy que se refira a outro PDB, no mesmo CDB ou em um CDB separado. Quando você emite instruções no PDB do proxy, elas são executadas no PDB referenciado.
-
Isolar concessões em PDBs
Um usuário local ou comum com privilégios apropriados pode conceder privilégios
EXECUTEem um objeto de esquema paraPUBLICem um PDB individual.
Consulte Também:
-
Oracle AI Database Security Guide para saber como conceder atribuições e privilégios em um CDB
PDBs de proxy
Um PDB proxy se refere a um PDB remoto, chamado de PDB referenciado.
Embora você emita instruções SQL no PDB de proxy (referência), as instruções são executadas no PDB referenciado. Nesse aspecto, um PDB proxy é vagamente análogo a um arquivo de link simbólico no Linux.
Os PDBs de proxy fornecem os seguintes benefícios:
-
Agregar dados de vários modelos de aplicativos
Os PDBs de proxy permitem que você crie aplicativos transparentes em localização que podem agregar dados de várias origens. Essas fontes podem estar no mesmo data center ou distribuídas entre data centers.
-
Ativar uma raiz de aplicativo em um CDB para propagar alterações de aplicativo para outra raiz de aplicativo
Suponha que os CDBs
cdb_prodecdb_testtenham o mesmo modelo de aplicativo. Você cria um PDB proxy em um contêiner de aplicativos nocdb_prodque se refere a uma raiz de aplicativo nocdb_test. Quando você executa scripts de instalação e upgrade na raiz do aplicativo nocdb_prod, o Oracle AI Database propaga essas instruções para o PDB proxy, que por sua vez as envia remotamente para a raiz do aplicativo nocdb_test. Dessa forma, a raiz do aplicativo nocdb_testse torna uma réplica da raiz do aplicativo nocdb_prod.
Para criar um PDB de proxy, execute CREATE PLUGGABLE DATABASE com a cláusula AS PROXY FROM, em que FROM especifica o nome do PDB referenciado e um link de banco de dados. A instrução de criação copia somente os arquivos de dados pertencentes aos tablespaces SYSTEM e SYSAUX.
Exemplo 2-4 Criando um PDB Proxy
Este exemplo se conecta ao contêiner saas_sales_ac em um CDB de produção local. O usuário comum sales_admin cria um PDB de proxy chamado sales_sync_pdb. Esse PDB de aplicativo faz referência a uma raiz de aplicativo chamada saas_sales_test_ac em um CDB de desenvolvimento remoto, que ele acessa usando o link de banco de dados cdb_dev_rem. Quando ocorre um upgrade de aplicativo em saas_sales_ac no CDB de produção, o upgrade se propaga automaticamente para a raiz de aplicativo saas_sales_test_ac no CDB de desenvolvimento remoto.
CONNECT sales_admin@saas_sales_ac
Password: ***********
CREATE PLUGGABLE DATABASE sales_sync_pdb AS PROXY FROM saas_sales_test_ac@cdb_dev_rem;
Nomes para PDBs
Os contêineres em um CDB compartilham o mesmo namespace, o que significa que eles devem ter nomes exclusivos nesse namespace.
Os nomes dos seguintes contêineres não devem entrar em conflito no mesmo CDB:
-
A raiz do CDB
-
PDBs conectados à raiz do CDB
-
Raízes do aplicativo
-
PDBs do Aplicativo
Por exemplo, se o mesmo CDB contiver os contêineres de aplicativos saas_sales_ac e saas_sales_test_ac, dois PDBs de aplicativos com o nome cust1 não poderão residir simultaneamente em ambos os contêineres. As regras de namespace também impedem a criação de um PDB chamado cust1pdb na raiz do CDB e um PDB chamado cust1pdb em uma raiz de aplicativo.
Os nomes de PDBs e contêineres raiz de aplicativos devem seguir as mesmas regras dos nomes de serviço de rede. Além disso, como um PDB ou uma raiz de aplicativo tem um serviço com seu próprio nome, o nome do contêiner deve ser exclusivo em todos os CDBs cujos serviços são expostos por meio de um listener específico. O primeiro caractere de um nome de contêiner criado pelo usuário deve ser alfabético, com os caracteres restantes alfanuméricos ou sublinhado (_). Como os nomes de serviço não fazem distinção entre maiúsculas e minúsculas, os nomes de contêiner não fazem distinção entre maiúsculas e minúsculas e estão em letras maiúsculas, mesmo que sejam especificados usando identificadores delimitados.
Consulte Também: Referência de Serviços do Oracle AI Database Net para obter as regras de nomes de serviço
Links de Banco de Dados entre PDBs
Por padrão, um usuário conectado a um PDB deve usar links de banco de dados para acessar objetos em outro PDB.
Figura 4: Link de Banco de Dados entre PDBs

Descrição da ilustração cncpt384.png
As exceções à regra incluem:
-
Um objeto comum vinculado a dados, que pode ser acessado por todos os PDBs de aplicativos que contêm um link de dados que aponta para esse objeto. Por exemplo, o contêiner de aplicativos
saas_sales_acpode conter a tabela vinculada a dadosusa_zipcodesdentro de seu aplicativo. Nesse caso, o usuário comum do CDBc##dbapode se conectar a um PDB de aplicativo nesse contêiner e, em seguida, consultarusa_zipcodesmesmo que a tabela real resida na raiz do aplicativo. Nesse caso, nenhum link de banco de dados é necessário. -
A cláusula
CONTAINERS()no SQL emitida da raiz do CDB ou da raiz do aplicativo. Usando essa cláusula, você pode consultar dados entre todos os PDBs conectados à raiz do contêiner.
Ao criar um PDB de proxy, especifique um nome de link de banco de dados na cláusula FROM da instrução CREATE PLUGGABLE DATABASE ... AS PROXY. Se o PDB do proxy e o PDB referenciado residirem em CDBs separados, o link do banco de dados deverá ser definido na raiz do CDB que conterá o PDB do proxy. O link de banco de dados deve se conectar ao PDB referenciado remoto ou à raiz do CDB do CDB remoto.
Consulte Também: "Objetos Comuns e Locais"