Como você versão seu esquema de banco de dados? [fechadas]

128

Como você prepara seus deltas SQL? você salva manualmente cada SQL que altera o esquema em uma pasta delta ou tem algum tipo de processo de difusão automatizado?

Estou interessado em convenções para versionar o esquema do banco de dados junto com o código-fonte. Talvez um gancho de pré-confirmação que difira o esquema?

Além disso, quais opções para deltas diferentes existem além do DbDeploy ?

EDIT: vendo as respostas, gostaria de esclarecer que estou familiarizado com o esquema padrão para executar uma migração de banco de dados usando deltas. Minha pergunta é sobre como criar os próprios deltas, de preferência automaticamente.

Além disso, o versionamento é para PHP e MySQL, se isso faz diferença. (Sem soluções Ruby, por favor).

Eran Galperin
fonte
Eu uso o schemasync para gerar um patch (e um script de reversão). Eles são adicionados ao repositório SVN. Não é perfeito, mas funciona bem para mim. Além disso, a implantação de alterações de esquema é muito fácil com schemasync
Jay Sidri
Este link parece vazio - isso ainda existe?
jocull
Parece que foi movido: github.com/mmatuson/SchemaSync
Jay Sidri

Respostas:

61

Vejo

Existe um sistema de controle de versão para alterações na estrutura do banco de dados?

Como eu versão meu banco de dados MS SQL no SVN?

e artigo de Jeff

Obtenha seu banco de dados sob controle de versão

Sinto sua dor e gostaria que houvesse uma resposta melhor. Isso pode estar mais próximo do que você estava procurando.

Mecanismos para rastrear alterações no esquema do banco de dados

Geralmente, sinto que não há uma solução adequada e aceita para isso, e eu mesmo passo nessa área.

harpo
fonte
Como você pode ver na minha pergunta, estou ciente do conceito de deltas. Minha pergunta é sobre convenções para criá-las, de preferência automaticamente.
Eran Galperin
Acho que vou estar rolando o meu próprio país, então ...;)
Eran Galperin
Você já experimentou o DBDiff: github.com/DBDiff/DBDiff ? É uma boa opção para o que você procura @EranGalperin, pois faz migrações automatizadas para esquema e dados em SQL. Divulgação Eu sou o desenvolvedor por trás disso!
Jasdeep Khalsa
4

Se você ainda está procurando opções: dê uma olhada no neXtep designer. É um ambiente de desenvolvimento de banco de dados GPL gratuito, baseado nos conceitos de controle de versão. No ambiente, você sempre trabalha com entidades com versão e pode se concentrar no desenvolvimento do modelo de dados. Depois que uma liberação é concluída, o mecanismo de geração SQL conectado ao sistema de controle de versão pode gerar qualquer delta necessário entre duas versões e oferecerá algum mecanismo de entrega, se necessário.

Entre outras coisas, você pode sincronizar e reverter a sincronização de seu banco de dados durante desenvolvimentos, criar diagramas de modelo de dados, consultar seu banco de dados usando clientes SQL integrados, etc.

Dê uma olhada no wiki para obter mais informações: http://www.nextep-softwares.com/wiki

Atualmente, ele suporta Oracle, MySql e PostgreSql e está em java, para que o produto seja executado no Windows, Linux e Mac.

Christophe Fondacci
fonte
3

Garanto que as alterações de esquema sejam sempre aditivas. Portanto, não descarto colunas e tabelas, porque isso zaparia os dados e não pode ser revertido mais tarde. Dessa forma, o código que usa o banco de dados pode ser revertido sem perder dados ou funcionalidade.

Eu tenho um script de migração que contém instruções que criam tabelas e colunas se elas ainda não existirem e as preenchem com dados.

O script de migração é executado sempre que o código de produção é atualizado e após novas instalações.

Quando gostaria de eliminar algo, faço isso removendo-os do script de instalação do banco de dados e do script de migração, para que esses elementos obsoletos do esquema sejam gradualmente eliminados em novas instalações. Com a desvantagem de que novas instalações não podem fazer o downgrade para uma versão mais antiga antes da instalação.

E é claro que executo DDLs por meio desses scripts e nunca diretamente no banco de dados para manter as coisas sincronizadas.

Calmarius
fonte
2

Eu não gerencio deltas. Eu faço alterações em um banco de dados mestre e tenho uma ferramenta que cria um script de construção baseado em XML com base no banco de dados mestre.

Quando chega a hora de atualizar um banco de dados existente, tenho um programa que usa o script de construção baseado em XML para criar um novo banco de dados e as tabelas básicas. Em seguida, copio os dados do banco de dados antigo usando INSERT INTO x SELECT FROM ye aplico todos os índices, restrições e gatilhos.

Novas tabelas, novas colunas, colunas excluídas são tratadas automaticamente e, com alguns truques para ajustar a rotina de cópia, posso lidar com renomeação de colunas, alterações de tipo de coluna e outras refatorações básicas.

Eu não recomendaria esta solução em um banco de dados com uma quantidade enorme de dados, mas atualizo regularmente um banco de dados com mais de 1 GB e 400 tabelas.

Darrel Miller
fonte
Isso parece um pouco complicado, especialmente quando se lida com vários desenvolvedores. Além disso, o processo de compilação parece exigente e eu gostaria de ser o mais simples possível.
Eran Galperin
Admito que demorou um pouco para acertar, mas agora não requer quase nenhum esforço para preparar uma atualização e muito menos para executá-la. Além disso, uma coisa que eu gosto é que eu posso fazer alterações provisórias de hotfix e isso não tem impacto no procedimento de atualização. Cada atualização é um novo banco de dados novo.
Darrel Miller
2

Você não mencionou qual RDBMS está usando, mas, se for o MS SQL Server, o SQL Compare da Red-Gate nos foi indispensável na criação de deltas entre os scripts de criação de objetos.

jalbert
fonte
1
É para Mysql, eu atualizei a minha pergunta
Eran Galperin
2

Não sou do meu jeito, mas desenvolvi um aplicativo Web interno para rastrear alterações nos esquemas de banco de dados e criar scripts de atualização com versão.

Essa ferramenta é chamada Brasil e agora é de código aberto sob uma licença do MIT. O Brasil é baseado em ruby ​​/ ruby ​​on rails e suporta a implantação de alterações em qualquer banco de dados suportado pelo Ruby DBI (MySQL, ODBC, Oracle, Postgres, SQLite).

O suporte para colocar os scripts de atualização no controle de versão está planejado.

Joakim Bodin
fonte
O Brasil parece muito bom, muito ruim eu estou usando principalmente PHP. Já pensou em portar o sistema?
Eran Galperin
1

Estamos exportando os dados para um formato portátil (usando nossa cadeia de ferramentas) e depois importando-os para um novo esquema. não há necessidade de delta SQL. Altamente recomendado.

Shachar
fonte
3
O que é esse formato portátil? e como você o importa para o novo esquema, aplicando apenas as diferenças da versão anterior?
Eran Galperin
1

Eu uso o banco de dados Firebird para a maior parte do desenvolvimento e uso a ferramenta de administração FlameRobin . Tem uma boa opção para registrar todas as alterações. Ele pode registrar tudo em um arquivo grande ou um arquivo por alteração no banco de dados. Eu uso essa segunda opção e, em seguida, guardo cada script no software de controle de versão - anteriormente usei o Subversion, agora uso o Git.

Suponho que você possa encontrar alguma ferramenta MySQL que tenha o mesmo recurso de registro que o FlameRobin faz para o Firebird.

Em uma das tabelas do banco de dados, eu armazeno o número da versão da estrutura do banco de dados, para poder atualizar qualquer banco de dados facilmente. Também escrevi um script PHP simples que executa esses scripts SQL um a um em qualquer banco de dados de destino (o caminho do banco de dados e o nome de usuário / senha são fornecidos na linha de comando).

Há também uma opção para registrar todas as instruções DML (inserir, atualizar excluir), e eu a ativo enquanto modifico alguns dados 'padrão' que cada banco de dados contém.

Escrevi um bom artigo sobre como faço tudo isso em detalhes. Você pode fazer o download do artigo no formato .pdf, juntamente com os scripts PHP de demonstração aqui .

Milan Babuškov
fonte
1

Também desenvolvi um conjunto de scripts PHP em que os desenvolvedores podem enviar seus scripts deltasql para um repositório central.

Em uma das tabelas do banco de dados (chamada TBSYNCHRONIZE), eu armazeno o número da versão do script executado mais recente, para poder atualizar facilmente qualquer banco de dados usando a interface da web ou um cliente desenvolvido de propósito para o Eclipse.

A interface da web permite gerenciar vários projetos. Ele também suporta "ramificações" do banco de dados.

Você pode testar o aplicativo em http://www.gpu-grid.net/deltasql (se você fizer login como administrador com a senha testdbsync). O aplicativo é de código aberto e pode ser baixado aqui: http://sourceforge.net/projects/deltasql

O deltasql é usado produtivamente na Suíça e na Índia e é popular no Japão.

Tiziano Mengotti
fonte
1

Alguns meses atrás, procurei a ferramenta para versionar o esquema do MySQL. Encontrei muitas ferramentas úteis, como migração de doutrina, migração de RoR, algumas ferramentas escritas em Java e Python.

Mas nenhum deles satisfez meus requisitos.

Minhas exigências:

  1. Sem requisitos, exclua PHP e MySQL
  2. Nenhum arquivo de configuração de esquema, como schema.yml no Doctrine
  3. Capaz de ler o esquema atual da conexão e criar um novo script de migração, que representa o esquema idêntico em outras instalações do aplicativo.

Comecei a escrever minha ferramenta de migração e hoje tenho a versão beta.

Por favor, tente, se você tiver interesse neste tópico. Envie-me solicitações futuras e relatórios de erros.

Código-fonte: bitbucket.org/idler/mmp/src Visão geral em inglês: bitbucket.org/idler/mmp/wiki/ Visão geral da casa em russo: antonoff.info/development/mysql-migration-with-php-project

Maxim Antonov
fonte
Você também tem uma nova ferramenta: DBV: stackoverflow.com/a/13837473/6309
VonC 12/12/12
1

Para MySQL

Quando aterro em um novo banco de dados:

Primeiramente, verifico a estrutura:

mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB1_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_1.sql
mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB2_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_2.sql
diff FILENAME_1.sql FILENAME_2.sql > DIFF_FILENAME.txt
cat DIFF_FILENAME.txt | less

Graças aos usuários do stackoverflow, eu poderia escrever esse script rápido para encontrar diferenças de estrutura.

src: https://stackoverflow.com/a/8718572/4457531 & https://stackoverflow.com/a/26328331/4457531

Em uma segunda etapa, verifico os dados tabela a tabela com mysqldiff. É um pouco arcaico, mas um loop php baseado em information_schemadados faz o trabalho certamente

Para a versão, uso da mesma maneira, mas formato um script de atualização SQL (para atualização ou reversão) com resultados diff e uso a convenção de número de versão (com várias modificações, o número da versão se parece com um endereço IP) .

initial version : 1.0.0
                  ^ ^ ^
                  | | |
structure change: - | |
datas added: -------- |
datas updated: --------
Nolwennig
fonte
0

Estou usando controle de versão estrito do esquema do banco de dados (rastreado em uma tabela separada). Os scripts são armazenados no controle de versão, mas todos verificam a versão atual do esquema antes de fazer qualquer alteração.

Aqui está a implementação completa do SQL Server (a mesma solução pode ser desenvolvida para o MySQL, se necessário): Como manter a versão do esquema do banco de dados do SQL Server

Zoran Horvat
fonte
Acabei de ler o seu artigo. Você ainda usa ou adotou uma solução pronta para uso, como DBUp ou ReadyRoll?
David Atkinson
Atualmente, todos os meus projetos contam com o Entity Framework Code-First e uso suas migrações para a versão do banco de dados. Eu tenho a solução do artigo em alguns projetos herdados e nunca a substituí. Em outros projetos, usei as ferramentas Redgate para gerenciar esquemas e migrações.
Zoran Horvat
Ótimo que você é um usuário do Redgate! Se você quiser usar ferramentas RedGate em conjunto com a EF, é possível: red-gate.com/blog/database-lifecycle-management/...
David Atkinson
Vou tentar na próxima oportunidade. Isso nos serviu bem, mas, enquanto isso, mudei de equipe e agora estou experimentando o suporte nativo da EF antes de avançar.
Zoran Horvat
0

Após uma longa investigação, descobri que existem algumas ferramentas de terceiros ou tipos de projetos do Visual Studio que não me satisfazem, ou apenas blogs sobre a teoria, mas nenhuma implementação. Então, implementei um sistema de trabalho, usado quase um ano, e expliquei aqui:

http://nalgorithm.com/2015/11/09/database-versioning-part-1/

dependendo do interesse, continuará escrevendo mais.

Yuksel Daskin
fonte
2
Olá, bem-vindo ao SO. Esta resposta não é realmente completa, basicamente fornece apenas um link. As respostas somente para links não são as melhores: se o link se tornar inválido, sua resposta se tornará inútil. Portanto, edite-o e adicione pelo menos um resumo do que pode ser encontrado lá, para que sua resposta tenha um valor independentemente do link. Obrigado!
Fabio diz Reinstate Monica