我有一个在 CentOS 7.3 上运行的 PostgreSQL 9.4 数据库。该数据库相当普通,通过https://yum.postgresql.org/安装。
我正在尝试备份此数据库,并在另一台主机上测试还原。如果我尝试使用 恢复--set ON_ERROR_STOP=on
,则恢复失败。为什么是这样?
我的备份过程基于https://www.postgresql.org/docs/9.4/static/backup-dump.html上的建议。在全新安装包含 initdb 的 Postgres 后,我使用以下命令。
pg_dumpall --clean | gzip | split --suffix-length=4 --numeric-suffixes --additional-suffix=.split.gz --bytes 1G - postgres.pg_dumpall.
这会产生一系列文件,如下所示:
[postgres@db1 backups]$ ls
postgres.pg_dumpall.0000.split.gz
postgres.pg_dumpall.0001.split.gz
...
postgres.pg_dumpall.0040.split.gz
[postgres@db1 backups]$
要恢复,我想我可以使用cat
,gunzip
和psql --set ON_ERROR_STOP=on
. 然而这不起作用:
[postgres@db2 ~]$ cat postgres.pg_dumpall.*.split.gz | gunzip | psql --set ON_ERROR_STOP=on postgres
SET
SET
SET
ERROR: database "foo" does not exist
[postgres@db2 ~]$
如果我删除该命令将完成--set ON_ERROR_STOP=on
,但我不清楚备份存档是否有效。
添加命令以删除每个数据库然后重新创建它们的
--clean
选项。pg_dumpall
如果数据库不存在,则该DROP DATABASE foo
命令将失败并出现错误,这将在ON_ERROR_STOP
启用时停止您的脚本。使用
--clean --if-exists
inpg_dumpall
生成在删除数据库之前首先检查数据库是否存在的命令。如果数据库不存在,这些命令将产生通知而不是错误。要删除导致问题的其他命令,您可以使用
sed
aftergunzip
从脚本中删除该命令。您应该在删除它之前了解该命令正在做什么(在这种情况下尝试删除超级用户)。多个 sed 命令将;
在给sed
. 此命令应d
删除脚本将尝试删除并重新创建postgres
超级用户帐户的行。