Como você lida com implantações de alterações no banco de dados?

13

Hoje discutimos técnicas de implantação de banco de dados, tivemos algumas falhas recentes em nosso processo atual e vimos situações em que gostaríamos de reverter uma implantação, mas a versão antiga do aplicativo nunca havia sido testada em relação à nova versão do base de dados.

Por um lado, há implantações no estilo de migração, nas quais você tem uma instrução de versão para cima e uma versão para baixo (sejam elas escritas em SQL ou na linguagem do aplicativo) e seu aplicativo sabe qual versão precisa acessar.

Isso é simples e, como não reverteremos com frequência, os desenvolvedores estão interessados ​​em simples. No entanto, há riscos ao adicionar um campo / tabela e esse campo é preenchido antes de você reverter. Ou pior, onde você solta dados relevantes para a versão anterior.

Por outro lado, podemos considerar uma abordagem de upgrade, reversão e rollforward em que a reversão não é tão drástica quanto nas migrações. Por exemplo, a atualização pode adicionar um campo não anulável; a reversão o torna anulável para que o aplicativo antigo não se importe; o rollforward preenche os campos nulos e o torna não anulável novamente.

Isso retém os dados, mas é complicado de codificar e testar (infelizmente, nossos testes de integração automatizados são praticamente inexistentes e, enquanto estamos corrigindo isso, temos um problema nesse meio tempo).

Existem maneiras seguras de mitigar os problemas com elas? Existem outras opções que devo considerar? Você já teve experiências ruins que gostaria de compartilhar e que podem me salvar depois?

pdr
fonte

Respostas:

9

As alterações no banco de dados devem ser tratadas como todas as outras alterações e implantadas como scripts como parte da implantação (e, é claro, salvas no controle de origem). Como eles são implantados com o código para a mesma versão do aplicativo, você sabe exatamente o que precisa ser revertido. Você pode ter uma ideia e escrever um script para desfazer cada alteração no momento em que escreve o script do banco de dados, mas se as reversões não forem comuns, convém fazer isso. Se uma nova coluna for preenchida, você perderá dados se retornar ao banco de dados original.

No SQL Server, você pode tirar um instantâneo antes de uma implantação e retornar a ela imediatamente se a implantação falhar. Isso pressupõe que a implantação NÃO está acontecendo quando os usuários estão no sistema (você não deseja perder as alterações nos dados). Isso é mais útil durante uma versão principal, quando você pode precisar desativar temporariamente todo o sistema para fazer a atualização. Ou ainda é possível tirar o instantâneo e fazer uma comparação de banco de dados entre o instantâneo e o banco de dados para ver as diferenças, se você precisar reverter. Uma ferramenta como o SQLCompare pode até gerar o código para retornar à estrutura do instantâneo. Não sei o que está disponível para outros bancos de dados.

HLGEM
fonte
3

As alterações em uma estrutura de banco de dados devem ser automatizadas / com script e testadas usando um ambiente de teste. Alterações manuais são muito arriscadas em um ambiente de produção

A única estratégia de reversão razoável (aquela com a menor probabilidade de piorar as coisas) é voltar a um instantâneo de pré-atualização. Se tudo der errado, isso acontecerá com rapidez suficiente para torná-lo administrável voltar ao instantâneo ou tarde demais para uma reversão (o próximo relatório de final de semana falha devido a problemas no banco de dados).

As alterações podem ser feitas de forma incremental (como adicionar um campo) e, portanto, testadas ao vivo com menos riscos do que quando todas são executadas de uma só vez.

Com o planejamento, você pode fazer alterações no banco de dados para oferecer suporte a várias versões futuras, em vez de precisar confrontar a atualização do software e do banco de dados a cada versão.

Esteja preparado para estar no modo de emergência nos dias seguintes a uma atualização do banco de dados, como faria se fosse uma atualização de software.

Resista ao desejo de corrigir problemas manualmente. Use sua estratégia de contingência (reversão, instantâneo) e, em seguida, pense por que as coisas deram errado antes de tentar a atualização novamente.

Apalala
fonte