一次真实迁移记录:从旧库导出 → 新库恢复 → 扩展安装 → 报错处理,全流程踩坑总结。
📌 一、背景说明
最近做了一次 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
✔ 是否影响?
👉 不影响,可忽略