Ir al contenido principal

JCK.com.ar | El Blog de Pepe

Este blog contribuye indefectiblemente con el aumento de Entropía del universo.

Creando scripts de migración SQL automatizadamente

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);