47

我尝试过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
- 要求是我可以进行备份并且应该能够导入任何机器并且它应该可以正常工作。

4

1 回答 1

82

通常的流程是:

  • pg_dumpall --globals-only获取用户/角色/等
  • pg_dump -Fc为每个数据库获得一个适合与pg_restore.

是的,这种很烂。我真的很想教pg_dumppg_dumpall输出嵌入到-Fc转储中,但不幸的是现在它不知道怎么做,所以你必须自己做。

在 PostgreSQL 11 之前,这种方法还有一个令人讨厌的警告:既不pg_dump,也不pg_dumpall在模式下将用户访问s--globals-only转储到s 上。因此,您几乎必须从目录中提取它们或过滤. 这在 PostgreSQL 11 中已修复;请参阅发行说明GRANTDATABASEpg_dumpall

使 pg_dump 转储数据库的属性,而不仅仅是其内容 (Haribabu Kommi)

以前,数据库本身的属性,例如数据库级别GRANT/REVOKE权限和ALTER DATABASE SET变量设置,仅由 .dump 转储pg_dumpall。现在pg_dump --createpg_restore --create除了数据库中的对象之外,还将恢复这些数据库属性。pg_dumpall -g现在只转储与角色和表空间相关的属性。pg_dumpall的完整输出(没有 -g)没有改变。


您还应该了解物理备份 - pg_basebackup、PgBarman 和 WAL 归档、PITR 等。这些提供了更“细粒度”的恢复,直至分钟或单个事务。缺点是占用空间大,只能恢复到同平台的同一个PostgreSQL版本,并且备份所有数据库中的所有表,无法排除任何东西。

于 2013-05-18T01:29:34.233 回答