soporta - optimizar consultas mysql explain
Sincronizar el esquema de dos bases de datos en MySQL (6)
¿Has considerado usar la replicación de MySQL ?
Estaba buscando un guión portátil o un programa de línea de comando 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.
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 la GUI de MySQL probablemente pueden hacer esto, pero estoy buscando una solución de secuencias de comandos.
Editar: Lo siento por no ser más claro: lo que estoy buscando es la sincronización en la estructura de la tabla mientras se mantienen 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á
- Las bases de instalación se extienden por todo el estado.
- 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.
- Los cambios son, en general, como agregar una nueva columna a una tabla, crear nuevos índices o eliminar índices, agregar tablas o eliminar tablas usadas internamente por el sistema (no descartamos la tabla de datos del usuario).
Si es 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.
Es posible que desee ver algunas herramientas como dbdeploy (esta es una versión java o .net) y liquidbase y otros .
Aunque la mayoría de estos creo que aplicará conjuntos de cambios a una base de datos de una manera controlada. No sé si pueden realizar ingeniería inversa a partir de esquemas existentes y comparar.
MI.
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, le sugiero que elimine los datos que desea con las herramientas de línea de comandos de MySQL, como: mysqldump -A -c -uroot -pcontraseña> bkpmysql.sql
Y juegue con él, aunque tomarse bastante tiempo para lograr lo que quiere. Schemamatic realmente me parece su mejor opción. Avíseme si necesita alguna aclaración cuando / si intenta con Schemamatic.
SQLyog lo hace y es increíble. Lo usamos en producción a menudo.
Sé que es una vieja pregunta, pero fue el primer resultado en Google para lo que estaba buscando (exactamente lo mismo que la pregunta inicial)
Encontré la respuesta aquí, pero no recuerdo la URL, es una secuencia de comandos que comenzó desde:
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ó más así
#!/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