【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_timeoutwork_mem 等参数。
  • 迁移前可以先在测试环境跑一次,确保字段类型和数据兼容。
相关推荐
Wang's Blog5 小时前
PostgreSQL笔记51: 基于 pgvector 构建企业级智能问答系统
数据库·笔记·postgresql
AIMath~6 小时前
MVCC 与乐观锁,RR的本质
mysql
艾伦_耶格宇6 小时前
【DOCKER容器实战】-3 ElasticSearch + Kibana
elasticsearch·docker·jenkins
海兰6 小时前
【 Kafka进阶5】使用 Docker 部署 Apache Kafka 集群完全指南
docker·kafka·apache
Wang's Blog7 小时前
PostgreSQL笔记50: 基于PGVECTOR的实时推荐与搜索系统构建
笔记·postgresql
山甫aa7 小时前
JavaWeb后端开发学习手册
java·开发语言·数据库·学习·mysql·springboot·web
sel_97 小时前
【Docker】Docker 安装与使用详解:从零搭建到日常实战
人工智能·深度学习·算法·docker
卷无止境17 小时前
Windows 上丝滑开发 Python,并稳定构建 Docker 镜像
后端·python·docker
夜雪一千18 小时前
MySQL 全局锁是什么?原理、风险、备份踩坑完整实战
android·mysql·adb
吕海洋1 天前
目前可用的docker源2026.08
运维·docker·容器