如何获得有效且完整的PostgreSQL数据库备份和测试


45

我希望我能就如何确保像使用MS SQL Server一样获得完整的Postgres备份获得明确的答案,然后照顾孤立的用户。

从我所读的文章中(可能是错误的),找到一个好的PostgreSQL博客一直是一项艰巨的挑战,因此请随时向我推荐一些博客,我需要弄清楚该应用程序的工作方式,以便我可以信任自己的备份和Slony复制。我有一个开发人员在选择s时通过customdirectorytarformat 从PgadminIII还原了我的备份,OID但他说其中两个没有加载,tar但只是目录,而不是数据。我现在真的很困惑。

  1. 我正在使用PGAdminIII,它具有pg_dumppg_dumpall选项。我想备份所有需要测试的东西,以便将该数据库还原到某个地方,并确认是的,我们需要的所有数据和备份都正确。最终我想写一个自动恢复脚本,但一次只写一天。

pg_dumpall显然有一个-globals应该备份所有内容的选项,但是的帮助pg_dumpall显示-g, --globals-only dump only global objects, no databases,而不是--globals选项。

我以为pg_dumpall至少会备份外键,但这似乎还是一个“选项”。根据文档,即使pg_dumpall我需要使用一个-o选项来备份外键,我也无法想象我何时不想备份外键,这作为默认选项会更有意义。

  1. 我将如何照顾孤立的用户并确认我拥有一切?我想将备份文件实际还原到另一台服务器上,并验证一切正常。如果有人对如何在PostgreSQL中进行真正的备份并还原提出任何建议,我将不胜感激。

我有一台PostgreSQL服务器,但是我仍然无法理解为什么OID默认情况下该应用程序不会备份s!好像有99.9%的时间需要。

更新1:

Postgres 文档中提到globals我正在寻找的选项似乎是此版本的默认选项,但仍需要该-o选项。如果有人可以验证或给我一个示例命令,将所有需要的一切还原到其他地方的单个数据库,我将不胜感激。

编辑:被网站要求通过编辑我的问题来显示此问题的独特性。这个问题引起了问题,并弄清了备份中的OID,全局变量和非全局变量之间的差异,以及测试了还原建议以确保备份良好,而不是仅仅备份。根据答案,我能够备份,找出全局变量/ oid,并使用cron作业每晚在Postgres上开始测试还原过程。谢谢您的帮助!


Answers:


58

您可以使用pg_dumpall转储整个PostgreSQL集群。这就是单个集群的所有数据库和所有全局变量。从服务器上的命令行,我将执行以下操作。(我的监听端口5433,而不是默认端口。)您可能需要--clean选项,也可能不需要。

$ pg_dumpall -U postgres -h localhost -p 5433 --clean --file=dump.sql

这包括全局变量-有关用户和组,表空间等的信息。

如果要备份单个数据库并将其移动到临时服务器,则将使用pg_dump转储该数据库,并使用其中一个转储全局变量

  • pg_dumpall --globals-only, 要么
  • pg_dumpall --roles-only (如果您只需要角色)

像这样。

$ pg_dump -U postgres -h localhost -p 5433 --clean --file=sandbox.sql sandbox
$ pg_dumpall -U postgres -h localhost -p 5433 --clean --globals-only --file=globals.sql

输出只是文本文件。

将这些文件移动到其他服务器后,请先加载全局变量,然后再加载数据库转储。

$ psql -U postgres -h localhost -p 5433 < globals.sql
$ psql -U postgres -h localhost -p 5433 < sandbox.sql

我以为pg_dumpall至少会备份外键,但是即使那样也似乎是一个“选项”。根据:http : //www.postgresql.org/docs/9.1/static/app-pg-dumpall.html即使使用pg_dumpall我也需要使用-o选项来备份外键

不,该引用表示“如果您的应用程序以某种方式(例如,在外键约束中)引用了OID列,请使用此选项。否则,不应使用此选项。” (添加了强调。)我认为您的应用程序不太可能引用OID列。您不需要使用此选项来“备份外键”。(在编辑器或文件查看器中读取转储文件。)


3
导入sandbox.sql的行中是否缺少数据库名称?psql -U postgres -h localhost -p 5433 sandbox < sandbox.sql
塞伯(SebK)2016年

可以看到pg_dumpall9.5版本NULL在使用时无法正确使用值COPY。我收到很多这样的错误:psql:/tmp/dumpall.sql:4133559: invalid command \N psql:/tmp/dumpall.sql:4133560: invalid command \.使用psql -f /tmp/dumpall.sql
piotrekkr于
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.