Docker 环境下 PostgreSQL 17 + PostGIS 数据库迁移全流程(无坑实战)

3 阅读2分钟

一次真实迁移记录:从旧库导出 → 新库恢复 → 扩展安装 → 报错处理,全流程踩坑总结。


📌 一、背景说明

最近做了一次 PostgreSQL 数据迁移,涉及:

  • PostgreSQL 17
  • PostGIS 3.4(GIS 地理数据)
  • Docker 容器部署
  • 大数据量导入(性能优化)

👉 本文记录一套 稳定可复用的迁移方案,适用于生产环境。


🧱 二、环境信息

项目配置
系统CentOS 7
数据库PostgreSQL 17 + PostGIS 3.4
部署方式Docker
旧库旧数据库名
新库新库名称
备份文件/你的保存目录/backup.dump

🧩 三、迁移流程总览

旧库 → pg_dump → dump文件 → docker cp → 新容器 → pg_restore → 新库

📤 四、旧库导出(pg_dump)

1️⃣ 进入旧数据库容器

docker exec -it 旧容器名 bash

2️⃣ 执行导出

pg_dump -U postgres -d 旧数据库名 -F c -h 127.0.0.1 -f /tmp/backup.dump

💡 为什么用 -F c

  • 压缩格式(体积更小)
  • 支持并行恢复(更快)
  • 推荐生产使用 ✅

3️⃣ 拷贝到宿主机

docker cp 旧容器名:/tmp/backup.dump /你的保存目录

📥 五、新数据库导入

1️⃣ 启动 PostgreSQL 17 + PostGIS 容器(高性能参数)

docker run --name pg17new \
  -p 5432:5432 \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=你的密码 \
  -e POSTGRES_DB=danche \
  -v /你的挂载目录:/var/lib/postgresql/data \
  --shm-size 16g \
  -d postgis/postgis:17-3.4 \
  -c shared_buffers=16GB \
  -c effective_cache_size=48GB \
  -c max_connections=500 \
  -c work_mem=64MB \
  -c maintenance_work_mem=2GB \
  -c max_wal_size=16GB \
  -c max_worker_processes=16 \
  -c max_parallel_workers=16

2️⃣ 拷贝备份文件

docker cp /你的保存目录/backup.dump pg17new:/tmp/

3️⃣ 进入容器

docker exec -it pg17new bash

4️⃣ 创建数据库(关键步骤⚠️)

createdb -U postgres -h 127.0.0.1 motorcycle_new --template=template0

🚨 为什么必须这样做?

避免:

  • collation 版本冲突
  • 字符集不兼容

👉 这是迁移中最容易踩坑的点


5️⃣ 安装 pgRouting 扩展

apt update && apt install -y postgresql-17-pgrouting

6️⃣ 执行恢复

pg_restore -U postgres -h 127.0.0.1 -d 数据库名称 /tmp/backup.dump

🔌 六、连接数据库

psql -h 10.0.0.224 -p 5432 -U postgres -d 数据库名称

⚠️ 七、常见问题汇总(重点)

❌ 1. collation version mismatch

✔ 解决:

--template=template0

❌ 2. pgrouting 扩展不存在

✔ 解决:

apt install postgresql-17-pgrouting

❌ 3. 表 / 序列已存在

✔ 原因:

  • 重复执行 pg_restore

✔ 是否影响?

👉 不影响,可忽略