‘Pgloader’ del Delfín (MySQL) al Elefante (PostgreSQL) en un solo comando

converting-from-mysql-to-postgresql-1-638

Hace unas semanas que empecé un nuevo proyecto en J2EE. Como soy un chico ordenado, me gusta desarrollar mi esquema de base de datos con algún editor visual tipo Visio, o el propio MySQL Workbench, que para este proyecto es el que utilicé. Así pues, me puse a ello y como siempre la cosa se fue complicando. Al final el desarrollo del esquema de entidad relación me llevó más de lo que pensaba, pero ya lo tenía.

13600017_644498425700686_2165152317104885173_n

Era momento de exportar todo a un archivo SQL,  MySQL Workbench tiene una bonita opción para exportar los datos a un archivo SQL, para luego poder crear la base de datos con ese fichero creado. Fue exactamente en este punto cuando me dí cuenta de que el proyecto requería que la base de datos fuera PostgreSQL.

Sé que la sintaxis entre ambas bases de datos es parecida, y cambiarla, aunque sería entretenido, no supondría ningún problema. Aún así, pensé en que tenía que existir alguna herramienta para ello. Y rápidamente di con PGLOADER.

Este script promete migar estructura y datos de una MySQL a una PostgreSQL con un solo comando. Y puedo verificar que así es, además de esta funcionalidad ofrece múltiples opciones a la hora de elegir la fuente de la migración (CSV, SQLITE, etc)

Tras solucionar, junto con su desarrollador (Dimitri Fontaine) , unos problemas con la versión del script, conseguí migar estructura y datos de mi MySQL a PostgreSQL, estos son los pasos que realicé (sobre Ubuntu64 16.04) .

Actualizamos e instalamos paquetes necesarios:

$apt-get update
$apt-get upgrade
$apt-get install sbcl unzip libsqlite3-dev make curl gawk freetds-dev libzip-dev

Instalamos el script:

$apt-get install pgloader

En este punto tengo que decir que la versión del repositorio no estaba actualizada, así que tuve que bajar los archivos fuentes de la web y compilarlos en mi máquina, algo bien sencillo en cualquier caso.

Creamos el archivo de configuración, en mi caso:

$nano mydb.load

LOAD DATABASE
FROM mysql://usuarioMySQL:Password@192.168.1.100:3306/mydb
INTO postgresql://UsuarioPostgreSQL:Password@192.168.1.100:5432/mydb
WITH include drop, create tables, no truncate,
create indexes, reset sequences, foreign keys
SET maintenance_work_mem to '128MB', work_mem to '12MB';

Guardo el archivo y ejecuto:

$pgloader mydb.load

 

2016-07-07T11:35:53.035000Z LOG Main logs in '/tmp/pgloader/pgloader.log'
2016-07-07T11:35:53.038000Z LOG Data errors in '/tmp/pgloader/'
2016-07-07T11:35:53.038000Z LOG Parsing commands from file #P"/home/mydb.load"

            table name       read   imported     errors            time
----------------------  ---------  ---------  ---------  --------------
       fetch meta data         39         39          0          1.501s
          create, drop          0         26          0          2.807s
----------------------  ---------  ---------  ---------  --------------
                cargos          0          0          0          0.144s
       certificaciones          0          0          0          0.099s
       clasificaciones          0          0          0          0.095s
         composiciones          0          0          0          0.099s
      estados_facturas          0          0          0          0.106s
     estados_solicitud          0          0          0          0.089s
              facturas          0          0          0          0.133s
                marcas          0          0          0          0.099s
             productos          0          0          0          0.112s
           solicitudes          0          0          0          0.121s
               tarifas          0          0          0          0.117s
         tipos_tarifas          0          0          0          0.112s
              usuarios          0          0          0          0.112s
Index Build Completion          0          0          0          0.000s
----------------------  ---------  ---------  ---------  --------------
        Create Indexes         38         39          0          2.279s
       Reset Sequences          0         12          0          0.323s
          Primary Keys         13         13          0          0.396s
          Foreign Keys         26         26          0          0.803s
              Comments          0          0          0          0.000s
----------------------  ---------  ---------  ---------  --------------
     Total import time          0          0          0          7.268s

Captura

Captura6

Con estos sencillos pasos consigo migrar la estructura y datos de una base de datos a otra respetando claves primarias, claves foráneas, etc…

Recomiendo examinar detenidamente las posibilidades del script desde su página web http://www.pgloader.oi , ya que posee múltiples opciones de configuración, casting de datos etc…  sinceramente lo veo una herramienta bastante práctica.

Autor: Jorge Bastida Cano

Programador de Software y Apasionado de las nuevas tecnologías.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.