Pergunta

Qual é a melhor maneira de salvar meu modelo de dados MySQL e aplicar automaticamente alterações no meu servidor de banco de dados de desenvolvimento conforme elas são feitas (ou pelo menos todas as noites)?

Por exemplo, hoje estou trabalhando no meu projeto e criar esta tabela no meu banco de dados, e salve a instrução no arquivo SQL para implantar para a produção posteriormente:

create table dog (
  uid int,
  name varchar(50)
);

E amanhã, eu decido que quero gravar a raça de cada cachorro também. Então, eu altero o arquivo SQL para ler:

create table dog (
  uid int,
  name varchar(50),
  breed varchar(30)
);

Esse script funcionará em produção para o primeiro lançamento, mas não me ajudará a atualizar meu banco de dados de desenvolvimento porque ERROR 1050 (42S01): Table 'dog' already exists. Além disso, não funcionará na produção se essa alteração foi feita após o primeiro lançamento. Então eu realmente preciso ALTER a tabela agora.

Então agora tenho duas preocupações:

  1. É assim que eu deveria estar salvando meu modelo de dados (um monte de instruções de criação em um arquivo SQL) e
  2. Como devo aplicar alterações como essa no meu banco de dados?

Meu objetivo é liberar mudanças com precisão e permitir a integração contínua. Eu uso uma ferramenta chamada DDLSYNC encontra e aplica diferença em um banco de dados Oracle, mas não tenho certeza de quais ferramentas semelhantes existem para o MySQL.

Foi útil?

Solução

No trabalho, desenvolvemos um pequeno script para gerenciar nosso versão em banco de dados. Toda alteração em qualquer tabela ou conjunto de dados obtém seu próprio arquivo SQL.

Os arquivos são numerados sequencialmente. Acompanhamos quais arquivos de atualização foram executados armazenando essas informações no banco de dados. O script insere uma linha com o nome do arquivo quando o arquivo está prestes a ser executado e atualiza a linha com um registro de data e hora de conclusão quando a execução terminar. Isso é embrulhado dentro de uma transação. (Vale lembrar que os comandos DDL no MySQL não podem ocorrer dentro de uma transação. Qualquer tentativa de executar o DDL em uma transação causa um compromisso implícito.)

Como os arquivos SQL fazem parte do nosso repositório de código -fonte, podemos fazer com que a execução da atualização do script parte do processo de lançamento normal. Isso facilita a manutenção do banco de dados e o código em sincronia como torta. Honestamente, a parte mais difícil é garantir que outro Dev não tenha pegado o próximo número em um compromisso pendente.

Combinamos este sistema de atualização com uma limpeza noturna (opcional) do nosso banco de dados dev, substituindo o conteúdo pelo backup do sistema ao vivo da noite passada. Depois que o backup é restaurado, a atualização é executada, com os arquivos de atualização pendentes sendo executados no processo.

A restauração ocorre de tal maneira que apenas as tabelas que estavam no banco de dados ao vivo são substituídas. Qualquer atualização que adiciona uma tabela, portanto, também deve ser responsável por adicioná -la apenas se não existir. DROP TABLE IF EXISTS é útil. Infelizmente, nem todos os bancos de dados suportam que, portanto, o sistema de atualização também permite a execução de scripts escritos em nosso idioma de escolha, não apenas SQL.

Tudo isso em cerca de 150 linhas de código. É tão fácil quanto ler um diretório, comparar o conteúdo com uma tabela e executar qualquer coisa que ainda não tenha sido executada, em uma ordem determinada.

Outras dicas

Existem ferramentas padrão para isso em muitas estruturas: o Rails tem algo chamado Migrações, algo que é facilmente replicado no PHP ou em qualquer linguagem semelhante.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top