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:


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

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.


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.


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


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.


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 :)



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?


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


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.


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

SQL Compare by RedGate http://www.red-gate.com/products/SQL_Compare/index.htm

DBDeploy para ajudar no gerenciamento de alterações do banco de dados de forma automatizada http://dbdeploy.com/


11
As ferramentas do Red Gate parecem não suportar nada além do SQL Server.
Rytmis 6/12/2009

2
Red Gate tem uma versão de MySQL, bem como, ao mesmo tempo livre no acesso antecipado: red-gate.com/products/MySQL_Compare/index.htm
David Atkinson

Não disponível para OSX
AlxVallejo


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


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/


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


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

É 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


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.


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


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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.