我有一个在 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上的建议。在全新安装 Postgres(其中包括 initdb)后,我使用以下命令。
pg_dumpall --clean | gzip | split --suffix-length=4 --numeric-suffixes --additional-suffix=.split.gz --bytes 1G - postgres.pg_dumpall.
Run Code Online (Sandbox Code Playgroud)
这会产生一系列如下文件:
[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]$
Run Code Online (Sandbox Code Playgroud)
为了恢复,我想我可以使用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 ~]$
Run Code Online (Sandbox Code Playgroud)
如果我删除 ,该命令将完成--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
超级用户帐户的行。
cat postgres.pg_dumpall.*.split.gz | gunzip | sed '/^DROP ROLE.*postgres/d;/^CREATE ROLE.*postgres/d' | psql --set ON_ERROR_STOP=on postgres
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5182 次 |
最近记录: |