# 🚚 One-Time MySQL to PostgreSQL Migration with pgloader + Docker (Windows-Friendly)

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](https://www.docker.com/products/docker-desktop)

**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:

```plaintext
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](https://x.com/CapwellMurimi)
