Migração de encoding no PostgreSQL 8.3

Publicado por Alexandre Miguel de Andrade Souza em 09/12/2008

[ Hits: 15.297 ]

Blog: http://www.hipercenter.com

 


Migração de encoding no PostgreSQL 8.3



Com muito custo consegui encontrar um caminho para migração de encondig no PostgreSQL.

Uma vez criado um banco com uma encoding (LATIN1, SQL_ASCII, UTF8), só é possível mudá-lo fazendo um backup e recriando o banco.

Embora a documentação do PostgreSQL informe sobre a opção -E no pg_dump, falta um "pulo do gato", que é o que vai ser apresentado neste passo a passo.

1. Se for migração de servidor, altere o arquivo pg_hba.conf (geralmente em /etc/postgresql/8.x/main/pg_hba.conf) do servidor antigo para incluir a linha:

hostnossl all postgres ipnovoservidor/32 trust

2. Reinicie o PostgreSQL no servidor antigo:

# service postgresql-8.3 restart

3. Faça um "su" para o usuário postgres no servidor novo:

# su postgres

4. Gere o backup no servidor novo (se for o mesmo servidor, a opção h é desnecessária) . UTF8 é um exemplo de encoding, mas de qualquer forma é recomendado como padrão):

pg_dump -h hostanti -C -E UTF8 -U postgres bancodedados > bancodedados.sql

5. O pulo do gato: a opção -E do pg_dump gera o ARQUIVO no encoding desejado. Mas a opção -C (que copia a estrutura original), copia fielmente, a ponto de gerar a linha:

CREATE DATABASE foh WITH TEMPLATE = template0 ENCODING = 'LATIN1';

com o encoding original, o que gera erro na importação.

O MACETE É TROCAR O ENCODING PARA O CORRETO:

CREATE DATABASE foh WITH TEMPLATE = template0 ENCODING = 'UTF8';

Obs.: Se o arquivo for grande, o "mcedit" (que uso muito), não dá conta de abrir, mas o "joe" não reclama.

6. Agora é só rodar:

psql -f bancodedados.sql

Outras dicas deste autor

Instalando Kubuntu 7.10 com proxy

Permitindo conexão ao banco no PostreSQL 8.3

Leitura recomendada

Documentação online do PostgreSQL

PostgreSQL: Fazendo backup de um servidor inteiro

PostgreSQL 9.1 64 bits - Instalação no Debian Squeeze

Autovacuum do PostgreSQL

Evitando erros ao indexar campos timestamp em SQL

  

Comentários
[1] Comentário enviado por hmascarello em 19/11/2009 - 22:48h

Experimente baixar o arquivo HSQL do debian.
Muito bom executar comandos SQL para quem não sabe nada.

[2] Comentário enviado por ricelsouza em 13/01/2010 - 10:01h

Olá,

Utilizo o Postrgres 8.3 e tenho bases nesse banco com ecoding UTF8.
Tento criar uma nova dase de dados em LATIN1 e recebo uma mensagem dizendo que não é possivel criar a base e que o encoding escolhido é imcompatível com o encoding do servidor (que é UTF8).
Não acredito que o Postgres 8.3 não permita criar bases com encoding diferentes em um mesmo server.
Estou querendo criar uma base em LATIN1 e migrar uma das bases de dados (que está como UTF8) sem perder os dados.
Como resolver esse problema?
Eu poderia fazer o backup da minha base em LATIN1, mesmo que a minha base esteja em utf8? Haveria perda de dados ou problema na hora de restaurar o banco?

Aguardo retorno.

Obrigado.

[3] Comentário enviado por alexandremas em 13/01/2010 - 10:41h

Minha experiência é que não é possível ter encodings diferentes no mesmo server.
Isso evita problemas na manutenção.
Para converter o seu banco utf-8 para o latin1, e restaurá-lo em um server latin1, o procedimento é o mesmo acima.
Minha recomendação, é que por padrão, vc utilize o server em utf-8. é o futuro.

mas se por algum motivo vc precisa, siga o tutorial acima, alterando a linha do passo 4 para

pg_dump -h hostanti -C -E LATIN1 -U postgres bancodedados > bancodedados.sql

e no passo 5, altere a linha do arquivo para

CREATE DATABASE foh WITH TEMPLATE = template0 ENCODING = 'LATIN1';

não haverá problema ao restaurar o banco em um server LATIN!



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts