Skip to content
Netflix - 每月低至 25 元

PostgreSQL 数据库的备份与恢复

前言

最近买了台新服务器准备迁移 PostgreSQL,旧服务器和新服务器都是用的 1Panel 安装的 PostgreSQL,但直接从旧服务器导出,在新服务器导入会报错

sh
服务内部错误: pg_restore: error: could not execute query: ERROR: role "user_XXXXXX" does not exist

即便是把 PostgreSQL 用户名设置的一样也同样会报错,问了一下 ChatGPT 回复如下

报错的原因是目标数据库中没有 user_XXXXXX 这个角色,而备份文件中的对象(如函数和表)是由这个角色拥有的。为了成功恢复数据库,你需要在导入前或过程中解决角色不存在的问题。

如果 ChatGPT 还提供了四种解决方案:

  1. 手动创建角色
  2. 更改对象所有者
  3. 修改备份文件
  4. 忽略错误

没想到可以直接忽略错误?于是打开 Navicat 看了一下,虽然 1Panel 提示的服务内部错误,实际上数据库还是导入进去了。但这样导入的数据还是不太放心,后面 ChatGPT 还有提到推荐解决方案 1 或 2,以确保数据恢复的完整性和一致性。

下面手动使用 pg_dumppg_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
关注微信公众号
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0

预览:

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3