Compare dois bancos de dados MySQL [fechados]

368

Atualmente, estou desenvolvendo um aplicativo usando um banco de dados MySQL.

A estrutura do banco de dados ainda está em fluxo e muda enquanto o desenvolvimento avança (eu altero minha cópia local, deixando a cópia apenas no servidor de teste).

Existe uma maneira de comparar as duas instâncias do banco de dados para ver se houve alguma alteração?

Embora atualmente simplesmente descartar o banco de dados do servidor de teste anterior seja bom, conforme o teste começa a inserir dados de teste, pode ser um pouco complicado.
O mesmo, embora mais, aconteça novamente mais tarde na produção ...

Existe uma maneira fácil de fazer alterações incrementais no banco de dados de produção, de preferência criando automaticamente um script para modificá-lo?


Ferramentas mencionadas nas respostas:

Vincent Ramdhanie
fonte
4
Acredito que as ferramentas do RedGate são apenas para o SQL Server.
Dave R.
4
Red Gate tem agora uma versão do MySQL, bem como, atualmente livre como é no início acesso alargado: red-gate.com/products/MySQL_Compare/index.htm
David Atkinson
2
É um problema real. Eu implanto do dev para a máquina de produção e SEMPRE quebra alguma coisa. Obrigado por este post informativo
Herr
11
A ferramenta MySQL da Redgate agora é de US $ 70 / usuário. Mesmo a esse preço, vou avaliar e postar comentários aqui.
21711 Jeremy McGee
Também precisava disso agora, tinha que aumentar o tamanho de um campo. Não queria apenas aumentá-lo e suspeitar que estava tudo bem. @ Jared sugeriu exatamente o que eu usei.
Tass

Respostas:

210

Se você estiver trabalhando com bancos de dados pequenos, eu encontrei executando o mysqldump nos dois bancos de dados com as opções --skip-commentse --skip-extended-insertpara gerar scripts SQL, então executar diff nos scripts SQL funciona muito bem.

Ignorando comentários, você evita diferenças sem sentido, como o tempo em que você executou o comando mysqldump. Usando o --skip-extended-insertcomando, você garante que cada linha seja inserida com sua própria instrução de inserção. Isso elimina a situação em que um único registro novo ou modificado pode causar uma reação em cadeia em todas as instruções de inserção futuras. A execução dessas opções produz despejos maiores sem comentários, portanto isso provavelmente não é algo que você deseja fazer no uso da produção, mas para o desenvolvimento deve ser bom. Eu coloquei exemplos dos comandos que eu uso abaixo:

mysqldump --skip-comments --skip-extended-insert -u root -p dbName1>file1.sql
mysqldump --skip-comments --skip-extended-insert -u root -p dbName2>file2.sql
diff file1.sql file2.sql
Jared
fonte
12
Votações com mais de duas vezes para alfabetização em linha de comando !!!
dogenpunk
5
Para comparar dados , use-o; ainda existem alguns comentários do MySQL4 + sobre conjuntos de caracteres etc.mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
zanlok
41
-d, --no-dataPode ser de interesse para aqueles que necessitam de uso em produção, mas só se preocupam com o esquema
Louis
7
Uma ferramenta melhor para usar seria o utilitário mysqldbcompare desenvolvido pelo próprio MySQL, que você pode usar no Windows, Linux ou Mac - ele também pode gerar instruções SQL para alterações de dados e esquemas e faz muito mais testes do que um simples diferencial de linha de comando poderia determinar.
Jasdeep Khalsa
4
Para uma boa diff com cores tentarvimdiff
gitaarik
99

O Toad for MySQL possui recursos de comparação de dados e esquema, e acredito que até criará um script de sincronização. O melhor de tudo é que é freeware.

Anson Smith
fonte
2
Todas as ferramentas mencionadas parecem boas. Estou selecionando o Toad arbitrariamente por enquanto até poder realizar mais algumas pesquisas.
Vincent Ramdhanie
64
Fiquei empolgado com essa ferramenta até perceber que ela roda no Windows, não no Linux. Voltar para pesquisa ...
jdias 10/09/11
2
Trabalhou fantástico para mim. Fiz tudo o que eu precisava e as células destacadas para registros alterados tornaram fácil ver o que mudou.
Thames
4
O mysqldbcompare with --run-all-tests --difftype sql --disable-binary-loggingoptions pode fazer quase o mesmo trabalho (exceto que a saída é misturada ao comentário, e caracteres especiais na string não são escapados).
schemacs
4
@Anson Smith Você pode me dizer a alternativa para linux?
Visruth
20

Eu uso um software chamado Navicat para:

  • Sincronize bancos de dados ao vivo com meus bancos de dados de teste.
  • Mostrar diferenças entre os dois bancos de dados.

Custa dinheiro, é apenas para Windows e Mac e possui uma interface de usuário esquisita, mas eu gosto.

seanyboy
fonte
Ele roda no Linux. Tenho-o aberto em outro desktop no momento. O recurso de sincronização de estrutura para enviar alterações de esquema do dev-> test-> live vale apenas a taxa de licença.
Coronel Sponsz 22/10/08
2
Boa captura, eu nem sabia que tinha esses recursos. É a melhor coisa no Mac até agora.
Hendra Uzia
Parece bancos de dados somente comparar que vivem em servidores, e não nativos arquivos SQL
AlxVallejo
@seanyboy, Por que você gosta da interface do usuário maluca?
Pacerier 24/02
17

Existe uma ferramenta de sincronização de esquema no SQLyog (comercial) que gera o SQL para sincronizar dois bancos de dados.

insira a descrição da imagem aqui

Yury Litvinov
fonte
11
sim esta é a melhor solução para este tão longe para mim, fornece consultas de sincronização fina SQL para que você possa atualizá-lo a qualquer hora, em qualquer lugar ..
Anupam
over-caro e pesado, não é bom para patchings após o fato,
zanlok
11
Muito lento e, por algum motivo, descarta e recria muitas chaves estrangeiras, mesmo quando não é necessário. Não há como acompanhar o progresso.
Artem Goutsoul
13

Na lista de comparação de recursos ... MySQL Workbench oferece Schema Diff e Schema Synchronization em sua edição da comunidade.

andyhky
fonte
7
Funciona bem! E é grátis, obrigado. Para aqueles que não conseguiram encontrá-lo (como eu). É aqui: Banco de Dados -> Engenharia reversa -> No MySQL Modelo ou EER Diagram -> Banco de Dados -> Sincronizar com qualquer fonte
bentzy
Funciona bem. No entanto, você só pode comparar bancos de dados com o mesmo nome. Eu tenho vários bancos de dados (cliente com vários inquilinos) que desejo sincronizar a partir de uma versão "principal" no mesmo host. Então, eu tenho que renomear o mestre para corresponder ao banco de dados de cada cliente antes de sincronizar. Caso contrário, bom!
Scipilot
Informações adicionais sobre isto pode ser encontrado neste link de
Steven Ryssaert
13

Certamente, existem muitas maneiras, mas no meu caso eu prefiro o comando dump e diff. Então, aqui está um script baseado no comentário de Jared:

#!/bin/sh

echo "Usage: dbdiff [user1:pass1@dbname1] [user2:pass2@dbname2] [ignore_table1:ignore_table2...]"

dump () {
  up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
  mysqldump --opt --compact --skip-extended-insert -u $user -p$pass $dbname $table > $2
}

rm -f /tmp/db.diff

# Compare
up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
for table in `mysql -u $user -p$pass $dbname -N -e "show tables" --batch`; do
  if [ "`echo $3 | grep $table`" = "" ]; then
    echo "Comparing '$table'..."
    dump $1 /tmp/file1.sql
    dump $2 /tmp/file2.sql
    diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff
  else
    echo "Ignored '$table'..."
  fi
done
less /tmp/db.diff
rm -f /tmp/file1.sql /tmp/file2.sql

Comentários são bem-vindos :)

develCuy
fonte
12

dbSolo, é pago, mas esse recurso pode ser o que você está procurando http://www.dbsolo.com/help/compare.html

Funciona com Oracle, Microsoft SQL Server, Sybase, DB2, Sólido, PostgreSQL, H2 e MySQL texto alternativo

jmpeace
fonte
isso foi exatamente o que eu estava procurando! Impressionante!
Josh Nankin
11

Se você só precisa comparar esquemas (não dados) e ter acesso ao Perl, o mysqldiff pode funcionar. Eu o usei porque permite comparar bancos de dados locais com bancos de dados remotos (via SSH), para que você não precise se preocupar em despejar nenhum dado.

http://adamspiers.org/computing/mysqldiff/

Ele tentará gerar consultas SQL para sincronizar dois bancos de dados, mas não confio nela (ou em qualquer ferramenta, na verdade). Até onde eu sei, não há uma maneira 100% confiável de fazer engenharia reversa das alterações necessárias para converter um esquema de banco de dados em outro, especialmente quando várias alterações foram feitas.

Por exemplo, se você alterar apenas o tipo de uma coluna, uma ferramenta automatizada poderá adivinhar facilmente como recriar isso. Mas se você também mover a coluna, renomeá-la e adicionar ou remover outras colunas, o melhor que qualquer pacote de software pode fazer é adivinhar o que provavelmente aconteceu. E você pode acabar perdendo dados.

Sugiro acompanhar todas as alterações de esquema feitas no servidor de desenvolvimento e, em seguida, executar essas instruções manualmente no servidor ativo (ou transformá-las em um script de atualização ou migração). É mais tedioso, mas mantém seus dados seguros. E quando você começar a permitir que os usuários finais acessem seu site, estará realmente fazendo constantes alterações pesadas no banco de dados?

Zac
fonte
Não se esqueça de fornecer os dois --hostNe --userNou ele falhará silenciosamente.
Znarkus
Eu tive problemas com as ferramentas mysqldbcompare da Oracle, gerando bugs nos índices e alterando campos equivalentes. A ferramenta mysqldiff funcionou perfeitamente e economizou um bom tempo.
Robert K
6

verifique: http://schemasync.org/ a ferramenta schemasync funciona para mim, é uma ferramenta de linha de comando que funciona facilmente na linha de comando do linux

likeuclinux
fonte
11
Se você está tendo problemas para instalar isso em um mac, só consegui instalar o mysql e python usando homebrew, com macports sem sucesso.
Bijou Trouvaille
3

Existe uma ferramenta útil escrita usando o perl chamado Maatkit . Possui várias ferramentas de comparação e sincronização de bancos de dados, entre outras coisas.

Jarod Elliott
fonte
Eu não conhecia esse projeto! Obrigado, parece que ele tem algumas ferramentas que seriam extremamente úteis.
Vincent Ramdhanie
2
Não encontrei ferramentas de comparação de esquema no Maatkit.
stepancheg
Nem eu - onde podemos encontrar isso nas ferramentas?
Shabbyrobe
Eu não acho que haja comparação de esquema lá. Eu estava referindo-se a comparação de dados e sincronização utilizando MK-mesa-de soma de verificação e MK-mesa-de sincronização
Jarod Elliott
3

Para mim, eu começaria com o despejo dos dois bancos de dados e a diferenciação dos despejos, mas se você quiser scripts de mesclagem gerados automaticamente, precisará obter uma ferramenta real.

Uma simples pesquisa no Google exibiu as seguintes ferramentas:

Craig Trader
fonte
3

Dê uma olhada no dbForge Data Compare for MySQL . É um shareware com 30 dias de teste gratuito. É uma ferramenta rápida da GUI MySQL para comparação e sincronização de dados, gerenciamento de diferenças de dados e sincronização personalizável.

dbForge Data Compare para MySQL

Devart
fonte
3

Depois de horas pesquisando na web por uma ferramenta simples, percebi que não procurei no Ubuntu Software Center. Aqui está uma solução gratuita que encontrei: http://torasql.com/ Eles afirmam ter uma versão para Windows também, mas eu só a estou usando no Ubuntu.

Edit: 2015-Feb-05 Se você precisar da ferramenta Windows, o TOAD é perfeito e gratuito: http://software.dell.com/products/toad-for-mysql/

Nikolay Ivanov
fonte
2
Desenvolvimento desta ferramenta parado e agora está incluído na Percona: percona.com/software/percona-toolkit
mrmuggles
2

A biblioteca de componentes apache zeta é uma biblioteca de uso geral de componentes fracamente acoplados para o desenvolvimento de aplicativos baseados no PHP 5.

O eZ Components - DatabaseSchema permite:

   .Criar / Salvar uma definição de esquema de banco de dados;
   .Compare esquemas de banco de dados;
   .Gerar consultas de sincronização;

Você pode verificar o tutorial aqui: http://incubator.apache.org/zetacomponents/documentation/trunk/DatabaseSchema/tutorial.html

Naim Zard
fonte
2

Ferramenta de comparação e sincronização muito fácil de usar:
Database Comparer http://www.clevercomponents.com/products/dbcomparer/index.asp

Vantagens:

  • velozes
  • fácil de usar
  • fácil selecionar as alterações a serem aplicadas

Desvantagens:

  • não sincroniza o comprimento com pequenas polegadas
  • não sincroniza nomes de índice corretamente
  • não sincroniza comentários
Artem Goutsoul
fonte
É verdade que eles fizeram uma atualização superficial com algumas pequenas mudanças em 5 anos. Mas não está sendo desenvolvido ativamente.
Artem Goutsoul #
1

Acho que o Navicat para MySQL será útil para este caso. Ele suporta sincronização de dados e estrutura para MySQL. insira a descrição da imagem aqui


fonte
0

Para a primeira parte da pergunta, eu apenas faço um despejo de ambos e os difiro. Não tenho certeza sobre o mysql, mas o postgres pg_dump possui um comando para apenas despejar o esquema sem o conteúdo da tabela, para que você possa ver se mudou algum esquema.

Paul Tomblin
fonte
O MySQL possui um comando similar mysql_dump. Isso pode ser uma solução se eu puder integrá-lo em um processo de implantação. Obrigado.
Vincent Ramdhanie
Além disso, para uma experiência mais amigável, você pode obter o mesmo usando o phpMyAdmin - um verdadeiro matador para usuários do MySQL!
Schoarth 22/10/08
Esquemas idênticos podem facilmente resultar em diferentes despejos de esquema. Versões diferentes do cliente mysql podem produzir despejos ligeiramente diferentes (um problema se você estiver comparando esquemas de duas máquinas diferentes), e coisas como chaves estrangeiras e restrições podem ser despejadas em uma ordem diferente.
Mark E. Haase,
0

Estou trabalhando com a equipe de marketing da Nob Hill. Queria dizer que ficarei feliz em ouvir suas perguntas, sugestões ou qualquer outra coisa. Não hesite em entrar em contato.

Originalmente, decidimos criar nossa ferramenta do zero porque, enquanto existem outros produtos no mercado, nenhum deles faz o trabalho corretamente. É muito fácil mostrar as diferenças entre os bancos de dados. Outra coisa é criar um banco de dados como o outro. A migração suave, tanto de esquema quanto de dados, sempre foi um desafio. Bem, nós conseguimos isso aqui.
Estamos tão confiantes de que isso poderia fornecer uma migração tranqüila, do que se não acontecer - se os scripts de migração gerados não forem legíveis o suficiente ou não funcionarem para você e não pudermos corrigi-lo em cinco dias úteis - você receberá sua própria cópia gratuita!

http://www.nobhillsoft.com/NHDBCompare.aspx


fonte
isso é uma promessa? Eu tentei e ela caiu com um justo alguns erros, não menos que ao migrar uma função ele tenta usar o mesmo proprietário como o banco de dados original
Cruachan
Sim, é uma promessa. Para a maioria das pessoas, a ferramenta está funcionando bem. Prometemos uma licença vitalícia para qualquer bug encontrado e não podemos corrigi-lo dentro de 5 dias úteis. Entre em contato com nossa equipe de suporte.