Compara dos bases de datos MySQL

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

La estructura de la base de datos sigue fluyendo y cambia mientras el desarrollo avanza (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?

Mientras que actualmente simplemente descartar la base de datos del servidor de prueba anterior está bien, ya que las pruebas comienzan a ingresar datos de prueba, podría ser un poco complicado.
Lo mismo, aunque más, volverá a ocurrir más adelante en la producción …

¿Existe alguna manera fácil de realizar cambios de forma incremental en la base de datos de producción, preferiblemente creando automáticamente un script para modificarlo?


Herramientas mencionadas en las respuestas:

  • Esquema MySQL de Red-Gate y comparación de datos (comercial)
  • Maatkit (ahora Percona)
  • liquibase
  • Sapo
  • Comparación de bases de datos Nob Hill (comercial)
  • MySQL Diff
  • SQL EDT (Comercial)

Si está trabajando con pequeñas bases de datos que he encontrado ejecutando mysqldump en ambas bases de datos con las --skip-comments y --skip-extended-insert para generar scripts SQL, entonces ejecutar diff en los scripts SQL funciona bastante bien.

Al omitir los comentarios, evita las diferencias sin sentido, como la hora en que ejecutó el comando mysqldump. Al utilizar el comando --skip-extended-insert garantiza que cada fila se inserta con su propia instrucción de inserción. Esto elimina la situación en la que un único registro nuevo o modificado puede provocar una reacción en cadena en todas las futuras instrucciones de inserción. La ejecución con estas opciones produce volcados más grandes sin comentarios, por lo que probablemente no sea algo que desee hacer en 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 

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

Uso un software llamado Navicat para:

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

Cuesta dinero, es solo para Windows y Mac, y tiene una interfaz de usuario maliciosa, pero me gusta.

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

enter image description here

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

Hay muchas maneras, sin duda, 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 

Los comentarios son bienvenidos 🙂

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

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 datos.

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

Intentará generar consultas SQL para sincronizar dos bases de datos, pero no confío en él (o en ninguna herramienta, en realidad). Por lo que yo sé, no hay una forma 100% confiable de aplicar ingeniería inversa a los cambios necesarios para convertir un esquema de base de datos a otro, especialmente cuando se han realizado varios cambios.

Por ejemplo, si cambia solo el tipo de una columna, una herramienta automatizada puede adivinar cómo volver a crearla. Pero si también mueve la columna, lo renombra 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 hacer un seguimiento de cualquier cambio de esquema que realice en el servidor de desarrollo, luego ejecutar esas declaraciones a mano en el servidor activo (o incluirlas en un script de actualización o migración). Es más tedioso, pero mantendrá sus datos a salvo. Y para cuando empiece a permitir que los usuarios finales accedan a su sitio, ¿realmente hará cambios constantes en la base de datos?

Eche un vistazo a http://www.liquibase.org/

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

Hay otra herramienta de línea de comandos de código abierto mysql-diff:

http://bitbucket.org/stepancheg/mysql-diff/

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

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

DBDeploy para ayudar con la administración de cambio de base de datos de forma automatizada http://dbdeploy.com/

Por mi parte, comenzaría por eliminar ambas bases de datos y difuminar los volcados, pero si quiere scripts de fusión generados automáticamente, va a querer obtener una herramienta real.

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

  • MySQL Workbench , disponible en la comunidad (OSS) y variantes comerciales.
  • Comparación de la base de datos de Nob Hill , disponible de forma gratuita para MySQL.
  • Una lista de otras herramientas de comparación de SQL.

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

dbForge Data Compare para MySQL

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

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

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

eZ Components – DatabaseSchema te permite:

    . Cree / guarde una definición de esquema de base de datos;
    .Compare los esquemas de la base de datos;
    . Generar consultas de sincronización;

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

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

Ventajas:

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

Desventajas:

  • no sincroniza la longitud con pequeños enteros
  • no sincroniza los nombres de índice correctamente
  • no sincroniza los comentarios

Creo que Navicat para MySQL será útil para este caso. Es compatible con sincronización de datos y estructura para MySQL. enter image description here

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

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, por favor no dudes en contactarme.

Originalmente, decidimos crear nuestra herramienta desde cero porque, si bien existen otros productos similares en el mercado, ninguno de ellos hace bien el trabajo. Es bastante fácil mostrarle las diferencias entre las bases de datos. Otra cosa es hacer una base de datos como la otra. La migración fluida, 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 fluida, que si no lo hace, si las secuencias de comandos 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