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.






on Sep 12th, 2006 at 07:52
Cara, qual foi o motivo ou situação que te obrigou a fazer este downgrade? era impossível continuar na versão 8.1?
on Sep 12th, 2006 at 08:30
Hummmm, bacana.
Não darai para usar a versão free do EMS PostgreSQL Manager ?
Assim é menos trabalhoso o trabalho com as DDLs do banco, pelo menos o ajuste é mais WYSYWYG.
Boa sorte!
on Sep 12th, 2006 at 09:12
eh, já precisei fazer algo parecido, dowgrade do 7.4.8 pro 7.4.3, era um pé no saco, ficava o dia todo populando a desgraça e acertando os erros …
on Sep 12th, 2006 at 11:16
Legal seu relato Fike, imagino que tenha sofrido um bocado…rsrsrs…
Estou tentando migrar do 7.4 para o 8.1, com um downtime mínimo de 3 dias devido ao volume da base de dados ser monster… mas o que eu queria saber mesmo fike, é o motivo pelo qual seu upgrade não deu certo… tipo, os php’s dos apaches não conseguiram falar com o banco novo? O que rolou ae?
De qq forma, valeu pela dica ae
on Sep 12th, 2006 at 21:15
O sufixo do _seq só existe quando você cria uma sequência implícita utilizando o tipo de dados serial. Isso vale para versões mais recentes do PostgreSQL também.
Uma coisa que também pode ser traumatizante é se as funções no 8.x utilizarem a notação de “dollar quoting” que não é suportada nas versões anteriores. Isso é muito chato de arrumar.
A parte de controle de exceções é outra coisa que surgiu só a partir da 8.0. Se as funções utilizarem isso, você terá sérios problemas no dowgrade!
Gostei do artigo cara… ficou ótimo!
on Sep 12th, 2006 at 21:32
Respondendo:
1 - O downgrade foi para homologar o banco na mesma versão da aplicação. O SO oficialmente suporta o 7.4. =(
2 - Não tenho acesso remoto ao banco de dados, só local, então minha ferramenta é o psql.
4 - Mesma resposta do comentário 2.
on Aug 24th, 2007 at 17:12
ser ouñ ser es a questão!!!
on Dec 12th, 2008 at 14:50
Olá!!
Estou conhecendo agora o sofrimento que você teve. A nossa equipe de desenvolvimento desenvolveu e testou o software num PostgreSQL 8.3. Depois a analista fez um monte de pré-cadastros que são feitos por nós e não pelo usuário(mas bota um monte nisso, sem falar de alguns dados muito volumosos que ninguém sabe me dizer de onde foram importados).
E derrepente descobriram que o servidor que foi locado para isso tem o 8.0… E que não tem como atualizar(pelo menos os responsáveis não querem fazê-lo). Em uma base com o 8.1(depois de algumas funções novas e de um pg_dump totalmente novo) funciona. O problema é na 8.0(antes destas funções novas e do pg_dump novo)…
Mas que nada, a gente sofre mas se diverte!!