在日常开发中,可能会遇到从 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 自动化完成数据迁移
✅ 利用图形化工具查看迁移结果
✅ 清理容器环境保持整洁