MySQL 到 PostgreSQL 数据迁移:Docker + pgloader
在实际项目中,可能会遇到需要将 MySQL 数据库迁移到 PostgreSQL 的场景。直接操作 SQL 语句或手工迁移数据不仅效率低,而且容易出错。本文将介绍使用 Docker + pgloader 来快速、可靠地完成 MySQL 到 PostgreSQL 的数据迁移。
一、准备工作
- 安装 Docker
Docker 官方安装指南 - 准备好 MySQL 和 PostgreSQL 数据库,并确认可以通过网络访问。
- 确认 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 的零日期问题。
可选:如果只想迁移部分表,可以使用:
lispINCLUDING 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 的优点:
- 安全可靠:支持事务迁移和类型映射,减少出错概率。
- 灵活可控:通过配置文件精确控制表、字段和索引迁移。
- 易于重复执行:迁移脚本可复用,适合定期迁移或多环境操作。
📌 小贴士:
- 对于大数据量数据库,可以适当调整
net_read_timeout、work_mem等参数。 - 迁移前可以先在测试环境跑一次,确保字段类型和数据兼容。