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.
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
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.