pocitacova mys ryba reprobedny letadlo cip
header

¿Cómo comparar dos bases de datos iguales?

3 de septiembre de 2019

Lang: cs en de es

Me llegó a las manos un proyecto donde tanto el código fuente como la base de datos diferían en lo que había en producción, en testing y en el repositorio. Necesitaba unificarlo. ¿Cómo comparar eficazmente dos bases de datos iguales y encontrar las diferencias? Encontré y probé varias herramientas para comparar bases de datos.

¿Cómo comparar dos bases de datos iguales?

El mundo de las aplicaciones web es un mundo de masas y por eso la calidad media es más baja. Así que uno se encuentra con de todo. Por ejemplo, incluso con un desarrollo donde no están versionados ni los cambios de la aplicación ni la base de datos.

Versionado de la base de datos

Desde hace años existen herramientas para PHP, como por ejemplo phpmig, nextras/migrations o Phinx , que sirven para describir los cambios de la estructura de la base de datos y para una transición suave entre versiones. La transición entre versiones de las estructuras de la base de datos puede ser tanto hacia delante, a una nueva versión, como hacia atrás. Los cambios hacia atrás se utilizan, por ejemplo, en el caso de que la actualización de la aplicación haya traído nuevos problemas que impiden su uso. Entonces se emplea la migración inversa preparada y devolver la aplicación a un estado utilizable es así rápido.

Sin embargo, para documentar los cambios bastaría al menos con una simple anotación de los comandos ALTER SQL, que hay que ejecutar para que la estructura y, en su caso, también los datos de la base de datos puedan actualizarse para la nueva versión de la aplicación.

Pero ¿cómo resolver el problema si tenemos dos versiones de la aplicación, por ejemplo la de producción y la de pruebas, donde las bases de datos difieren no sólo en los datos, sino también en la estructura? Y además el programador original no dejó ninguna información sobre los cambios. Entonces no queda más remedio que comparar las bases de datos. A mano seguramente nadie quiere hacerlo ni siquiera en proyectos pequeños, así que ¿cómo comparar bases de datos automáticamente?

Herramientas para comparar bases de datos

La herramienta gráfica MySQL Workbench debería saber comparar bases de datos, yo sin embargo no la uso, porque este SW se me cuelga y no le he dado más vueltas.
Me topé además con varias otras herramientas, a menudo de consola, que para el trabajo profesional de un desarrollador suelen ser más eficientes.

Al final elegí, probé y usé con éxito el software DBDiff

Si con las bases de datos apenas está empezando, eche un vistazo al artículo Programación en SQL: PostgreSQL, MySQL/MariaDB.

DBDiff

El programa requiere la versión PHP7, pero esa hoy en día ya está disponible habitualmente en las máquinas (en los entornos) de los desarrolladores PHP.

El programa DBDiff se puede descargar en GitHub, así que basta con hacer un clon del repositorio con el comando git:

git clone https://github.com/DBDiff/DBDiff.git

Uso

Primero hay que configurar el programa. Crear un archivo de configuración, por ejemplo config.cgf, y escribir en él los datos de acceso. Es decir, escribir en el archivo de configuración los datos de acceso a las bases de datos que queremos comparar.
El programa lo ejecutamos entonces de la siguiente manera:

./dbdiff  --config=config.cgf   server1.example.com:server2.example.com
El programa crea un archivo con la información sobre la comparación en formato de comandos SQL ./migration.sql.

El modificador --type=all compara todo en la base de datos, pero con bases de datos no pequeñas ocupa toda la memoria operativa disponible.
PHP tiene definido un límite de memoria, precisamente para que no pueda consumirse toda la memoria operativa que hay instalada en el ordenador. Por eso hay que ajustar en el archivo ./src/DBDiff.php el valor memory_limit, por ejemplo así:

ini_set('memory_limit', '1512M');

Otra posibilidad, y probablemente mejor, si quiere comparar todo el contenido y no ocuparse del límite de memoria operativa, es que con el programa se puede comparar la base de datos progresivamente, tabla por tabla. Ejemplo de uso:

./dbdiff  --config=config.cgf
server1.example.com.category:server2.example.com.category
--type=all --output=migration_category.sql

Valoración del programa

¿Qué reconoció el programa DBDiff?
Tras echar un vistazo al script de migración generado se ve que el programa reconoció:

  • tablas nuevas
  • filas añadidas,
  • columnas añadidas en la tabla


¿Qué no resuelve el programa DBDiff?

En la tabla con columnas añadidas no generó un update para establecer los valores en las nuevas columnas. Lo resolví haciendo una exportación de toda la tabla con los datos y para la posterior importación mediante update. Borrar la tabla e importar no funcionó, porque la tabla contiene claves a tablas ajenas.

¿Qué reconoce el programa DBDiff pero no resuelve?

El programa DBDiff detectó, pero no generó un script SQL suficiente, en el caso de un comentario modificado en una tabla. Concretamente generó un script que hizo un alter table, pero sin insertar ese nuevo comentario.

Artículos sobre un tema similar

Vibecoding: Cómo programar una buena aplicación con IA
Cómo acelerar la web
Rector: actualización de la aplicación PHP
Lenguaje de programación Go
Análisis de la asignación y fijación de precios del desarrollo de proyectos de software
Programa Python para controlar Docker mediante la API
Cómo utilizar MailCatcher para probar correos electrónicos
API OpenAI de Python
Creación de una aplicación web WebSocket y configuración de un proxy
Gestión de proyectos: desarrollo ágil de software
Cómo ejecutar aplicaciones PHP antiguas
Lo que debe saber un buen programador
Lenguaje de programación Rust
NodeJS: desarrollo, configuración del servidor
Fallo de seguridad de Nette CVE-2020-15227
API REST: API de plataforma
Alojamiento web y de correo personalizado con el software ISP Config
Programación en SQL: PostgreSQL, MySQL/MariaDB
HTTPS: web segura
Base de datos NoSQL Mongo DB
Connecting to Microsoft SQL Server from Linux
¿Cuál es la descripción del trabajo de un programador?
Localización de aplicaciones Python
Qué correo y alojamiento web elegir
Digispark - Programar microcontrolador Atmel ATtiny con Arduino IDE
Desarrollo para procesadores ARM con Arduino IDE
Cómo programar el procesador WiFi ESP8266
Comparación IQRF vs Arduino inalámbrico
¿Qué plataforma debo elegir para mi tienda electrónica? Por ejemplo, Prestashop
Kits de desarrollo y pasarelas para la plataforma inalámbrica IQRF
Kits de desarrollo y pasarelas para la plataforma inalámbrica IQRF

OpenStreetMap y rutas GPS en el mapa de la web
Quickplay
Tarjetas con chip, tanto de contacto como sin contacto, Java Card OpenPlatform
Smartphone abierto con Linux - Openmoko Neo FreeRunner
Desarrollo para módulos inalámbricos con procesador PIC bajo GNU/Linux - IQRF

Boletin informativo

Si está interesado en recibir noticias puntuales por correo electrónico.
Puedes registrarte rellenando tu email suscripción de noticias.


+