PostgreSQL 数据库的备份与恢复
前言
最近买了台新服务器准备迁移 PostgreSQL,旧服务器和新服务器都是用的 1Panel 安装的 PostgreSQL,但直接从旧服务器导出,在新服务器导入会报错
sh
服务内部错误: pg_restore: error: could not execute query: ERROR: role "user_XXXXXX" does not exist
即便是把 PostgreSQL 用户名设置的一样也同样会报错,问了一下 ChatGPT 回复如下
报错的原因是目标数据库中没有
user_XXXXXX
这个角色,而备份文件中的对象(如函数和表)是由这个角色拥有的。为了成功恢复数据库,你需要在导入前或过程中解决角色不存在的问题。
如果 ChatGPT 还提供了四种解决方案:
- 手动创建角色
- 更改对象所有者
- 修改备份文件
- 忽略错误
没想到可以直接忽略错误?于是打开 Navicat 看了一下,虽然 1Panel 提示的服务内部错误,实际上数据库还是导入进去了。但这样导入的数据还是不太放心,后面 ChatGPT 还有提到推荐解决方案 1 或 2,以确保数据恢复的完整性和一致性。
下面手动使用 pg_dump
与 pg_restore
来通过解决方案 2 更加完美的解决这个问题。
备份
由于 1Panel 部署的 PostgreSQL 是通过 Docker 运行的,需要使用 docker exec
才可以操作 pg_dump
,同时为了解决角色所有的问题,这里加上 --no-owner
或 -O
sh
docker exec 1Panel-postgresql-XXXX pg_dump -U <your_target_user> --no-owner --encoding=UTF8 -Fc <your_database> > /root/backup_file.dump
恢复
恢复也是同样的,由于是 Docker 运行的,需要先把备份文件复制到容器中
sh
docker cp /root/example.dump 1Panel-postgresql-XXXX:/tmp/backup_file.dump
然后再通过 pg_restore
将备份文件恢复,如果你在导出的时候没有加 --no-owner
或 -O
,也可以在导入的时候添加
sh
docker exec -i 1Panel-postgresql-XXXX pg_restore -U <your_target_user> -d <your_database> --no-owner /tmp/backup_file.dump
预览: