AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 857339
Accepted
Stefan Lasiewski
Stefan Lasiewski
Asked: 2017-06-23 10:38:57 +0800 CST2017-06-23 10:38:57 +0800 CST 2017-06-23 10:38:57 +0800 CST

使用 pg_dumpall、split & gzip & --set ON_ERROR_STOP=on 备份和恢复 Postgres

  • 772

我有一个在 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,但我不清楚备份存档是否有效。

backup
  • 1 1 个回答
  • 3989 Views

1 个回答

  • Voted
  1. Best Answer
    DerfK
    2017-06-23T10:52:44+08:002017-06-23T10:52:44+08:00

    添加命令以删除每个数据库然后重新创建它们的--clean选项。pg_dumpall如果数据库不存在,则该DROP DATABASE foo命令将失败并出现错误,这将在ON_ERROR_STOP启用时停止您的脚本。

    使用--clean --if-existsinpg_dumpall生成在删除数据库之前首先检查数据库是否存在的命令。如果数据库不存在,这些命令将产生通知而不是错误。

    要删除导致问题的其他命令,您可以使用sedaftergunzip从脚本中删除该命令。您应该在删除它之前了解该命令正在做什么(在这种情况下尝试删除超级用户)。多个 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
    
    • 5

相关问题

  • 总大小(磁盘)与总大小(媒体)

  • 社区对备份解决方案的意见

  • 无法读取不同 LTO-3 驱动器上的 LTO-3 磁带

  • 使用 TSM 备份时跳过硬链接

  • 使用 rsync 维护名称更改的目录的副本

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve