Hey folks 👋 I’m Capwell, and I recently had to migrate a MySQL database to PostgreSQL. It wasn’t a continuous sync — just a one-time migration — so I needed a quick, clean way to do it.
When you’re on Windows,You don’t want to install a bunch of tools, and just need something that works without drama, it can feel like a puzzle.
That’s what led me to pgloader + Docker — the perfect combo for a painless one-time migration. No native installs, no environment weirdness. Just results.
Here’s how I made it work
Installing Docker on Windows
If you’re using Windows (like I was), the easiest way to get started is by installing Docker Desktop. Here’s a quick walkthrough:
Download Docker Desktop
👉 Docker
Run the Installer
Follow the setup wizard. You’ll need WSL enabled (Windows Subsystem for Linux), which Docker will guide you through if it’s not already installed.
Launch Docker
Once installed, launch Docker Desktop. You should see the Docker whale icon in your system tray.
Why pgloader?
pgloader is an open-source tool that:
✅ Migrates schema and data
✅ Handles type conversions
✅ Works with MySQL, SQLite, MS SQL
✅ Supports load scripts for reusable, declarative migrations
✅ Can be run with Docker — no need to install anything
Step 1: Create a pgloader Load Script
In the folder where you want to run the migration, create a file called mysql_to_pg.load with the following content:
LOAD DATABASE
FROM mysql://root:yourpass@host.docker.internal/source_db
INTO postgresql://postgres:pgpass@host.docker.internal/target_db
WITH include drop,
create tables,
create indexes,
reset sequences,
data only
SET work_mem to '16MB',
maintenance_work_mem to '512 MB';
ALTER SCHEMA 'source_db' RENAME TO 'public';
🔁 Replace:
yourpass → your MySQL root password
pgpass → your PostgreSQL password
source_db / target_db → your actual DB names
Step 2: Run pgloader with Docker
Make sure Docker is installed and both MySQL/PostgreSQL are up and running.
On Windows (PowerShell)
powershell
docker run --rm -v "folder where the file is":/mnt dimitri/pgloader pgloader /mnt/mysql_to_pg.load
🛠 Common Pitfalls
✅ Make sure MySQL and Postgres are running
✅ Ensure firewall/ports aren’t blocking connections
✅ For Dockerized MySQL/Postgres, use a shared network or proper host IPs
💬 Final Thoughts
This approach:
✔️ Works on Windows (which I used)
✔️ Doesn’t require any installs (thanks to Docker)
✔️ Makes migrations repeatable with load scripts
For a one-time migration, it's hard to beat.
Got stuck?
Drop a comment below or ping me on Twitter
Top comments (2)
Great read
Thank you