En el proyecto en el cual estoy trabajando decidimos finalmente migrar la aplicación base a su versión más nueva. Esto supone muchísimo trabajo, no es solamente pisar los archivos de la aplicación con los de su versión más nueva y listo el pollo, ojalá!

Una de las tareas de la migración, es migrar el esquema de la base de datos a su versión más nueva y hacer esto a mano no solo es cansador si no que también es super propenso a errores. Así que me puse a buscar una herramienta que me ayude en esto.

Básicamente lo que necesitaba era una herramienta a la cual yo le pasara como parámetro el esquema de 2 bases de datos (El actual y el de la nueva versión) y me escribiera scripts SQL para llevar el esquema de la base vieja al de la nueva.

Y como pasa el 99% de las veces en el Software Libre, alguien ya lo resolvió antes. La herramienta en cuestión se llama: sqlt-diff

Entonces, para migrar del esquema de la BaseA1 al esquema de la BaseA2 hay que seguir los siguientes pasos:

1.- Hacer un dump del esquema de cada base, en mi caso ejecuté:

$ mysqldump -uUsuario -pPassWordSuperSegura -h servidorMySQL --database basea1 -d > basea1.sql
$ mysqldump -uUsuario -pPassWordSuperSegura -h servidorMySQL --database basea2 -d > basea2.sql

La opción «-d» de mysqldump hace que el archivo sql no tenga datos, es decir sólo la estructura.

2.- Instalar sqlt-diff

En Debian y en Ubuntu el paquete que trar esta utilidad es «libsql-translator-perl» y se instala:

$ sudo apt-get install libsql-translator-perl

3- Modificar archivos basea1.sql y basea2.sql antes de ejecutar sqlt-diff

No tuve tiempo de investigar por qué, pero a sqlt-diff no le gustan los dumps que tengan la sentencia de creación de la DB y de uso de esa misma DB. así que simplemente comenté esas líneas en los 2 archivos:

-- CREATE DATABASE /*!32312 IF NOT EXISTS*/ `basea1` /*!40100 DEFAULT CHARACTER SET utf8 */;
-- USE `basea1`;

4.- Ejecutar sqlt-diff

Ejecutar esto es bien sencillo:

$ sqlt-diff basea1.sql=MySQL basea2.sql=MySQL > diff.sql

Esto nos produce un archivo diff.sql que tiene todas las sentencias necesarias (CREATE TABLE, ALTER TABLE, DROP TABLE, etc) para ejecutar en la DB basea1 y que nos quede igual a basea2

En mi caso ese archivo tiene adentro algo como esto:

BEGIN;
 
SET foreign_key_checks=1;
 
ALTER TABLE accounts CHANGE COLUMN annual_revenue annual_revenue VARCHAR(100) NULL DEFAULT NULL,
                     CHANGE COLUMN phone_fax phone_fax VARCHAR(100) NULL DEFAULT NULL,
                     CHANGE COLUMN rating rating VARCHAR(100) NULL DEFAULT NULL,
                     CHANGE COLUMN phone_office phone_office VARCHAR(100) NULL DEFAULT NULL,
                     CHANGE COLUMN phone_alternate phone_alternate VARCHAR(100) NULL DEFAULT NULL,
                     ADD INDEX idx_accnt_name_del (name, deleted);
 
ALTER TABLE accounts_audit CHANGE COLUMN id id CHAR(36) NOT NULL,
                           ADD INDEX idx_accounts_parent_id (parent_id),
                           ADD PRIMARY KEY (id);
.......
Publicado el 07/03/2014 por jose