segunda-feira, 22 de maio de 2017

Oracle Multitenant - Arquitetura

Arquitetura Lógica de um CDB



  • CDB - Container Database, é nome que damos a toda estrutura do ambiente, ao conjunto de todos os containers, possui o container_id (con_id) igual 0, qual se refere a componentes compartilhados entre todo o ambiente.
  • CDB$ROOT - Container único e obrigatório dentro de um CDB, possuí todos os componentes e objetos comuns a todos os PDBs, possui o identificado container_id (con_id) igual 1.
  • PDB$SEED - Container único e obrigatório dentro de um CDB, é um container vázio utilizado como template  para criação de novos PDBs, possui o identificado container_id (con_id) igual 2.
  • PDBs - São container exclusivo para uso de aplicação e usuário, possuí con_id entre 3 e 252.

Arquitetura Fisica de um CDB


Apesar da mudança de arquitetura de um CDB, a oracle manteve-se fiel ao modelo tradicional, e em questão de arquitetura quase não houveram alterações no meio fisico.



  • Estruturas Fisicas Compartilhadas
    • Database Instance - Assim como um Oracle Non-CDB ou Pre-12c, possuimos uma SGA unica, as áreas de memória são compartilhadas entre todos os PDBs contidos no CDB.
    • Background Processes - Possuí os mesmo BG Processes de um modelo Non-CDB, dentro de uma arquitetura Non-CDB nenhum novo processos de Background foi adicionado.
    • Controlfiles - Um grupo de controlfiles multiplexados suportam todos a estrutura de CDB;

    • Redo Logs Groups - A configuração de Online Redo Logs se dá a nivel do CDB inteiro, as transações de todos os PDBs e CDB$ROOT são todas gravadas no mesmo conjuto de redo e são identificadas através do ID do Container, archive logs não podem se manipulados a nivel de PDB;
    • Temporary Files - Arquivos temporários criados no CDB$ROOT podem ser compartilhados entre os PDBs, porém também é possivel atribuir tablespaces temporaris dentro de PDBs;
    • Undo Tablespace Datafiles - Na versão 12.1.0.x a tablespace de Undo é unica para todos os PDBs e faz parte do CDB$ROOT;
    • CDB$ROOT System e Sysaux Tablespaces Datafiles - Essas tablespaces são compartilhadas entre os demais PDBs pois há apontamentos de dicionários comuns a todos os PDBs dentro do CDB$ROOT;
    • Arquivo de Inicialização: O Arquivo de inicialização é unico para toda instancia CDB.


  • Estruturas Fisicas Não Compartilhadas
    • Local Tablespaces Datafiles - Dentro de cada PDBs há as tablespaces System, Sysaux e Temp, no contexto de PDBs essas tablespaces/Datafiles não possuem informações que compartilhadas nos demais PDBs, assim como os datafiles de tablespaces de usários, estas estão isoladas dentro do PDB local.

O Dicionário de Dados


Em um modelo Non-CDB existe apenas um dicionário de dados, portanto o armazenamento dos metadados interno do Oracle, são compartilhado com as informações de metadados de usuários e aplicações, assim como metadados de usuários distintos ficam armazenados no mesmo dicionário.

No modelo CDB cada container possuí sua tablespace System e Syaux, possibilitando assim que cada container possua seu próprio dicionário. As informações de dicionário são divididas e armazenadas os PDBs Locais e o CDB$ROOT para afim de evitar duplicidade de dados, portanto uma tabela com definições globais são armazenadas no CDB$ROOT container e acessadas pelos PDBs Locais através de apontamentos. Assim com os objetos comuns os objetos de sistema, como dbms_output são armazenados unicamente no CDB$ROOT e são acessados pelos PDBs Locais através de ponteiros.

Essas caracteristicas proporcionam a redução de consumo de armazenamento, pois os dados não são duplicados entre containers, e o fast patching e upgrade, caso o mesmo dicionário existisse em todos os PDBs o upgrade deveria ser feito em cada PDB isoladamente.

Desenho abaixo mostra uma tabela de sistema de um PDB com apontamentos para o Dicionário do CDB$ROOT:



Views do Sistema


No Multitenant há  um novo tipo de View, CDB_*, a qual se trata de um Container Object, container objects, são objetos que possuem informações comuns a varios containers, assim como as views dinamicas GV$ / V$, também são Container Objects ou Shared Objects.

Shared Objects possuem uma nova coluna chamada de con_id, onde é possivel identificar o container a qual essa informação pertence, o resultado da saída de consultas em objetos comuns, depende da contexto ao qual esta conectado, se conectado ao CDB$ROOT a saída esperada é relacionada a todos os containers que o usuário tem permissão, se executada a partir de um PDB, a saída esperada é unicamente do PDB conectado.

As views DBA_* existem para compatibilidade de versão, porém para cada DBA_* existe uma respectiva view CDB_*.




Nenhum comentário: