Social Icons

5 de set. de 2026

Alteraçao rápida de Character Set em um PDB usando a cláusula INTERNAL_USE


 
 
Olá, pessoal!

     No post de hoje vou mostrar de forma rápida como alterar o character set de um Pluggable Database (PDB), um procedimento que não executamos com frequência no dia a dia, mas que é extremamente útil quando necessário. Recentemente precisei alterar o character set de um PDB para WE8ISO8859P1 e resolvi compartilhar o procedimento aqui no blog.

     Em ambientes Multitenant (Oracle 12c em diante), é muito comum ter um character set configurado no Container Database (CDB) e precisarmos de um conjunto de caracteres diferente em um PDB específico para atender a requisitos de aplicações legadas ou projetos de consolidação.

     Existem diferentes formas de realizar essa mudança de character set, tais como:
          1. Usar o Data Pump (Export/Import);
          2. Realizar o procedimento de Unplug/Plug do PDB;
          3. Utilizar o utilitário DMU (Database Migration Assistant for Unicode);
          4. Utilizar a cláusula INTERNAL_USE no comando ALTER DATABASE.

     Cada opção possui suas vantagens e desvantagens. Nosso foco neste post será abordar a opção 4, que é a mais rápida, porém é a que também oferece maior risco de ocasionar inconsistências nos dados, caso seja usada incorretamente.

     Por que escolhi falar da opção mais "perigosa"? Uai! Porque ela é extremamente rápida e muito útil quando você tem certeza absoluta de que o character set do PDB é um superset do character set do CDB root, por exemplo, CDB com WE8ISO8859P1 recebendo um PDB com AL32UTF8. Você também pode mudar quando o caso for o contrário, ou seja, quando o CDB tem um character set que é superset do outro que será alterado no PDB, e este foi exatamente o meu caso, onde alterei o character do PDB de AL32UTF8 para WE8ISO8859P1, o que oferecia grandes riscos de corrompimento de dados, mas fiz validações manuais, vi que deu certo, e ganhei muito tempo nessa alteração (em comparação com o uso de ferramentas mais segura, como o DMU)!

     A cláusula INTERNAL_USE, que é utilizada junto com a instrução ALTER DATABASE CHARACTER SET, trata-se de um método não documentado oficialmente e foi criada para uso interno do suporte da Oracle e uso em ferramentas de migração. Ela atua substituindo diretamente e "sem dó", os metadados do dicionário de dados do PDB, sem afetar o CDB como um todo. Apesar de não encontrar documentações oficiais sobre ela, você encontrará alguns docs no MOS falando sobre o assunto (Ex.: Doc Id 225912.1).

⚠️ CUIDADO!
Por ignorar as validações que o DMU, por exemplo, faz, e forçar a alteração diretamente no dicionário de dados, utilize este método somente quando tiver certeza de que não haverá desfiguração de caracteres especiais ou acentuação. Por precaução, faça um backup antes de executar o procedimento que será mostrado a seguir.


--------------------------------------------------------------------------------
PASSO A PASSO
--------------------------------------------------------------------------------

1- Conectar e alterar o contexto para o PDB:
Conecte-se como SYSDBA e altere a sessão para o PDB alvo (neste exemplo, admhm19c):
SQL> ALTER SESSION SET CONTAINER = admhm19c;

2- Baixar o PDB e reabri-lo em modo restrito:
Para aplicar a alteração do dicionário de dados, o PDB deve estar aberto em modo READ WRITE RESTRICTED:
SQL> ALTER PLUGGABLE DATABASE CLOSE IMMEDIATE;
SQL> ALTER PLUGGABLE DATABASE OPEN READ WRITE RESTRICTED;

3- Alterar o Character Set com INTERNAL_USE:
Execute o comando ALTER DATABASE informando o novo character set desejado:
SQL> ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;

4- Reiniciar o PDB no modo normal:
Após a execução com sucesso, feche e reabra o PDB no modo normal para consolidar as alterações:
SQL> ALTER PLUGGABLE DATABASE admhm19c CLOSE;
SQL> ALTER PLUGGABLE DATABASE admhm19c OPEN;

5- Validar a alteração:
Confirme a alteração consultando a visão V$NLS_PARAMETERS dentro do PDB:
SQL> SELECT PARAMETER, VALUE 
     FROM V$NLS_PARAMETERS 
     WHERE PARAMETER = 'NLS_CHARACTERSET';

O parâmetro NLS_CHARACTERSET deverá refletir o novo valor (AL32UTF8), como pode ser observado na imagem abaixo:
 


Pronto! Procedimento finalizado em poucos minutos.
Espero que esta dica te ajude em algum momento!

[ ]s
Fábio Prado




0 comments:

Postar um comentário

 

LINKS ÚTEIS

Total de visualizações de página

Seguidores

Meu One Drive (antigo Sky Drive)