PostgreSQL跨版本升级后数据迁移
2024/5/13大约 3 分钟快速上手如何更新
注
说明:本文为群晖 NAS 上通过 Container Manager 迁移 PostgreSQL 数据的精简教程,适用于特定场景下的数据库迁移操作。
操作前请确保符合适用条件并仔细阅读步骤。
一、适用场景
- PostgreSQL 运行在群晖的 Container Manager(Docker) 环境中
- 新版本 PostgreSQL 容器已创建并正常运行
- 操作方式为通过 Xshell 远程 SSH 连接群晖进行操作
二、准备工作
1. 启用群晖 SSH 服务
- 进入群晖 DSM 系统,打开 控制面板
- 找到 终端机和 SNMP 选项,勾选 启用 SSH 服务
- 记录 SSH 端口号(默认端口为
22,若有修改需以实际设置为准)
2. 通过 Xshell 连接群晖
打开 Xshell,输入连接命令:
ssh 用户名@群晖IP -p 端口号(将 “用户名”“群晖 IP”“端口号” 替换为实际信息)
若登录后为普通用户权限,执行命令切换至 root 权限:
sudo -i
3. 确认容器状态
- 执行命令查看当前运行的容器:
docker ps - 在输出结果中找到旧 PostgreSQL 容器和新 PostgreSQL 容器的名称,例如:
- 旧容器:
ms-pgsql - 新容器:
postgres(请以实际容器名称为准)
- 旧容器:
三、备份旧容器数据库
为保障数据安全,需先对旧容器中的数据库进行完整备份:
- 创建备份目录:
mkdir -p /volume1/docker/pg_backup - 导出旧容器数据库数据至备份目录:(将
docker exec -t ms-pgsql pg_dumpall -U postgres > /volume1/docker/pg_backup/all.sqlms-pgsql替换为实际旧容器名称) - 验证备份文件是否正常:确认文件存在且大小符合预期。
ls -lh /volume1/docker/pg_backup/all.sql - (建议)将备份文件复制到本地电脑留存:(将 “群晖 IP” 替换为实际 IP 地址)
scp root@群晖IP:/volume1/docker/pg_backup/all.sql ./all.sql
四、导入数据到新容器
- 执行导入命令:(将
docker exec -i postgres psql -U postgres < /volume1/docker/pg_backup/all.sqlpostgres替换为实际新容器名称)
五、验证迁移结果
执行命令查看新容器中的数据库列表:
docker exec -it postgres psql -U postgres -c "\l"(将
postgres替换为实际新容器名称)检查输出结果,确认能看到旧容器中所有的数据库,即表示数据迁移成功。
六、切换应用
- 打开群晖 Container Manager,找到旧 PostgreSQL 容器(如
ms-pgsql),点击 停止 - 选中新 PostgreSQL 容器,点击 编辑,将容器端口修改为旧容器原来使用的端口(确保应用连接地址不变)
- 重启新容器,并测试应用是否能正常连接并访问数据库
七、清理(可选)
若确认新容器运行稳定,应用访问正常,可删除旧容器及旧数据目录以释放存储空间:
# 删除旧容器
docker rm ms-pgsql
# 删除旧数据目录
rm -rf /volume1/docker/postgres_old/data(将 ms-pgsql、postgres_old/data 替换为实际名称与路径)
八、迁移注意事项
- 若涉及 PostgreSQL 跨大版本升级(如从 13 升级至 17),推荐优先使用 pg_dumpall 备份 + 恢复 的方式,兼容性最佳
- 当数据库数据量较大时,可使用并行导出命令加快备份速度:(
pg_dump -Fd -j 4-j 4表示使用 4 个线程,可根据服务器性能调整) - 数据迁移前务必验证备份文件的可用性,避免因备份失效导致数据丢失
- 在群晖上操作时,建议将数据目录、备份目录等放在
/volume1/...路径下,防止群晖系统更新时误删数据

