Migrando 76 millones de registros desde MySQL a PostgreSQL en menos de 8 minutos con pgloader y Docker

Oswaldo Montaño
4 min readSep 11, 2024

--

Hace algún tiempo trabajé en un proyecto interesante que me presentó un reto técnico inesperado. Se trataba de una pequeña herramienta escrita en PHP y usaba MySQL como base de datos. La herramienta estaba concebida para recibir como entrada un archivo con información y correlacionar esos datos con algo mas de 76 millones de registros en la base de datos. Aunque la herramienta funcionaba correctamente, había un pequeño (pero crítico) problema: era increíblemente lenta. Los tiempos de procesamiento podían tardar días, literalmente. La causa era clara: una combinación de una base de datos con millones de registros, consultas ineficientes y falta de optimización en el sistema estaba generando cuellos de botella en el procesamiento.

El objetivo que se me planteó era claro: encontrar una alternativa con un mejor rendimiento. Mi propuesta fue desarrollar una aplicación de línea de comandos (CLI) en Go, junto con la posibilidad de considerar un cambio a PostgreSQL, ya que ofrece una gestión más eficiente de cargas grandes. Sin embargo, había un desafío importante que enfrentar: la migración de la base de datos.

Fue en ese momento cuando comencé a investigar soluciones para realizar esta tarea de manera eficiente y automática, y fue entonces cuando descubrí pgloader. Aunque esta herramienta puede instalarse localmente, decidí optar por una opción que simplificó aún más el proceso: la versión contenerizada de pgloader.

¿Qué es pgloader y por qué lo elegí?

Para quienes no lo conozcan, pgloader es una herramienta desarrollada por Dimitri Fontaine, un destacado ingeniero en la comunidad de PostgreSQL. Su propósito principal es simplificar la migración de bases de datos a PostgreSQL desde diversas fuentes, como MySQL, SQLite, o incluso archivos CSV. Lo que me atrajo de pgloader fue su capacidad para realizar conversiones automáticas de tipos de datos y manejar grandes volúmenes de información sin perder rendimiento, algo clave para mi proyecto.

Además, pgloader ofrece la posibilidad de realizar migraciones en paralelo, lo que mejora significativamente la velocidad de procesamiento, sobre todo cuando se trata de grandes bases de datos como la que estaba manejando en ese momento. Pero lo mejor de todo es que pgloader tiene una versión en Docker, creada por el mismo autor, que me permitió evitar el dolor de cabeza de instalarlo localmente y manejar dependencias.

Cómo ejecutar pgloader en Docker

Si estás considerando usar pgloader para tu propio proyecto, aquí te dejo el comando básico que usé para realizar la migración:

Primero que nada, en lugar de pasar directamente las credenciales en la línea de comandos, una buena práctica es almacenarlas en un archivo .env Este archivo permite mantener las credenciales y otros valores sensibles separados del código, haciendo que tu entorno sea más seguro y manejable. Aquí está un ejemplo de cómo podrías configurar el archivo .env

MYSQL_USER=tu_usuario_mysql
MYSQL_PASSWORD=tu_contraseña_mysql
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_DB=nombre_de_tu_base_de_datos

POSTGRES_USER=tu_usuario_postgres
POSTGRES_PASSWORD=tu_contraseña_postgres
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_DB=nombre_de_tu_base_de_datos_postgres
docker run --rm -it --network host dimitri/pgloader:latest \
pgloader \
mysql://$MYSQL_USER:$MYSQL_PASSWORD@$MYSQL_HOST:$MYSQL_PORT/$MYSQL_DB \
pgsql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB
  • — rm -it: Estos parámetros eliminan el contenedor una vez finalizado el proceso, manteniendo tu sistema limpio, y permiten la interacción en la terminal.
  • dimitri/pgloader:latest: Especifica que estamos usando la última versión disponible de pgloader desde Docker Hub.
  • Las URLs de MySQL y PostgreSQL: Estas cadenas definen las bases de datos de origen y destino, utilizando las credenciales y detalles de conexión de cada una.
  • — network host: Este parámetro permite que el contenedor acceda a los servicios de red del host directamente, en lugar de usar una red aislada de Docker. Esto es útil cuando las bases de datos (MySQL y PostgreSQL) están corriendo fuera de Docker, por ejemplo, en tu máquina local o en un servidor conectado a tu red local. En este caso específico, como mis bases de datos estaban corriendo en mi máquina local y no en contenedores de Docker, fue necesario usar esta configuración para que pgloader pudiera encontrarlas y conectarse correctamente.

Una vez ejecutado el comando, pgloader realiza la migración de los datos desde MySQL a PostgreSQL mostrando un resumen del proceso al finalizar.

A continuación, puedes ver un ejemplo de la salida, que detalla el tiempo de ejecución, la cantidad de registros transferidos, y el rendimiento alcanzado durante la migración:

Reflexionando sobre mi experiencia, la migración de bases de datos de MySQL a PostgreSQL con pgloader fue una solución que transformó un reto complejo en una tarea manejable. Lo que comenzó como una necesidad urgente de optimizar una herramienta lenta se convirtió en una oportunidad para aprender y aplicar una herramienta poderosa y versátil.

Gracias a pgloader y su versión contenerizada, pude simplificar el proceso y centrarme en los aspectos más críticos del proyecto. Si alguna vez te encuentras en una situación similar, espero que mi experiencia te inspire a probar pgloader y descubrir cómo puede facilitar tu propio viaje en la migración de datos. ¡Nunca se sabe qué sorpresas y soluciones efectivas te esperan en el camino!

Enlaces de interés

Si estás interesado en profundizar más sobre pgloader y su autor, aquí te dejo algunos enlaces que podrían serte útiles:

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

No responses yet

Write a response