零基础教程:用 Docker + pgloader 将 MySQL 数据库迁移到 PostgreSQL

发布于:2025-05-22 ⋅ 阅读:(24) ⋅ 点赞:(0)

在日常开发中,可能会遇到从 MySQL 迁移到 PostgreSQL 的需求。你也许是:

  • 正在准备从传统架构转向云原生;
  • 想使用 PostgreSQL 更强的事务与 JSON 支持;
  • 想统一团队数据库技术栈;
  • 纯粹为了尝试学习不同的数据库系统。

别担心,无需手动写导出脚本,无需配置复杂工具,只需借助 Docker 和一个神奇的工具——pgloader,即可轻松完成。


✅ 教程目标

  • 使用 Docker 启动 MySQL 和 PostgreSQL 容器
  • 利用 pgloader 将数据从 MySQL 自动迁移到 PostgreSQL
  • 整个过程无需安装本地数据库,适合所有平台(Windows/Mac/Linux)

🧾 环境准备

你只需要安装好以下软件:

  • Docker Desktop(可从 官网 下载并安装)
  • 命令行终端:Windows 用户可用 PowerShell,Mac/Linux 使用终端即可
  • 一个耐心的你 🧠

🧰 一、提前拉取所需镜像

为了避免容器启动时网络太慢,可以先手动拉取镜像:

# 打开终端 PowerShell 或 bash

# 拉取 MySQL 镜像
docker pull mysql

# 拉取 PostgreSQL 镜像
docker pull postgres

# 拉取 pgloader 镜像
docker pull dimitri/pgloader:latest

🧱 二、启动数据库容器

启动 MySQL 容器

docker run -d --name my-mysql -e MYSQL_ROOT_PASSWORD=myrootpassword -e MYSQL_DATABASE=mydb -e MYSQL_USER=myuser -e MYSQL_PASSWORD=mypassword -p 3306:3306 -v $PWD/mysql_data:/var/lib/mysql mysql

📌 参数解释:

  • -e:设置环境变量,如数据库名、用户名、密码等
  • -v:挂载数据目录,持久化存储
  • -p:将容器端口映射到宿主机
  • $PWD:当前目录(Linux/macOS 下可用,Windows 可用 %cd%

启动 PostgreSQL 容器

docker run -d --name my-postgres -e POSTGRES_USER=myuser -e POSTGRES_PASSWORD=mypassword -e POSTGRES_DB=mydb -p 5432:5432 -v $PWD/pgdata:/var/lib/postgresql/data postgres

🌐 三、创建容器网络(让它们“看得见彼此”)

Docker 容器默认在隔离网络中,pgloader 需要两个数据库“互通”,所以需要:

# 创建网络
docker network create pgloader-net

# 将两个容器加入该网络
docker network connect pgloader-net my-mysql
docker network connect pgloader-net my-postgres

📦 四、使用 pgloader 执行数据迁移

docker run --rm --network=pgloader-net dimitri/pgloader:latest pgloader mysql://myuser:mypassword@my-mysql:3306/mydb postgresql://myuser:mypassword@my-postgres:5432/mydb

📌 这条命令会:

  • 自动连接两个数据库容器
  • 将所有表结构、索引、数据内容一并迁移
  • 无需写任何 SQL 或导出文件!

✅ 五、迁移成功后如何验证?

你可以使用以下方法验证数据是否成功迁移到 PostgreSQL:

方法 1:进入 PostgreSQL 容器查看数据

docker exec -it my-postgres psql -U myuser -d mydb

然后输入 SQL:

\dt -- 查看所有表
SELECT * FROM 表名 LIMIT 10;

方法 2:使用图形工具连接 PostgreSQL

推荐使用以下客户端工具之一:

  • DBeaver
  • pgAdmin
  • DataGrip
  • Navicat Premium

连接 PostgreSQL,输入如下信息:

  • Host:localhost
  • Port:5432
  • Database:mydb
  • Username:myuser
  • Password:mypassword

🧹 六、清理环境(可选)

如果只是测试或临时使用,可以删除这些容器和网络:

docker rm -f my-mysql my-postgres
docker network rm pgloader-net

也可以删除挂载的卷:

rm -rf ./mysql_data ./pgdata

🧠 常见问题与排查

问题 解决办法
容器启动失败 检查端口是否被占用,或数据卷权限
pgloader 报错 Connection refused 检查网络是否连接、数据库是否正常启动
数据库为空 确保 MySQL 中原本就有表和数据;否则 pgloader 无内容可迁移
Windows 下 $PWD 报错 改用 %cd%,或手动指定绝对路径,如 C:/Users/xxx/mysql_data:/var/lib/mysql

📌 总结

通过本文你学会了:

✅ 使用 Docker 快速搭建 MySQL 和 PostgreSQL 环境
✅ 使用 pgloader 自动化完成数据迁移
✅ 利用图形化工具查看迁移结果
✅ 清理容器环境保持整洁


网站公告

今日签到

点亮在社区的每一天
去签到