sábado, 6 de maio de 2023

Como copiar bancos de dados de um NON-CDB para dentro de um CDB?


Olá, tudo bem com vocês? Espero que sim. Bem estamos aqui de volta para falar de um assunto que é até um pouco batido, mas que vale sempre uma nova releitura e um novo olhar.

É claro que hoje em dia na era CLOUD e principalmente das ferramentas automatizadas, muitos desses processos manuais de cópias de bases e construção de ambientes, ficaram perdidos ao longo do processo,  o que por sua vez não os torna menos importantes de serem revisitados.

Portanto, hoje eu vou apresentar á vocês, como COPIAR UM AMBIENTE NÃO-CDB PARA DENTRO DE UM AMBIENTE JÁ EM MULTITENANT ( PDB ).

Primeiramente vou apresentar o ambiente usado para simulação : 

Utilizamos 2 VM's em VirtualBox, com uma configuração bem pequena, apenas para atender ao LAB mesmo.

  • Sistema Operacional : Oracle Linux 7.9 ( Maipo )
  • Oracle Grid Infrastructure 12.2.0.1
  • Oracle Database EE 12.2.0.1
Este é o cenário que temos para essa atividade.

Como forma didática e também mais simples, vamos enumerar abaixo o que é necessário para a realização da atividade.

  1. Criar um usuário no ambiente não CDB com senhas e privilégios especificos, que serão apresentados aqui.
  2. Criar um "MANIFEST FILE" da base Não-CDB para verificações de incosistências e incompatibilidades entre os ambientes, também apresentaremos mais a frente.
  3. Criar um DATABASE LINK no ambiente CDB usando as credenciais criadas no item 1, para promover a cópia via DBLINK entre os Bancos.
Em resumo, são esses pequenos passos de forma MACRO que precisamos, o detalhamento eu passarei a medida que nós estaremos executando os comandos.

Bem, dito isso acima, é hora então de fazer os passos mais simples primeiro.

PASSO 1 - Criar o Manifest File no Ambiente Não-CDB

Essa etapa consiste em você usar uma procedure do dicionário de dados oracle, que lhe dará o FEEDBACK, se sua base está ou não apta a se tornar um PDB em outro ambiente.

-> DBMS_PDB.DESCRIBE : esse é o pacote que irá criar um arquivo de definições da su abase atual em formato XML, que irá determinar a aptidão do seu banco NÃO-CDB em se tornar um PDB.

exec DBMS_PDB.DESCRIBE('/home/oracle/sukuna.xml');
No meu caso, minha base NÃO-CDB se chama SUKUNA, com o comando acima eu gerarei um manifest file dentro do local determinado por mim "/home/oracle", mais isso pode ser determinado por vocês como acharem por bem, escolham e mudem o caminho do arquivo se for necessário, isso não trará prejuizo algum ao processo em si.

Observação: Se a sua base de dados estiver em modo NO ARCHIVELOG, é necessário que isso seja executado com a base em MODO READ ONLY, pois bem, caso não seja possível baixar seu banco dentro de uma janela comercial, programe-se para tal. No meu cenário ambos ambientes estavam em modo ARCHIVELOG, portanto pude fazer ONLINE sem prejuizos.


De posse do meu arquivo de MANIFEST FILE, devidamente gerado no local desejado, agora nós devemos transferi-lo para o servidor destino onde está o ambiente MULTITENANT, para que possamos executar um bloco PL/SQL que irá validar se o que contém o XML, torna apto e elegivel nosso banco a se tornar um PDB.




PASSO 2 - Avaliar as condições do Destino ( Multitenant ), de receber o novo PDB

Aqui nós iremos executar um bloco PL/SQL que pode ser encontrado na internet em qualquer pesquisa simples, obviamente que vocês podem perguntar se ele é necessário mesmo ou não? Bem, com ele evitamos surpresas em casos de problemas na criação do PDB, pois poderemos nos antecipar as VIOLAÇÕES que implicam em alguns casos de criação de novos PDBS, tais como, parametros, compatibilidades, versionamentos e etc.

set serveroutput on

DECLARE
compatible CONSTANT VARCHAR2(3) := CASE DBMS_PDB.CHECK_PLUG_COMPATIBILITY( pdb_descr_file => '/home/oracle/sukuna.xml', pdb_name => 'sukuna') WHEN TRUE THEN 'YES' ELSE 'NO'
END;
BEGIN
DBMS_OUTPUT.PUT_LINE('Is the future PDB compatible?  ==>  ' || compatible);
END;
/
Vejam como é a saida uma vez executado no ambiente CDB ( Destino ), da nossa atividade :



Pronto, já sabemos que estamos prontos para irmos de um lado para o outro, sem nenhuma intercorrência aparente.

Observação : em casos apareçam violações, vocês podem sim consultar a visão PDB_PLUG_IN_VIOLATIONS, para sanar as pendências antes de continar com a atividade, na execução da procedure acima ela irá mostrar a palavra "NO" onde tivemos o "YES" como confirmação.

PASSO 3 - Criar o usuário de transporte no ambiente ORIGEM Não-CDB

Conforme foi mencionado no inicio, devemos criar um usuário no ambiente origem da base não-CDB, para que via LINK possamos copia-la para o ambiente Multitenant.




Perfeito! agora nós iremos para nosso ambiente Multitenant e criaremos um DBLINK com nosso ambiente NÃO-CDB, para nos assegurarmos da comunicação entre ambos.



Let's Rock!!! Tudo nos conformes, comunicação criada e funcional. Notem que eu já possui um PDB no meu ambiente Multitenant, isso foi proposital, pois queria mostrar que independente de terem outros PDBS no seu ambiente Multitenant, é possivel levar novos ambientes para dentro de um mesmo CDB sem prejuizo aos demais existentes.


PASSO 4 - Criando o PDB no ambiente MultiTenant via DBLINK

Claramente estamos mais do que preparados para essa nova etapa do nosso processo, nós iremos agora de fato criar o PDB dentro do nosso CDB usando nosso canal de comunicação criado.

Vale salientar que, alguns pontos devem ser considerados, este ambiente meu é controlado, ou seja, volumetria, meios de comunicação e etc, tudo está sob meu controle, em ambientes produtivos vocês devem ter em mente que usaram REDES, CPU e TEMPO, logo para ambientes acima de TeraBytes de dados eu recomendo uma engenharia melhor, até para que não sofram com latencia de rede, gargalos de todos os tipos e principalmente concorrências entre processos dos servidores envolvidos.

create pluggable database SUKUNA FROM NON$CDB@origendblink;
Observação : aqui, neste ponto vocês podem ter algumas particularidades como por exemplo a necessidade de converter os caminhos dos arquivos, para isso basta usar o mesmo comando acima, só adicionado o parametro "FILE_NAME_CONVERT". No código acima ele é colocado logo após o nome do DBLINK, com as devidas adequações.




 Conseguimos, porém ainda não podemos abrir nosso PDB, antes de realizamor isso, precisamos executar um script que tornará nosso PDB recem-nascido em um leigitimo PDB.


Isso é o que ocorre se você não rodar o SCRIPT "noncdb_to_pdb.sql", ele geralmente pode ser encontrado dentro da ORACLE_HOME, logo que terminarmos de criar devemos executa-lo :


Este script tem uma execução bem demorada, sendo assim abram uma sessão SQL*Plus, conectem-se ao seu PDB e executem o script:



Apenas aguardem o término da execução por completo do script.



Pronto! Finalizada a execução o PDB ainda estará em modo RESTRICTED, basta proceder como na figura, um SHUTDOWN e depois STARTUP e pronto, nosso ambiente está 100% migrado para dentro do CDB.

Espero que tenham gostado, nos vemos em uma próxima oportunidade.

Sucesso á Todos!!!