Postgresql 如何还原postgres备份-错误:无法删除当前打开的数据库

Postgresql 如何还原postgres备份-错误:无法删除当前打开的数据库,postgresql,pg-restore,Postgresql,Pg Restore,我正在尝试从一个不再配置的系统恢复postgres备份,根据我的尝试,我会收到一系列错误 我只有备份,没有原始服务器可供参考 我过去曾成功地从这些生产备份中恢复,但自从上次成功后,我的本地环境就变得一团糟(例如通过自制重新安装了postgres) 我相信一位前同事(不再可用)已成功恢复了此特定备份 我在以下情况下遇到了相同的错误: 正在尝试使用备份postgresql@9.4 尝试以前已知的良好版本的数据库(使用postgres 11) (我读过相关/建议的问题,但它们似乎并不相关) 使

我正在尝试从一个不再配置的系统恢复postgres备份,根据我的尝试,我会收到一系列错误

  • 我只有备份,没有原始服务器可供参考
  • 我过去曾成功地从这些生产备份中恢复,但自从上次成功后,我的本地环境就变得一团糟(例如通过自制重新安装了postgres)
  • 我相信一位前同事(不再可用)已成功恢复了此特定备份
  • 我在以下情况下遇到了相同的错误:
    • 正在尝试使用备份postgresql@9.4
    • 尝试以前已知的良好版本的数据库(使用postgres 11)
(我读过相关/建议的问题,但它们似乎并不相关)

使用以下命令(在bash脚本中)在上创建备份:

用于恢复脚本(备份脚本将其作为帮助文本回送)的命令是:

dropdb${PGDATABASE}
createdb${PGDATABASE}
时间pgu恢复\
-j4\
-d${PGDATABASE}\
--创造\
--没有特权\
--无主\
--干净的\
--如果存在\
--出错退出\
“${dirname}/${filename}”
在本地运行restore命令时,会得到以下结果:

time pg_restore-j4-d${PGDATABASE}--创建--没有权限--没有所有者--清除--如果存在--出错退出../backups/backup_2019-09-03_16-00-19.pg_dump
pg_restore:[archiver(db)]处理TOC时出错:
pg_restore:[archiver(db)]来自TOC条目4954的错误;1262 962277数据库mydb mydb
pg_restore:[archiver(db)]无法执行查询:错误:无法删除当前打开的数据库
命令为:如果存在mydb,则删除数据库;
实际0.049秒
用户0m0.019s
sys 0m0.012s
以前,我只在运行几分钟后出现过“磁盘空间不足错误”,但是从
time
输出中可以看到,此错误几乎立即发生

备份是使用压缩创建的
-Fc
,我可以使用
pg_restore backup.pg_dump>backup.sql
,将备份反压缩为纯文本,但我在其中找不到任何与
DROP DATABASE
相关的命令:/

--从数据库版本9.6.11中转储
--由PGU转储版本11.3(Ubuntu 11.3-1.pgdg14.04+1)转储
我看到DB最初是从
9.6.11
中转储的,但我有理由相信我以前成功地用第10页恢复了它

我尝试过各种方法,比如:

time pg_restore-d${PGDATABASE}--没有特权--没有所有者--出现错误时退出../backups/backup_2019-09-03_16-00-19.pg_dump
pg_restore:[archiver(db)]处理TOC时出错:
pg_restore:[archiver(db)]来自TOC条目7的错误;2615 1033373模式公共mydb
pg_restore:[archiver(db)]无法执行查询:错误:架构“public”已存在
命令为:创建公共模式;
ptim:dropdb-mydb;createdb mydb
ptim:gizmag ptim$dropdb mydb
ptim:gizmag ptim$time pg_restore-d${PGDATABASE}--创建--没有特权--没有所有者--出错时退出../backups/backup_2019-09-03_16-00-19.pg_dump
pg_restore:[archiver(db)]与数据库“mydb”的连接失败:致命:数据库“mydb”不存在
#我猜我误解了创建标志!
ptim:gizmag ptim$dropdb mydb;createdb mydb
dropdb:数据库删除失败:错误:数据库“mydb”不存在
ptim:gizmag ptim$time pg_restore-d${PGDATABASE}--创建--没有特权--没有所有者--出错时退出../backups/backup_2019-09-03_16-00-19.pg_dump
pg_restore:[archiver(db)]处理TOC时出错:
pg_restore:[archiver(db)]来自TOC条目4954的错误;1262 962277数据库mydb mydb
pg_restore:[archiver(db)]无法执行查询:错误:数据库“mydb”已存在
命令是:使用TEMPLATE=template0 ENCODING='UTF8'LC_COLLATE='en_US.UTF-8'LC_CTYPE='en_US.UTF-8'创建数据库mydb;
我还尝试从纯文本转储还原,但未成功:

psql-U ptim-d mydb-1-f../backups/backup\U 2019-09-03\U 16-00-19.sql
设置
设置
设置
设置
设置
设置配置
------------
(1排)
设置
设置
设置
设置
psql:../backups/backup\u 2019-09-03\u 16-00-19。sql:23:错误:架构“public”已存在
psql:../backups/backup\u 2019-09-03\u 16-00-19。sql:26:错误:当前事务被中止,在事务块结束之前忽略命令
#剪断。。。重复的,不同的错误接踵而至

有什么建议吗

多亏了没有名字的@a_horse_的提示,我学会了:

-C
-create
在还原到数据库之前创建数据库。如果还指定了
--clean
,请在连接到目标数据库之前删除并重新创建该数据库

使用此选项时,名为
-d
的数据库仅用于发出初始
删除数据库
创建数据库
命令。所有数据都将恢复到存档中显示的数据库名称中

(请注意,
--create
在较新版本的中有进一步的、不相关的影响)

我的解决方案是删除
--create
参数:

dropdb ${PGDATABASE}
createdb ${PGDATABASE}
time pg_restore \
    -j4 \
    -d ${PGDATABASE} \
    --no-privileges \
    --no-owner \
    --clean \
    --if-exists \
    --exit-on-error \
    backup.pg_dump

如果使用
--create
,则需要连接到不同的数据库,例如
postgres
template1
这太棒了,谢谢@a_horse_,没有名字!解决了的!(TLDR;我放弃了
--create
选项)您的评论让我找到了
--create
的解释:-再次感谢!你想补充一个答案,还是我应该补充一个?我试着做类似的事情,并按照官方文件使用——创建,这给了我很多错误和担忧。通过删除--create并仅使用--clean,这似乎是正常的。
dropdb ${PGDATABASE}
createdb ${PGDATABASE}
time pg_restore \
    -j4 \
    -d ${PGDATABASE} \
    --no-privileges \
    --no-owner \
    --clean \
    --if-exists \
    --exit-on-error \
    backup.pg_dump