Postgresql数据库备份理想的做法

时间:2018-01-10 12:38:03

标签: postgresql pg-dump

•使用pg_dump进行PostgreSQL逻辑备份的理想做法是什么?

•从备用/从属节点进行备份是否理想?如果复制滞后小于200ms

•从备用/从属节点进行备份是否理想,是否需要更改任何特定配置?

•哪种方法是备份逻辑备份或物理备份的好方法? DB经常更新的地方。作为灾难​​恢复的备份,哪种方法是更快更好的备份和灾难恢复(恢复)。

updated
我们当前的数据库大小为5GB,复制处于hot standby模式。
我们在从属节点上运行备份脚本,但它每30分钟从主节点进行一次远程备份。
我创建这个问题的原因是要了解备份何时运行一些COPY语句需要6分钟才能完成,即使它不会影响DB上的其他事务,如果语句占用更多,是否还会出现其他问题时间。

1 个答案:

答案 0 :(得分:1)

我想到了你写的内容,这里有一些想法:

  1. 如果您需要的备份在某个时间点确实是一致的,那么您必须使用pg_basebackup或pg_barman(内部使用pg_basebackup) - 解释在下面的1.链接中。最新的pg_basebackup 10流式传输WAL日志,因此您还可以备份备份期间完成的所有更改。当然,此备份仅占用整个PG实例。另一方面,它不会锁定任何表。如果从远程实例执行此操作,那么它只会导致PG实例上的CPU负载很小,并且磁盘IO没有某些文本建议的那么大。请参阅有关我的经历的链接4。恢复非常简单 - 见链接5.
  2. 如果您使用pg_dump,您必须明白您无法保证您的备份与时间点保持一致 - 再次参见链接1.可以使用数据库的快照(参见链接2和3)但即便如此,你也不能指望100%的一致性。我们仅在我们的分析数据库中使用pg_dump,该数据库每天仅加载1x(昨天来自生产数据库的分区)。您可以使用并行选项加速它(仅适用于目录备份格式)。但缺点是PG实例的负载要高得多 - CPU使用率更高,磁盘IO更高。即使您远程运行pg_dump - 在这种情况下,您只保存磁盘IO以保存备份文件。另外,pg_dump需要对表进行读锁定,以便它可以与新插入或复制(在复制时采用)进行匹配。但是当你的数据库达到数百GB时,即使是并行转储也需要几个小时,在那一刻你还是需要切换到pg_basebackup。
  3. pg_barman是pg_basebackup的“舒适版本”+它允许您防止数据丢失,即使您的PG实例崩溃非常严重。将其设置为工作需要更多更改,但绝对值得。你必须设置WAL日志存档(参见链接6),如果PG是<10,你将不得不设置“max_wal_senders”和“max_replication_slots”(无论如何你需要进行复制) - 一切都在pg-barman手册中虽然描述并不是很好。 pg_barman甚至会在备份之间流式传输和存储WAL记录,这样你就可以确保在崩溃非常严重时数据丢失几乎没有。但是让它工作可能需要花费很多时间,因为描述并不是很好。 pg-barman使用其命令进行备份和恢复。
  4. 您的数据库大5GB,因此任何备份方法都会很快。但你必须决定是否需要及时恢复和几乎没有数据丢失 - 所以如果你将投入时间来设置pg-barman。

    链接:

    1. PostgreSQL, Backups and everything you need to know
    2. Review for Paper: 14-Serializable Snapshot Isolation in PostgreSQL - 关于快照
    3. Parallel dumping of databases - 示例如何使用快照
    4. pg_basebackup experiencies
    5. pg_basebackup - restore tar backup
    6. Archiving WAL logs using script