Viver perigosamente é assim, coisas que nunca imagina em fazer, acontecem. Um desafio que nenhum planejamento de TI consegue prever é fazer downgrade (voltar para uma versão do sistema mais antiga). Downgrade de sistemas corporativos acontecem com frequência devido ao mau planjemento da aplicação. Em momentos iluminados somos obrigados fazer também downgrade de banco de dados. Iluminados, será?
Sim, porquê atualizar para versão mais nova geralmente é mais fácil pois alguém sempre pensa na compatibilidade da versão anterior na migração, mas já imaginou migrar do PostgreSQL 8.1 para o PostgreSQL 7.4? Pois é, tive essa fantástica tarefa . =(
Se você for afortunado como eu, tem algumas dicas que podem economizar muitas horas. Caso te ajude, mande um postal ou pague uma cerveja.
1 – Se tiver muitas PL/PgSQL pode esquece o downgrade, melhor usar o dblink (está no contrib do PostgreSQL) para acessar as tabelas, pois terá muito trabalho para migrar. E não estou falando de algumas horas…
2 – O backup: Fiz alguns testes usando pg_dump do 7.4 para puxar a base mas como diz o Wilken – "Fracassei miseravelmente". Sim, se você pensou usar o paramêtro -i para ignorar a versão pode usar outra maneira pois o psql foi praticamente todo reescrito. A melhor solução foi usar o pg_dump do 8.1 para fazer o backup com a opção "–clean" porque você irá recriar essa base algumas vezes até conseguir migrar.
3 – A sintaxe das DDL (Data Definition Language): Existe algumas diferenças para criar tabelas, sequências, vou mostrar algumas diferenças encontradas nesta situação. Caso queira ler mais, veja na documentação oficial do PostgreSQL . O postgresql 8.1 depois de criar a sequência ele acrescenta "::regclass" (::regclass é uma referências de entrada de dados ou objetos de acordo com a configuração de schema do path), remova todos ::regclass que aparecerem. Dica do telles.
3.1 – Ajustando o valor da sequência: No PostgreSQL você pode criar uma sequência ou com o tipo de dados serial ele criar para você. Se sobreviver ao item 3 parabéns, o item 3.1 é mais trabalhoso porque a mudança na sintaxe deve fazer manualmente pois você precisa saber o nome da sequência. Não lembra e nem documentou o nome das sequência? Parabéns, tem um excelente motivo para fazê-lo, aproveite a oportunidade para documentar ou terá que fazer este passo novamente, perceberá como esta recomendação é importante pois sempre tem algum motivo: remodelar o banco, ajuste de perfomance, backup ou a sempre divertida tarefa de migração. Ah, claro! E o fantástico downgrade se disserem que só o Chuck Norris e você fazem. Voltando ao que interessa, no PostgreSQL 8.1 para configurar o valor da sequência é:
SELECT setval(pg_get_serial_sequence('nome_da_sequencia', 'campo'), valor, true);
No PostgreSQL 7.4 é: SELECT setval(‘nome_da_sequencia_seq’, valor, true); A diferença está como o PostgreSQL faz a chamada, no 8.1 a sequência é associada com o campo, no 7.4 é apenas a sequência com o acréscimo de sufixo _seq. 4 – Características específicas: No 8.1 tem muita novidade em relação ao 7.4 mas se as principaos num downgrade são o uso de paramêtros IN/OUT e uso de ROLES como no Oracle. Criar usuários e grupos é melhor fazer manualmente.
5 – Espero que você nunca precise de nenhuma dica acima.