2009-01-19 18 views
12

Estaba buscando un script portátil o un programa de línea de comandos que pueda sincronizar dos esquemas de bases de datos MySQL. No busco una solución basada en GUI porque no puede ser automatizada o ejecutarse con la herramienta buid/deployment.Sincronizar el esquema de dos bases de datos en MySQL

Básicamente lo que debe hacer es escanear database1 y database2. Compruebe la diferencia de esquema (tablas e índices) y proponga un conjunto de sentencias de SQL para ejecutar en una, de modo que obtenga la estructura similar de la otra minimizando el daño de datos tanto como sea posible.

Si alguien puede indicar un paquete de PHP, Python o Ruby donde se implementa este tipo de solución, puedo intentar copiar el código desde allí.

Muchas herramientas de MySQL GUI probablemente pueden hacer esto, pero estoy buscando una solución de secuencias de comandos.

Editar: Disculpa por no ser más claro: Lo que estoy buscando es la sincronización en la estructura de la tabla manteniendo los datos intactos en la medida de lo posible. No es replicación de datos.

Más información:

Por qué la replicación no funcionará.

  1. Las bases de instalación se extienden por todo el estado.
  2. Queremos que el instalador realice correcciones dinámicas en la base de datos basadas en chagnes realizados en la última versión, independientemente de la versión anterior que el usuario final pueda estar utilizando.
  3. Los cambios son, en general, como agregar una nueva columna a una tabla, crear nuevos índices o descartar índices, agregar tablas o eliminar tablas usadas internamente por el sistema (no descartamos la tabla de datos de usuario).

Si se trata de una GUI: No, no se puede usar. No deseamos combinar una aplicación de 20MB con nuestro instalador solo para DB diff. Especialmente cuando el instalador original es inferior a 1 MB.

+0

+1 excelente pregunta. Iba a preguntar porque estoy buscando la misma solución ... pero encontré esto. –

Respuesta

5

¿Ha considerado usar MySQL replication?

+0

Sospecho que OP está buscando algo tan simple como sea posible para simplemente replicar el esquema. Supongo que la replicación de MySQL podría hacer eso, pero no es exactamente fácil de configurar. – Nathan

+0

La replicación es mucho más fácil de configurar (si tiene los derechos) y luego escribir lo que sería una herramienta SQL diff. – Willem

+0

Parece que esto también requiere duplicación de datos, por '... porque los datos se replican en el esclavo ...'. Además, el ejemplo de PHP proporcionado requiere una función 'DROP DATABASE', que está fuera del alcance de la pregunta. –

1

Para una solución profesional a largo plazo, debe estar atento a Schemamatic (http://versabanq.com/products/schemamatic.php). Este enlace muestra una aplicación GUI pero todo lo que hace es manipular un software de línea de comandos. En esta página hay un enlace a su sitio de código de google donde se puede encontrar la versión de C# .Net de Schemamatic. Su solución perfecta sería agregar soporte para MySQL a Schemamatic. Para SQL Server, es perfecto y hace exactamente lo que usted mencionó.

Ahora, para una solución a corto plazo que sugeriría vertido los datos que desea con las herramientas de línea de comandos de MySQL como: mysqldump -A -c -uroot ppassword> bkpmysql.sql

y jugar con él , aunque debería tomar bastante tiempo lograr lo que quieres. Schemamatic realmente me parece su mejor opción. Avíseme si necesita alguna aclaración cuando/si intenta con Schemamatic.

1

Es posible que desee ver algunas herramientas como dbdeploy (esta es una versión java o .net) y liquidbase y others.

Aunque la mayoría de estos creo que aplicarán conjuntos de cambios a un DB de forma controlada. No sé si pueden realizar ingeniería inversa a partir de esquemas existentes y comparar.

E.

4

SQLyog hace eso y es increíble. Lo usamos en producción a menudo.

+0

Estoy de acuerdo, excelente herramienta. Sin embargo, no funciona en la mayoría de mis servidores web debido al bloqueo de puertos. –

+0

@Talvi Watia, proporcionan un proxy PHP para tales casos. –

1

sé que es una vieja pregunta, pero fue el primer resultado en Google por lo que estaba buscando (exactamente lo mismo que la pregunta inicial)

he encontrado la respuesta todavía aquí, pero no me acuerdo el URL es un guión que se inició a partir de:

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 

y terminó de la misma familia cheque

#!/bin/sh 

echo "Usage: dbdiff [user1:[email protected]] [user2:[email protected]] [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 
Cuestiones relacionadas