Compare dos bases de datos MySQL [cerrado]

368

Actualmente estoy desarrollando una aplicación usando una base de datos MySQL.

La estructura de la base de datos todavía está cambiando y cambia mientras el desarrollo progresa (cambio mi copia local, dejando solo la del servidor de prueba).

¿Hay alguna manera de comparar las dos instancias de la base de datos para ver si hubo algún cambio?

Si bien actualmente simplemente descartar la base de datos del servidor de prueba anterior está bien, a medida que las pruebas comienzan a ingresar datos de prueba, podría ser un poco complicado.
Sin embargo, lo mismo ocurrirá más tarde en la producción ...

¿Hay una manera fácil de hacer cambios incrementales en la base de datos de producción, preferiblemente creando automáticamente un script para modificarlo?


Herramientas mencionadas en las respuestas:

Vincent Ramdhanie
fuente
44
Creo que las herramientas de RedGate son solo para SQL Server.
Dave R.
44
Red Gate ahora también tiene una versión de MySQL, actualmente gratuita ya que está en acceso anticipado extendido: red-gate.com/products/MySQL_Compare/index.htm
David Atkinson
2
Es un verdadero problema. Despliegue de dev a máquina de producción y SIEMPRE rompe algo. Gracias por esta publicación informativa
Herr
1
La herramienta MySQL de Redgate ahora cuesta $ 70 / usuario. Incluso a ese precio evaluaré y publicaré comentarios aquí.
Jeremy McGee
También necesitaba esto justo ahora, tenía que aumentar el tamaño de un campo. No quería simplemente aumentarlo y sospechar que todo estaba bien. @Jared sugirió exactamente lo que usé.
Tass

Respuestas:

210

Si está trabajando con bases de datos pequeñas, descubrí que ejecutar mysqldump en ambas bases de datos con las opciones --skip-commentsy --skip-extended-insertpara generar scripts SQL, entonces ejecutar diff en los scripts SQL funciona bastante bien.

Al saltarse los comentarios, evita las diferencias sin sentido, como la hora en que ejecutó el comando mysqldump. Al utilizar el --skip-extended-insertcomando, se asegura de que cada fila se inserte con su propia instrucción de inserción. Esto elimina la situación en la que un solo registro nuevo o modificado puede causar una reacción en cadena en todas las futuras declaraciones de inserción. Ejecutar con estas opciones produce volcados más grandes sin comentarios, por lo que probablemente esto no sea algo que desee hacer en el uso de producción, pero para el desarrollo debería estar bien. He puesto ejemplos de los comandos que uso a continuación:

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
fuente
12
¡¡¡Votos dobles más para la alfabetización en línea de comandos !!!
dogenpunk
55
Para comparar datos , use esto en su lugar; todavía habrá algunos comentarios de MySQL4 + sobre conjuntos de caracteres, etc.mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
zanlok
41
-d, --no-datapuede ser de interés para aquellos que necesitan uso de producción, pero solo se preocupan por el esquema
Louis
77
Una herramienta mejor para usar sería la utilidad mysqldbcompare desarrollada por MySQL, que puede usar en Windows, Linux o Mac; también puede generar declaraciones SQL para cambios de datos y esquemas y hace muchas más pruebas que una simple línea de comando diff. determinar.
Jasdeep Khalsa
44
Para una buena diferencia con los colores, pruebavimdiff
gitaarik
99

Toad for MySQL tiene características de comparación de datos y esquemas, y creo que incluso creará un script de sincronización. Lo mejor de todo, es freeware.

Anson Smith
fuente
2
Todas las herramientas mencionadas se ven bien. Estoy seleccionando Toad arbitrariamente por ahora hasta que pueda realizar más investigaciones.
Vincent Ramdhanie
64
Esta herramienta me entusiasmó hasta que me di cuenta de que se ejecuta en Windows, no en Linux. Volver a buscar ...
jdias
2
Funcionó fantástico para mí. Hice todo lo que necesitaba hacer y las celdas resaltadas para los registros modificados me facilitaron ver qué cambió.
thames
44
mysqldbcompare with --run-all-tests --difftype sql --disable-binary-loggingoptions puede hacer casi el mismo trabajo (excepto que la salida se mezcla con comentarios y no se escapan los caracteres especiales en cadena).
schemacs
44
@Anson Smith ¿Puedes decirme la alternativa para Linux?
Visruth
20

Utilizo un software llamado Navicat para:

  • Sincronizar bases de datos en vivo con mis bases de datos de prueba.
  • Mostrar diferencias entre las dos bases de datos.

Cuesta dinero, es solo para Windows y Mac, y tiene una IU loca, pero me gusta.

seanyboy
fuente
Se ejecuta en Linux. Lo tengo abierto en otro escritorio en este momento. La función de sincronización de estructura para impulsar los cambios de esquema de dev-> test-> live vale solo la tarifa de licencia.
Coronel Sponsz
2
Buena captura, ni siquiera sabía que tenía esas características. Es lo mejor en Mac hasta ahora.
Hendra Uzia
Parece solo comparar bases de datos que viven en servidores, no en archivos sql nativos
AlxVallejo
@seanyboy, ¿por qué te gusta la UI loca?
Pacerier
17

Hay una herramienta de sincronización de esquemas en SQLyog (comercial) que genera SQL para sincronizar dos bases de datos.

ingrese la descripción de la imagen aquí

Yury Litvinov
fuente
1
Sí, esta es la mejor solución para esto hasta ahora, proporciona buenas consultas de sincronización SQL para que pueda actualizarlo en cualquier momento y en cualquier lugar ...
Anupam
demasiado costoso y pesado, no es bueno para parches posteriores a los hechos
zanlok
1
Muy lento, y por alguna razón, cae y recrea muchas claves foráneas incluso cuando no es necesario. No hay forma de seguir el progreso.
Artem Goutsoul
13

De la lista de comparación de características ... MySQL Workbench ofrece Schema Diff y Schema Synchronization en su edición comunitaria.

andyhky
fuente
77
¡Funciona genial! Y es gratis, gracias. Para aquellos que no pudieron encontrarlo (como yo). Está aquí: Base de datos -> Ingeniero inverso -> En modelo MySQL o Diagrama EER -> Base de datos -> Sincronizar con cualquier fuente
bentzy
Funciona bien Sin embargo, solo puede comparar bases de datos del mismo nombre. Tengo varias bases de datos (cliente multicliente) que quiero sincronizar desde una versión "maestra" en el mismo host. Así que tengo que cambiar el nombre del maestro para que coincida con la base de datos de cada cliente antes de sincronizar. De lo contrario agradable!
scipilot
Se puede encontrar información adicional sobre esto en este enlace
Steven Ryssaert
13

Ciertamente hay muchas formas, pero en mi caso prefiero el comando dump y diff. Así que aquí hay un guión basado en el comentario 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

Comentarios son bienvenidos :)

develCuy
fuente
12

dbSolo, se paga pero esta característica podría ser la que está buscando http://www.dbsolo.com/help/compare.html

Funciona con Oracle, Microsoft SQL Server, Sybase, DB2, Solid, PostgreSQL, H2 y MySQL texto alternativo

jmpeace
fuente
¡Esto era EXACTAMENTE lo que estaba buscando! ¡Increíble!
Josh Nankin
11

Si solo necesita comparar esquemas (no datos) y tener acceso a Perl, mysqldiff podría funcionar. Lo he usado porque le permite comparar bases de datos locales con bases de datos remotas (a través de SSH), por lo que no necesita molestarse en descargar ningún dato.

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

Intentará generar consultas SQL para sincronizar dos bases de datos, pero no confío en ello (ni en ninguna herramienta, en realidad). Hasta donde sé, no hay una forma 100% confiable de realizar ingeniería inversa de los cambios necesarios para convertir un esquema de base de datos en otro, especialmente cuando se han realizado múltiples cambios.

Por ejemplo, si cambia solo el tipo de una columna, una herramienta automatizada puede adivinar fácilmente cómo recrear eso. Pero si también mueve la columna, le cambia el nombre y agrega o elimina otras columnas, lo mejor que puede hacer cualquier paquete de software es adivinar lo que probablemente sucedió. Y puede terminar perdiendo datos.

Sugeriría realizar un seguimiento de cualquier cambio de esquema que realice en el servidor de desarrollo, luego ejecutar esas declaraciones manualmente en el servidor en vivo (o pasarlas a un script de actualización o migración). Es más tedioso, pero mantendrá sus datos seguros. Y para cuando comience a permitir que los usuarios finales accedan a su sitio, ¿realmente va a hacer cambios constantes en la base de datos?

Zac
fuente
No se olvide de proporcionar ambos --hostNy --userNfallará en silencio.
Znarkus
Tuve problemas con las herramientas mysqldbcompare de Oracle que generaban errores en los índices y modificaban campos que eran equivalentes. La herramienta mysqldiff funcionó perfectamente y ahorró bastante tiempo.
Robert K
6

compruebe: http://schemasync.org/ la herramienta de sincronización funciona para mí, es una herramienta de línea de comandos que funciona fácilmente en la línea de comandos de Linux

likeuclinux
fuente
1
Si tiene problemas para instalar esto en una Mac, solo pude instalar mysql y python usando homebrew, con macports inútiles.
Bijou Trouvaille
3

Hay una herramienta útil escrita usando perl llamada Maatkit . Tiene varias herramientas de comparación y sincronización de bases de datos, entre otras cosas.

Jarod Elliott
fuente
¡No sabía sobre este proyecto! Gracias, parece que tiene bastantes herramientas que serían extremadamente útiles.
Vincent Ramdhanie
2
No he encontrado herramientas de comparación de esquemas en Maatkit.
stepancheg
Yo tampoco, ¿en qué herramientas podemos encontrar esto?
Shabbyrobe
No creo que haya una comparación de esquemas allí. Me refería a la comparación y sincronización de datos usando mk-table-checksum y mk-table-sync
Jarod Elliott
3

Para mí, comenzaría volcando ambas bases de datos y diferenciando los volcados, pero si desea generar scripts de fusión automáticamente, querrá obtener una herramienta real.

Una simple búsqueda en Google mostró las siguientes herramientas:

Craig Trader
fuente
3

Eche un vistazo a dbForge Data Compare para MySQL . Es un shareware con un período de prueba gratuito de 30 días. Es una herramienta rápida de MySQL GUI para la comparación y sincronización de datos, gestión de diferencias de datos y sincronización personalizable.

Comparación de datos de dbForge para MySQL

Devastar
fuente
3

Después de horas buscando en la web una herramienta simple, me di cuenta de que no buscaba en el Centro de software de Ubuntu. Aquí hay una solución gratuita que encontré: http://torasql.com/ También afirman tener una versión para Windows, pero solo la estoy usando en Ubuntu.

Editar: 2015-Feb-05 Si necesita la herramienta de Windows, TOAD es perfecto y gratuito: http://software.dell.com/products/toad-for-mysql/

Nikolay Ivanov
fuente
2
El desarrollo de esta herramienta se detuvo y ahora se incluye en Percona: percona.com/software/percona-toolkit
mrmuggles
2

La biblioteca de componentes apache zeta es una biblioteca de propósito general de componentes débilmente acoplados para el desarrollo de aplicaciones basadas en PHP 5.

eZ Components - DatabaseSchema le permite:

   . Crear / Guardar una definición de esquema de base de datos;
   . Comparar esquemas de bases de datos;
   Generar consultas de sincronización;

Puede consultar el tutorial aquí: http://incubator.apache.org/zetacomponents/documentation/trunk/DatabaseSchema/tutorial.html

Naim Zard
fuente
2

Herramienta de comparación y sincronización muy fácil de usar:
Database Comparer http://www.clevercomponents.com/products/dbcomparer/index.asp

Ventajas:

  • rápido
  • fácil de usar
  • cambios fáciles de seleccionar para aplicar

Desventajas

  • no sincroniza la longitud con pequeñas entradas
  • no sincroniza los nombres de índice correctamente
  • no sincroniza comentarios
Artem Goutsoul
fuente
Es cierto que han realizado una actualización superficial con algunos pequeños cambios en 5 años. Pero no se está desarrollando activamente.
Artem Goutsoul
1

Creo que Navicat para MySQL será útil para este caso. Es compatible con la sincronización de datos y estructuras para MySQL. ingrese la descripción de la imagen aquí


fuente
0

Para la primera parte de la pregunta, solo hago un volcado de ambos y los difundo. No estoy seguro acerca de mysql, pero postgres pg_dump tiene un comando para volcar el esquema sin el contenido de la tabla, para que pueda ver si ha cambiado el esquema.

Paul Tomblin
fuente
MySQL tiene un comando similar mysql_dump. Esta podría ser una solución si pudiera integrarlo en un proceso de implementación. Gracias.
Vincent Ramdhanie
Además, para una experiencia más fácil de usar, puede obtener lo mismo con phpMyAdmin, ¡un verdadero asesino para los usuarios de MySQL!
schonarth
Los esquemas idénticos pueden resultar fácilmente en volcados de esquemas diferentes. Las diferentes versiones del cliente mysql pueden producir volcados ligeramente diferentes (un problema si está comparando esquemas de dos máquinas diferentes), y cosas como claves y restricciones foráneas pueden volcarse en un orden diferente.
Mark E. Haase
0

Estoy trabajando con el equipo de marketing de Nob Hill, quería decirte que estaré encantado de escuchar tus preguntas, sugerencias o cualquier otra cosa, no dudes en contactarme.

Originalmente decidimos crear nuestra herramienta desde cero porque si bien hay otros productos similares en el mercado, ninguno de ellos funciona bien. Es bastante fácil mostrarle las diferencias entre las bases de datos. Otra muy distinta es crear una base de datos como la otra. La migración sin problemas, tanto de esquema como de datos, siempre ha sido un desafío. Bueno, lo hemos logrado aquí.
Estamos tan seguros de que podría proporcionarle una migración sin problemas, que si no lo hace, si los scripts de migración que genera no son lo suficientemente legibles o no funcionarán para usted, y no podemos solucionarlo en cinco días hábiles, ¡obtendrás tu propia copia gratis!

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


fuente
¿eso es una promesa? Lo probé y se cayó con unos pocos errores, entre ellos que al migrar una función intenta usar el mismo propietario que la base de datos original
Cruachan,
Sí, es una promesa. Para la mayoría de las personas, la herramienta funciona bien. Prometemos una licencia de por vida para cualquier error que encuentre y no podemos solucionarlo dentro de los 5 días hábiles. Por favor contacte a nuestro equipo de soporte.