当前位置: 首页 > ai >正文

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

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

http://www.xdnf.cn/news/7697.html

相关文章:

  • 如何在 Android 手机和平板电脑上下载应用程序
  • 【压型机通信瓶颈破解】Profinet转RS485协议转换,如何提升设备联动效率?
  • Axure高级交互设计:中继器嵌套动态面板实现超强体验感台账
  • SpringMVC 通过ajax 实现文件的上传
  • 嵌入式开发学习日志(linux系统编程--文件读写函数(2))Day24
  • 【面经分享】微派网络一面
  • vue3中RouterView配合KeepAlive实现组件缓存
  • 告别格式壁垒:用迪威模型实现 MMD 模型到 STP 的几何精准转换(附复杂发型处理技巧)
  • 九天画芯CEO张锦:AR 与 AI 融合重构智能终端生态,消费级市场迎来关键拐点
  • MCU 上电不启动的常见原因分析与排查思路
  • 2024年下半年软考系统架构设计师案例分析题
  • 【Leetcode 每日一题】3356. 零数组变换 II
  • Memory模块是agent的一个关键组件
  • 工业视觉缺陷检测的算法总结
  • SpringBoot JAR 启动原理
  • 【C++】从零认识C++的“继承”
  • 【Linux笔记】——线程池项目与线程安全单例模式
  • 【SFT监督微调总结】大模型SFT全解析:从原理到工具链,解锁AI微调的核心密码
  • JAVA虚拟机有义务保证<clinit>()方法的线程安全
  • 【工程篇】03:Miniconda安装
  • DAY31-文件的规范拆分和写法
  • 现代计算机图形学Games101入门笔记(十七)
  • Python Pandas库简介及常见用法
  • Nature 子刊排名(2025 版)
  • Java从入门到精通 - 案例专题
  • nRF Connect SDK开发之(1)环境搭建
  • 一文掌握 LoRA 常见变体
  • SpringBoot集成Jasypt对数据库连接密码进行加密、解密
  • vue2的项目登录逻辑
  • Java核心基础知识点全解析:从语法到应用实践