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:


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

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.


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.


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í


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.


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



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?


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


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.


¡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

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


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/


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


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

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í


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.


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


¿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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.