pg_dump和pg_dumpall有什么区别?在数据库备份中应该使用哪一个?

52

我尝试使用pg_dump命令,然后在另一台计算机上尝试导入SQL并填充数据库,但我看到了

CREATE TABLE
ERROR:  role "prod" does not exist
CREATE TABLE
ERROR:  role "prod" does not exist
CREATE TABLE
ERROR:  role "prod" does not exist
CREATE TABLE
ERROR:  role "prod" does not exist
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
WARNING:  no privileges could be revoked for "public"
REVOKE
ERROR:  role "postgres" does not exist
ERROR:  role "postgres" does not exist
WARNING:  no privileges were granted for "public"
GRANT
这意味着我的userrolesgrant信息不在pg_dump中。
另一方面,我们有pg_dumpall,我读了这个对话,但这并没有给我带来任何帮助?
问题: - 在数据库备份中我应该使用哪一个?pg_dump还是pg_dumpall? - 需求是我可以备份并能够在任何机器上导入备份,且应当正常工作。

1
我不知道你所说的“我读了对话,但这并没有帮助我”是什么意思。手册已经非常清楚地说明了每个工具的作用。如果您需要导出用户,则必须使用pg_dumpall。 - user330315
5
这个问题应该移动到http://dba.stackexchange.com/。 - Stephan
2个回答

85
通常的过程是:
  • 使用pg_dumpall --globals-only获取用户/角色等信息
  • 对于每个数据库,使用pg_dump -Fc来获取一个适合与pg_restore一起使用的压缩转储。

是的,这有点烦人。我真的很想教pg_dumppg_dumpall的输出嵌入到-Fc 转储中,但目前不幸的是它不知道如何做,所以你必须自己处理。

直到PostgreSQL 11之前,这种方法还有一个令人讨厌的问题:无论是pg_dump还是pg_dumpall--globals-only模式下都不会在DATABASE上转储用户访问授予权限。因此,你几乎必须从目录中提取它们或过滤一个pg_dumpall。这在PostgreSQL 11中得到了修复;请参见发行说明

使pg_dump转储数据库的属性,而不仅仅是其内容(Haribabu Kommi)。
以前,数据库本身的属性,例如数据库级别的GRANT/REVOKE权限和ALTER DATABASE SET变量设置,只有通过pg_dumpall进行转储。现在,pg_dump --create和pg_restore --create将还原这些数据库属性以及数据库中的对象。pg_dumpall -g现在仅转储与角色和表空间相关的属性。pg_dumpall的完整输出(不带-g)保持不变。
你还应该了解物理备份——pg_basebackup、PgBarman和WAL归档、PITR等。它们提供了更细粒度的恢复,可以恢复到分钟或个别事务级别。缺点是它们占用更多空间,只能在同一平台上将其还原到相同的PostgreSQL版本,并且备份所有数据库中的所有表格,无法排除任何内容。

如何恢复全局文件?当我尝试恢复它时,会出现一个错误:“输入文件似乎不是有效的归档文件(太短了?)”。 - Umagon
1
@Umagon 使用 psql -f globals.sql - Craig Ringer
@CraigRinger 那我们如何备份 DATABASE 上的 GRANT 呢? - Basil Musa
@BasilMusa pg_dump --globals-only => pg_dump --globals-only - Craig Ringer
@CraigRinger 您提到,pg_dump和pg_dumpall --globalsonly都不会在数据库上转储使用访问GRANT。因此我的问题是:“那么我们如何备份用户GRANT?” - Basil Musa
1
@BasilMusa 啊,抱歉。那个问题最近已经修复了,我会进行修改。在PostgreSQL 11中已经修复。 - Craig Ringer

0

两个命令pg_dumppg_dumpall几乎是一样的。区别在于(摘自man pg_dumpall):

  • pg_dumpall将集群中的所有数据库转储到一个脚本文件中。它通过调用每个数据库的pg_dump来实现此功能。
  • pg_dumpall还转储了对所有数据库都通用的全局对象,即数据库角色、表空间和配置参数的权限授予。而pg_dump不会保存这些对象。

因此,备份/恢复数据库的最简单方法(甚至在主要版本之间)是:

pg_dumpall -p 5432 | psql -d postgres -p 5433

你需要在新服务器上提供postgres作为默认数据库(使用-d标志),因为很可能你只有这个数据库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接