【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 等参数。
  • 迁移前可以先在测试环境跑一次,确保字段类型和数据兼容。
相关推荐
heze093 小时前
sqli-labs-Less-19自动化注入方法
mysql·网络安全·自动化
芥子沫3 小时前
书签管理工具使用:Readeck-Docker部署和使用技巧
运维·docker·容器·书签管理
ba_pi3 小时前
每天写点什么2026-01-19-docker如何使用GPU
运维·docker·容器
Mr.徐大人ゞ3 小时前
3.pg重要参数解析
postgresql
数据知道3 小时前
亿级图片链接存入 PostgreSQL,URL链接字段数据类型用哪个最合适?
数据库·postgresql
七七powerful3 小时前
docker 部署dirsearch并进行目录遍历扫描
运维·docker·容器
l1t3 小时前
净化SQL的PL/pgSQL函数
数据库·sql·postgresql
霖霖总总4 小时前
[小技巧37]解构 my.cnf:[client] 与 [mysql] 背后的加载逻辑与优先级
运维·mysql
liux35284 小时前
MySQL日志系统全面解析:从基础到高级管理(六)
数据库·mysql·oracle