我有一个在CentOS 7.3上运行的PostgreSQL 9.4数据库。 数据库是相当香草,并通过https://yum.postgresql.org/安装。
我试图备份这个数据库,并在另一台主机上testing一个恢复。 如果我尝试使用--set ON_ERROR_STOP=on进行恢复,恢复将失败。 为什么是这样?
我的备份程序基于https://www.postgresql.org/docs/9.4/static/backup-dump.html上的build议。 在使用全新的Postgres安装包括initdb之后,我使用下面的命令。
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 ,命令将会完成,但是我不清楚备份存档是否有效。
pg_dumpall的--clean选项添加命令来删除每个数据库,然后重新创build它们。 如果数据库不存在,那么DROP DATABASE foo命令将会失败并显示一个错误,这将导致启用ON_ERROR_STOP的脚本停止。
使用--clean --if-exists于pg_dumpall中生成的命令将在删除数据库之前首先检查数据库是否存在。 如果数据库不存在,这些命令将产生通知而不是错误。
要删除导致问题的其他命令,可以在gunzip之后使用sed从脚本中删除该命令。 在删除它之前,您应该了解命令正在执行的操作(在这种情况下试图删除超级用户)。 多个sed命令将被分隔; 在给sed的引用string内。 该命令应该select脚本将尝试放下的行并重新创buildpostgres超级用户帐户。
cat postgres.pg_dumpall.*.split.gz | gunzip | sed '/^DROP ROLE.*postgres/d;/^CREATE ROLE.*postgres/d' | psql --set ON_ERROR_STOP=on postgres