【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 等参数。
  • 迁移前可以先在测试环境跑一次,确保字段类型和数据兼容。
相关推荐
忆~遂愿3 分钟前
CANN metadef 核心解析:计算图原型定义、算子元数据抽象与异构系统互操作机制
docker·容器
那个村的李富贵13 分钟前
解锁CANN仓库核心能力:50行代码搭建国产化AIGC图片风格迁移神器
mysql·信息可视化·aigc·cann
说实话起个名字真难啊1 小时前
用docker来安装openclaw
docker·ai·容器
恬静的小魔龙1 小时前
【群晖Nas】群晖Nas中实现SVN Server功能、Docker/ContainerManager等
docker·svn·容器
Zfox_2 小时前
CANN Catlass 算子模板库深度解析:高性能 GEMM 融合计算、Cube Unit Tiling 机制与编程范式实践
docker·云原生·容器·eureka
春日见3 小时前
如何创建一个PR
运维·开发语言·windows·git·docker·容器
DARLING Zero two♡3 小时前
告别 Docker 命令行!Portainer+cpolar 让容器管理从局域网走向公网
运维·docker·容器
斯普信专业组3 小时前
构建基于MCP的MySQL智能运维平台:从开源服务端到交互式AI助手
运维·mysql·开源·mcp
七牛云行业应用4 小时前
Moltbook一夜崩盘:150万密钥泄露背后的架构“死穴”与重构实战
网络安全·postgresql·架构·高并发·七牛云
liu****4 小时前
2.深入浅出理解虚拟化与容器化(含Docker实操全解析)
运维·c++·docker·容器·虚拟化技术