【MySQL/PostgreSQL】MySQL 到 PostgreSQL 数据迁移:Docker + pgloader

MySQL 到 PostgreSQL 数据迁移:Docker + pgloader

在实际项目中,可能会遇到需要将 MySQL 数据库迁移到 PostgreSQL 的场景。直接操作 SQL 语句或手工迁移数据不仅效率低,而且容易出错。本文将介绍使用 Docker + pgloader 来快速、可靠地完成 MySQL 到 PostgreSQL 的数据迁移。


一、准备工作

  1. 安装 Docker
    Docker 官方安装指南
  2. 准备好 MySQL 和 PostgreSQL 数据库,并确认可以通过网络访问。
  3. 确认 Docker 可以访问数据库(同一主机或配置网络)。

二、方法一:同机直接迁移

如果 MySQL 和 PostgreSQL 在同一台主机上,可以使用如下命令:

bash 复制代码
docker run --rm --network host dimitri/pgloader:latest \
  pgloader mysql://root:mysql_pwd@localhost/source_db \
           postgresql://postgres:pg_pwd@localhost/target_db

✅ 说明:

  • --network host:使用主机网络,确保容器可以访问数据库。
  • mysql://root:mysql_pwd@localhost/source_db:源 MySQL 数据库连接信息。
  • postgresql://postgres:pg_pwd@localhost/target_db:目标 PostgreSQL 数据库连接信息。

这种方式适合快速迁移,但对于复杂配置或需要复用迁移脚本的场景,推荐方法二。


三、方法二:使用 pgloader 配置文件迁移

对于复杂或频繁的迁移,使用配置文件更加灵活,可以精细控制数据类型映射、索引、序列等。

1️⃣ 创建迁移配置文件

在项目目录下创建 migrate.load 文件,内容示例:

lisp 复制代码
LOAD DATABASE
    FROM mysql://root:123456@localhost:3306/test_db
    INTO postgresql://admin:123456@localhost:5432/test_db

WITH include drop, create tables, create indexes, reset sequences

SET MySQL PARAMETERS
    net_read_timeout  = '120',
    net_write_timeout = '120'

SET PostgreSQL PARAMETERS
    maintenance_work_mem to '128MB',
    work_mem to '12MB'

CAST type datetime to timestamptz
     drop default drop not null using zero-dates-to-null,
     type date drop not null drop default using zero-dates-to-null;

✅ 说明:

  • LOAD DATABASE:指定源 MySQL 数据库和目标 PostgreSQL 数据库。
  • WITH include drop, create tables, create indexes, reset sequences:迁移时删除旧表、创建新表和索引,并重置序列。
  • CAST type datetime to timestamptz:将 MySQL 的 datetime 类型映射为 PostgreSQL 的 timestamptz,并处理 MySQL 的零日期问题。

可选:如果只想迁移部分表,可以使用:

lisp 复制代码
INCLUDING ONLY TABLE NAMES MATCHING 'test'

只迁移表名包含 test 的表。


2️⃣ 运行 Docker 执行迁移

bash 复制代码
docker run --rm -it --platform linux/amd64 \
  --network host \
  -v $(pwd)/migrate.load:/tmp/migrate.load \
  dimitri/pgloader:latest \
  pgloader /tmp/migrate.load

✅ 说明:

  • -v $(pwd)/migrate.load:/tmp/migrate.load:挂载本地配置文件到容器中,避免在容器内手动操作。
  • --platform linux/amd64:确保 pgloader 镜像在主机上正常运行。
  • pgloader /tmp/migrate.load:执行配置文件中的迁移任务。

迁移完成后,PostgreSQL 数据库将拥有 MySQL 的完整数据和表结构。


四、总结

使用 Docker + pgloader 迁移 MySQL 到 PostgreSQL 的优点:

  1. 安全可靠:支持事务迁移和类型映射,减少出错概率。
  2. 灵活可控:通过配置文件精确控制表、字段和索引迁移。
  3. 易于重复执行:迁移脚本可复用,适合定期迁移或多环境操作。

📌 小贴士:

  • 对于大数据量数据库,可以适当调整 net_read_timeout、work_mem 等参数。
  • 迁移前可以先在测试环境跑一次,确保字段类型和数据兼容。
相关推荐
auspicious航1 小时前
PostgreSQL的备份与恢复
数据库·postgresql
IvorySQL2 小时前
PostgreSQL 日报| WAL summarizer 断言失败(10 月 26 日)
数据库·postgresql·区块链
这个DBA有点耶3 小时前
2026年国产数据库“实际用户增长最快”核验指南:口径优先级、可查数据与选型动作清单
数据库·mysql·架构
程序员塔塔喵3 小时前
【MySQL篇|第三篇】脏读,幻读,不可重复读
数据库·mysql·不可重复读·幻读·脏读
说实话起个名字真难啊4 小时前
实战docker部署dify及注意点
运维·docker·容器
这个DBA有点耶4 小时前
备份成功≠数据可恢复:静默损坏会让物理备份把坏页一起带走
数据库·mysql·代码规范
数据库小学妹4 小时前
MySQL MDL锁等待排查:DDL卡住与长事务定位
数据库·后端·mysql
lhdz_bj5 小时前
Mysql Server配置详解
mysql·配置·file·config·1024程序员节·option·选项
Starry-sky(jing)7 小时前
crane 下载镜像:不连接 Docker,3 步准备并校验 ARM64 离线包
运维·docker·arm64·crane
ss2737 小时前
30 PostgreSQL ACID特性详解
数据库·postgresql