windows平台,用pgloader转换mysql到postgresql
以下操作皆在windows平台
pgloader 的官方镜像在 Docker Hub 上维护:
docker pull dimitri/pgloader:latest
💡
dimitri
就是 pgloader 的作者 Dimitri Fontaine。
如果你想使用固定版本,可以指定 tag,例如:docker pull dimitri/pgloader:v3.6.7
安装完毕后点击action箭头不会执行,属于正常现象
之后不用.load脚本文件,而是用下方命令直接搞定(无需脚本文件)
docker run --rm dimitri/pgloader:latest pgloader mysql://root:11111@host.docker.internal:3306/wp1019 postgresql://postgres:11111@host.docker.internal:5432/catpostgre
💡 说明
部分 | 含义 |
---|---|
--rm | 运行结束后自动删除容器 |
dimitri/pgloader:latest | 使用官方 pgloader 镜像 |
pgloader | 容器内执行的命令 |
mysql://root:11111@host.docker.internal:3306/wp1019 | 你的 MySQL 连接串 |
postgresql://postgres:11111@host.docker.internal:5432/catpostgre | 你的 PostgreSQL 连接串 |
host.docker.internal | 让容器能访问宿主机的数据库(macOS 专用) |
经过实测,host.docker.internal虽然写着mac专用,但win10顺利执行,一般可以换成localhost
.load版本
一、「迁移前自动删除旧表并重建 schema」 版本
适合在多次重复导入或测试迁移时使用。
mysql_to_postgres.load
文件内容(可直接保存使用):
LOAD DATABASEFROM mysql://root:11111@host.docker.internal:3306/hghghgINTO postgresql://postgres:11111@host.docker.internal:5432/wp1020WITH drop schema, create tables, create indexes, reset sequencesSET work_mem to '64MB',maintenance_work_mem to '512MB',search_path to 'public'CAST type datetime to timestamptz drop default drop not null using zero-dates-to-null,type date drop not null using zero-dates-to-null
;
上述代码,hghghg是mysql的数据库名,wp1020是postgresql的数据库名
配置说明
部分 | 说明 |
---|---|
drop schema | 在导入前删除现有的 PostgreSQL schema(相当于清空数据库结构) |
create tables | 自动根据 MySQL 表创建新表 |
create indexes | 自动创建索引 |
reset sequences | 重置自增序列起点 |
CAST | 处理 MySQL → PostgreSQL 类型差异(特别是日期/时间) |
⚠️ 注意
这会清空 PostgreSQL 数据库的 public schema 中的所有表!
仅在你确定不需要保留旧数据时使用。
🚀 执行命令(同前)
docker run --rm -v D:\mm\mysql_to_postgres.load:/load.load dimitri/pgloader:latest pgloader /load.load
之前用${pwd}报错,后来发现windows环境下,还是用D:\xxxx路径的形式,写完整最安全了。
迁移效果
-
PostgreSQL 中旧表和数据被清空;
-
自动重建 schema 与表结构;
-
从 MySQL 拉取全部数据导入;
-
输出详细迁移报告。