Para migração de bases, de LATIN1 pra UTF8 no postgresql, não existe uma ferramenta pronta para tal tarefa. Para tal, foi desenvolvido um roteiro (testado em um servidor RedHat5 e Debian 5 com PostgreSQL 8.1 em uma base de em torno de 2 Gb).
Recomendado que teste em um ambiente separado antes de aplicar o procedimento produção.
Primeiro, pare todos os serviços que utilizam o banco (ex. apache/php, tomcat, jboss) para não ter o risco de nenhum usuários alterar o banco durante o processo.
Nos comandos abaixo, substitua:
usuario_banco = usuário dono do banco, com permissões de apagar e criar bancos
meu_banco = o banco que vc quer fazer a migração
fazer um backup em texto plano
/usr/bin/pg_dump -i -h localhost -U usuario_banco -F p -D -v -f bancoL.sql meu_banco
Aqui está o segredo. Use o comando iconv para conversão:
iconv -f iso-8859-1 -t utf-8 bancoL.sql > bancoU.sql
Abra o arquivo bancoU.sql e no inicio, por volta da linha 7, onde tem “SET client_encoding = ‘LATIN1’;” troque LATIN1 por UTF8.
Com banco fazer:
Faça um backup, por garantia.
pg_dump -U usuario_banco -i -F c -b -f banco.backup meu_banco
Agora apague o banco inteiro
dropdb -h localhost -U usuario_banco meu_banco
crie-o em UTF8
createdb -h localhost -E UTF8 -U usuario_banco meu_banco
e agora restaure o banco convertido.
psql -h localhost -U usuario_banco -d meu_banco < bancoU.sql
caso use em seus SQL a função TO_ASCII, com UTF-8 ela não irã funcionar. Veja aqui a alternativa em um artigo passado.