2010-03-05 79 views
14

Quería preguntar si es posible comparar la estructura completa de la base de datos de dos enormes bases de datos. Tenemos dos bases de datos, una es una base de datos de desarrollo, la otra es una base de datos de producción. A veces he olvidado realizar cambios en la base de datos de producción antes de publicar algunas partes de nuestro código, lo que hace que la base de datos de producción no tenga la misma estructura, por lo que si lanzamos algo, obtenemos algunos errores. ¿Hay alguna manera de comparar los dos o sincronizar?¿Comparar estructuras de dos bases de datos?

+0

Probé todas las siguientes herramientas, la mayoría tiene que pagarse, algunas no pueden funcionar en el servidor mysql, y mysqldiff simplemente no funciona. Terminé con dumping db strucdture y command line diff. Es extraño, ya que pensé que se suponía que era una herramienta simple (un poco más robusta que la línea de comando diff). –

Respuesta

4

Red-Gate SQL Compare es una gran herramienta que hará esto por usted. Lo he usado durante años con gran éxito. Me ha ahorrado miles de horas de trabajo.

También tienen una herramienta que comparará los datos también. El producto que mencioné arriba compara el esquema.

www-red-gate.com

+0

¿Red Gate SQL Compare funciona en MySQL? Tenía la impresión de que solo era MS SQL Server. – Kibbee

+0

@Kibbe es justo para mssql y no para mysql mira aquí http://www.red-gate.com/about/index.htm – streetparade

+0

Sí, Red Gate tiene una versión para MySQL. Está en versión beta extendida en este momento, por lo que es totalmente gratuito para usar por el momento. http://www.red-gate.com/products/sql-development/mysql-compare/ –

1

Dependiendo de su base de datos, las herramientas disponibles varían.

Uso el ER/Studio de Embarcadero para esto. Tiene una función Comparar y fusionar.

Hay muchas otras, como Toad for MySQL, que también se pueden comparar. También acuerde la sugerencia de Red-Gate, pero nunca la usó para MySQL.

0

SchemaCrawler es una herramienta gratuita e independiente de la plataforma que le permite comparar estructuras de bases de datos. No es necesario que las dos bases de datos estén en línea al mismo tiempo; puede guardar la estructura de su base de datos en un archivo de texto legible para el ser humano. Comaprisons se hacen usando herramientas estándar diff.

Recomendaría automatizar la comparación como parte del proceso de compilación e implementación, para garantizar que sus sistemas de producción nunca estén desactualizados.

4

Puede simplemente volcarlos con --no-data y comparar los archivos.

Recuerde utilizar la opción --lock-tables = 0 en su base de datos de producción para evitar el gran bloqueo global desagradable.

Si usa la misma versión de mysqldump (sus sistemas de desarrollo y producción deben tener el mismo software, ¿verdad?), Entonces esperará obtener archivos más o menos idénticos. Las tablas estarán en orden alfabético, por lo que una simple diferencia mostrará las discrepancias fácilmente.

0

Definitivamente iré con AdeptSQL si está utilizando MSSQL. Es la herramienta de comparación de db menos atractiva pero con más talento entre las que he probado. Puede comparar tanto la estructura como los datos. Le dice qué tablas existen en un db pero no existen en el otro, compara la estructura y los datos de los comunes y puede producir el script para sincronizar los dos. No es gratis, pero tiene una versión de prueba de 30 días (hasta donde recuerdo)

0

Pruebe dbForge Scheme Compare for SQL server. Puede comparar y sincronizar cualquier esquema de base de datos. Rápido, fácil, siempre entregando un resultado correcto. ¡Mira cómo vuela en tu base de datos!

1

Echa un vistazo a Delta Gemini - Diferencia Administrador SQL para .NET. Una versión beta gratuita está disponible para su descarga, pero la versión completa está a solo unos días de su publicación.

No compara las diferencias de datos a nivel de fila, pero compara tablas, funciones, sprocs, etc. ... y es rapidísimo. (La nueva versión, 1.4, carga y compara 1k Sprocs en menos de 4 segundos, en comparación con otras herramientas que he probado, que tomó más de 10 segundos).

Aunque todo el mundo está en lo cierto, RedGate es una gran herramienta.

0

Finalmente utilicé una herramienta simple llamada "estructura de mysql para comparar". Solo para Windows, pero es gratis y funciona ..

1

Probé mysqldiff sin éxito, así que me gustaría enriquecer a los futuros lectores llamando la atención sobre la función de comparación de mysqlworkbench. http://dev.mysql.com/doc/workbench/en/wb-database-diff-report.html#c13030

si abre una pestaña de modelo y selecciona el menú de bases de datos, obtiene una opción de comparar esquemas, que puede usar para comparar dos esquemas diferentes en dos servidores diferentes o dos esquemas en el mismo servidor o un esquema y un modelo, o muchas otras opciones que aún no he probado.

9

Puede utilizar la línea de comandos:

mysqldump --skip-comments --skip-extended-insert -d --no-data -u root -p dbName1>file1.sql 
mysqldump --skip-comments --skip-extended-insert -d --no-data -u root -p dbName2>file2.sql 
diff file1.sql file2.sql 
+1

Buena idea Gere, era fácil encontrar las diferencias pero no los nombres de tabla con el comando diff, así que salté al paquete tkdiff. Lo recomiendo encarecidamente – suarsenegger

9

Para la base de datos MySQL puede comparar vista y mesas (nombre de la columna y el tipo de columna) utilizando la siguiente consulta:

SET @firstDatabaseName = '[first database name]'; 
SET @secondDatabaseName = '[second database name]'; 

SELECT * FROM 
    (SELECT 
     CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType 
    FROM information_schema.columns cl, information_schema.TABLES ss 
    WHERE 
     cl.TABLE_NAME = ss.TABLE_NAME AND 
     cl.TABLE_SCHEMA = @firstDatabaseName AND 
     ss.TABLE_TYPE IN('BASE TABLE', 'VIEW') 
    ORDER BY 
     cl.table_name) AS t1 
LEFT JOIN      
    (SELECT 
     CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType 
    FROM information_schema.columns cl, information_schema.TABLES ss 
    WHERE 
     cl.TABLE_NAME = ss.TABLE_NAME AND 
     cl.TABLE_SCHEMA = @secondDatabaseName AND 
     ss.TABLE_TYPE IN('BASE TABLE', 'VIEW') 
    ORDER BY 
     cl.table_name) AS t2 ON t1.tableRowType = t2.tableRowType 
WHERE 
    t2.tableRowType IS NULL   
UNION 
SELECT * FROM 
    (SELECT 
     CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType 
    FROM information_schema.columns cl, information_schema.TABLES ss 
    WHERE 
     cl.TABLE_NAME = ss.TABLE_NAME AND 
     cl.TABLE_SCHEMA = @firstDatabaseName AND 
     ss.TABLE_TYPE IN('BASE TABLE', 'VIEW') 
    ORDER BY 
     cl.table_name) AS t1 
RIGHT JOIN      
    (SELECT 
     CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType 
    FROM information_schema.columns cl, information_schema.TABLES ss 
    WHERE 
     cl.TABLE_NAME = ss.TABLE_NAME AND 
     cl.TABLE_SCHEMA = @secondDatabaseName AND 
     ss.TABLE_TYPE IN('BASE TABLE', 'VIEW') 
    ORDER BY 
     cl.table_name) AS t2 ON t1.tableRowType = t2.tableRowType 
WHERE 
    t1.tableRowType IS NULL; 

Si prefiere utilizar la herramienta con UI también puede usar este script https://github.com/dlevsha/compalex que puede comparar tablas, vistas, claves, etc.

Compalex es una secuencia de comandos ligera para comparar dos esquemas de base de datos. Es compatible con MySQL, MS SQL Server y PostgreSQL.

captura de pantalla (comparar tablas) Compare tables

+0

¡Gracias! ¡Muy agradable! –

+0

Esto es genial. Yo uso esto. Gracias. –

0

Para MySQL en Linux, es posible a través de phpMyAdmin exportar las bases de datos sin 'datos' y la única estructura.

Recorriendo las opciones de exportación para toda la base de datos, simplemente anule la selección de 'datos' y configure la salida en texto. Exporte ambas bases de datos que desee comparar.

Luego, en la comparación de archivos en su programa/sitio preferido, compare los dos resultados del archivo de texto de las bases de datos. La sincronización sigue siendo manual en esta solución, pero es efectiva para comparar y encontrar las diferencias estructurales.

1

Para contestar este tipo de preguntas en la actualidad, he hecho un script que usa information_schema contenido de comparar la columna, tipo de datos, y la tabla

SET @database_current = '<production>'; 
SET @database_dev = '<development>'; 
-- column and datatype comparison 
SELECT a.TABLE_NAME, a.COLUMN_NAME, a.DATA_TYPE, a.CHARACTER_MAXIMUM_LENGTH, 
    b.COLUMN_NAME, b.DATA_TYPE, b.CHARACTER_MAXIMUM_LENGTH 
FROM information_schema.COLUMNS a 
    LEFT JOIN information_schema.COLUMNS b ON b.COLUMN_NAME = a.COLUMN_NAME 
     AND b.TABLE_NAME = a.TABLE_NAME 
     AND b.TABLE_SCHEMA = @database_current 
WHERE a.TABLE_SCHEMA = @database_dev 
    AND (
     b.COLUMN_NAME IS NULL 
     OR b.COLUMN_NAME != a.COLUMN_NAME 
     OR b.DATA_TYPE != a.DATA_TYPE 
     OR b.CHARACTER_MAXIMUM_LENGTH != a.CHARACTER_MAXIMUM_LENGTH 
    ); 
-- table comparison  
SELECT a.TABLE_SCHEMA, a.TABLE_NAME, b.TABLE_NAME 
FROM information_schema.TABLES a 
    LEFT JOIN information_schema.TABLES b ON b.TABLE_NAME = a.TABLE_NAME 
     AND b.TABLE_SCHEMA = @database_current 
WHERE a.TABLE_SCHEMA = @database_dev 
    AND (
     b.TABLE_NAME IS NULL 
     OR b.TABLE_NAME != a.TABLE_NAME 
    ); 

Esperanza Esta secuencia también puede ayudar a la gente que busca un no solución de aplicación, pero el uso de secuencia de comandos. Cheers

+1

Me gusta su idea de usar una solución de solo mysql. Sin embargo, el filtro O b.COLUMN_NAME! = A.COLUMN_NAME es redundante porque se asume la equivalencia dentro de la condición JOIN, del mismo modo O b.TABLE_NAME! = A.TABLE_NAME. –

+0

@PaulCampbell ¡buen punto! gracias por la ayuda, muy apreciada. Aclamaciones – Avidos

Cuestiones relacionadas