PostgreSQL: migrando de LATIN1 pra UTF-8

Pra padronizar meus sistemas, resolvi migrar as bases de LATIN1 pra UTF8. Sei que alguns não vão concordar com minha escolha mas enfim. Segue os passos que eu fiz em um servidor RedHat5 (testei com Debian e funcionou também) com a versão 8.1 do PostgreSQL. Fiz com uma base de em torno de 800Mb.
Recomendo que teste em um ambiente separado antes de aplicar na produção. Use por conta e risco.

Primeiro pare todos os serviços que utilizam o banco (ex. stop no apache, tomcat, jboss) para ninguém (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 software iconv para conversão

iconv -f iso-8859-1 -t utf-8 bancoL.sql > bancoU.sql

abra o arquivo bancoL.sql (de preferencia use o vim pra editar)
e no inicio aí pela linha 7, onde tem “SET client_encoding = ‘LATIN1′;” troque LATIN1 por UTF8

Com banco fazer:

faça um backup é claro
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 com UTF8
createdb -h localhost -E UTF8 -U usuario_banco meu_banco

e agora restaure o banco “uteéfeoitoado” :)
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 post passado que eu fiz.

PostgreSQL: função TO_ASCII em banco UTF-8

a função TO_ASCII no postgresql é muito util principalmente para buscas onde se quer ignorar acentos em string. Ela funciona bem quando o banco de dados estiver em LATIN1 por exemplo.

SELECT TO_ASCII('tchê'); -- retorna 'tche'

mas quando usamos ela em um banco UTF8 retorna o erro “conversão de condificação de UTF8 para ASCII não é suportada”.

Para contornar isso criei uma função SEM_ACENTO para usar no lugar da TO_ASCII.

CREATE OR REPLACE FUNCTION sem_acento(text)
RETURNS text AS
$BODY$
select
translate($1,'áàâãäéèêëíìïóòôõöúùûüÁÀÂÃÄÉÈÊËÍÌÏÓÒÔÕÖÚÙÛÜçÇ','aaaaaeeeeiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcC');
$BODY$
LANGUAGE 'sql' IMMUTABLE STRICT;

Tamanho das tabelas no PostgreSQL

Hoje precisava saber a relação das tabelas do meu banco e principalmente o tamanho de cada tabela. Pesquisando um pouco montei o seguinte SQL.

SELECT esquema, tabela,
       pg_size_pretty(pg_relation_size(esq_tab)) AS tamanho,
       pg_size_pretty(pg_total_relation_size(esq_tab)) AS tamanho_total
  FROM (SELECT tablename AS tabela,
               schemaname AS esquema,
               schemaname||'.'||tablename AS esq_tab
          FROM pg_catalog.pg_tables
         WHERE schemaname NOT
            IN ('pg_catalog', 'information_schema', 'pg_toast') ) AS x
 ORDER BY pg_total_relation_size(esq_tab) DESC;

a coluna tamanho mostra o tamanho que os registros (tuplas) da tabela está ocupando no disco, e a coluna tamanho_total inclui também os TOASTs e os índices associados à tabela.

Qualquer outra sujestão é bem vinda :)

PgAdmin3 1.6.3 no Ubuntu Feisty

Hoje, eu acessei o site do pgadmin pra ver novidades e.. pra minha surpresa eles disponibilizaram um repositório pro Dapper e pro Feisty para a ultima versão estável do PgAdmin (1.6.3) pois no repositório do ubuntu está a 1.4.3
Para instalar é necessário habilitar o repositório universe. Segue os comandos pra instalação/atualização.

sudo wget -q -O - http://www.pgadmin.org/pgp/archive_key_debian_ubuntu.gpg | apt-key add -
sudo echo "deb ftp://ftp2.br.postgresql.org/postgresql/pgadmin3/release/ubuntu feisty pgadmin" >> /etc/apt/source.list
sudo apt-get update
sudo apt-get install pgadmin3

Execute o comando pgadmin3 ou acesse no menu o programa instalado.
Ao executar, a primeira tela, já se nota algumas diferenças na interface.
é possivel gerar templates de scripts de INSERT, UPDATE e SELECT

no editor de SQL teve algumas mudanças:
é possivel fazer um Ctrl+C na tabela de resultados da pesquisa e colar o resultado numa planilha (Excel ou OO.Calc) ou até num TXT.
o resultado pode ser exportado pra CSV e HTML (recurço Quick Report muito bom pra gerar relatorios de estatisticas e enviar pra tomadores de decisões)
é possivel gerenciar SQLs favoritos (como no Firefox)
o autocomplete deixou a desejar um pouco… funciona +- para operações de manutenção no banco como um ALTER TABLE tabela ADD …; ainda nao é bom como o do Toad que tem pro Oracle que tem autocomplete até para alias das tabelas.
e tem também o Scratch Pad que é como um bloquinho de notas pra copiar e colar textos, sql, etc..

bom.. de modo geral está melhor q a 1.4.3 mas acho q ainda teria pontos a melhorar, principalmente no autocomplete no editor, derepente alguns gráficos nas estatisticas pra administração e derepente até um Query Builder como o que tem pro MySQL.

A nova versão (1.8.0) já está saindo do forno