Alterando CHARSET do banco

Pois bem, em algum momento em sua vida de dba ou de analista ( ou de responsável pelo banco de dados ), você se deparará com a necessidade de alterar o charset do banco de dados.

Apesar de uma tarefa “Relativamente” simples, ela poderá custar alguns minutos de indisponibilidade ou diversos valores invalidados.

Analisemos:

Você está no seu trabalho, todo feliz alegre e sorridente, cheio de coisas para fazer e descobre que é necessário alterar o charset do seu banco para que um determinado aplicativo funcione.

Opção 1: Você instala um banco do com o charset desejado;
Opção 2: Você altera o charset de seu banco em execução;
Opção 3: Você ignora, afinal você está cheio de coisas para fazer 🙂

Mas como alterar?!?!?!

[ Alterando charset de um banco em execução de maneira “segura” ]

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
alter database character set AL32UTF8;
SHUTDOWN IMMEDIATE;
STARTUP;

Lembra que eu disse que você teria indisponibilidade?

Observe as linhas :

ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;

Servem para que as jobs e os processamentos de fila de seu banco fiquem inativos, assim nada ficará destruído após a alteração.

Se voce obtiver o erro “the new character set must be a superset of the old character set” considere executar os passos abaixo:

[ Alterando charset de um banco em execução de maneira “NÃO segura” ]

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
alter database character set AL32UTF8;
SHUTDOWN IMMEDIATE;
STARTUP;

Observe a diferença dos scripts na linha

ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;

Explicação:

Para você mudar o charset de um banco, todos os caracteres já gravados no banco devem existir no novo charset.
Por exemplo, se seu banco tiver um “ç” seu charset novo precisa entender ele (LATIN1, win1252 , etc, etc ).

No exemplo inseguro, forçamos o banco a usar um charset e na hora de modificar alteramos para o mesmo charset. Isto evita a validação do banco, porém você poderá receber algums queries com valores errados como:

“VocÃ$e nÃ&oo “…

Acho que é isso 🙂

AtÃ%e Mais!

Deixe uma resposta