【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 等参数。
  • 迁移前可以先在测试环境跑一次,确保字段类型和数据兼容。
相关推荐
敲个大西瓜几秒前
Java项目常用数据归档方式
mysql
CodeMartain1 小时前
Dify Windows 原生部署(无 Docker、纯本地)
运维·docker·容器
Muscleheng2 小时前
Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
数据库·postgresql
kyriewen2 小时前
面试官让我查各部门工资最高的员工,我用AI三秒写出窗口函数,他愣了
后端·mysql·面试
小码工作室2 小时前
使用 HAVING 进行 MySQL 集合筛选
mysql
罗超驿3 小时前
18.事务的隔离性和隔离级别:MySQL面试高频考点全解析
数据库·mysql·面试
llrraa20103 小时前
配置docker国内镜像源
运维·docker·容器
小江的记录本3 小时前
【Java基础】Java 8-21新特性:JDK21 LTS:虚拟线程、模式匹配switch、结构化并发、序列集合(附《思维导图》+《面试高频考点清单》)
java·数据库·python·mysql·spring·面试·maven
木心术14 小时前
Windows系统下MySQL与AI工具集成方案:数据存储与调用实践
人工智能·windows·mysql
这个DBA有点耶4 小时前
SQL改写实战:子查询、CTE、窗口函数性能对比
数据库·mysql·性能优化