EDB博客

PostgreSQL备份恢复

四月

PostgreSQL备份恢复

备份通常是根据我们认为最了解的人的建议进行的,我们不会尝试了解导致这些建议的情况以及它们与我们可能面对的情况有什么不同,我们需要确保我们列出讨论可能需要从中恢复的情况,然后讨论可用的解决方案每个环境都有其自身的挑战,即使我们在同一组织中有多个数据库集群,对于这些数据库的备份要求也可能会有所不同,因此计划成为备份和恢复的关键。复苏

从数据库的预写日志WAL延迟副本

为什么我们需要面对我们可能会面临的引用

在这种情况下,我的同事不小心掉了一张桌子。我们有每月备份策略,并且有几天前的备份。但是,在我的同事错误之后,我立即进行了数据文件夹的备份,并且我也拥有所有WAL文件自从他放下时间以来,您可以帮忙恢复桌子吗

让我们在这里暂停一下以盘点库存,了解我们要恢复的内容我们有两个备份,即最新的备份和一天前的备份以及自删除表以来的所有WAL文件WAL文件是预写日志,这意味着我们可以从完成备份的位置继续前进在上述情况下,最新的备份是在问题发生后进行的,因此,在当前的情况下,我们必须接受该表已消失,因为该表仅是该时间点的备份尽管损失了一个月的数据,但已有一个月的备份可能是恢复数据的最佳方法。

这些对话中经常提出的另一个问题我们有多个从属,所以我仍然需要计划并进行备份虽然可以从硬件故障中恢复是一件好事,但是从人为错误中恢复的成本可能要高得多,如上例所示。

回到示例的开头,我们从我的同事开始删除了该表,并将该表立即复制到了我的所有从属中。相信我,您将发现它是您见过的最快的事务,无论您是在云上还是在云上在本地以及您拥有的任何数量的从属服务器都不足以使您免于这次灾难或任何其他人为错误,除非集群中的备用服务器延迟

通过使用延迟副本,可以通过使用碎玻璃的postgresql conf文件中的recovery min apply delay参数为紧急情况制定某种保险计划,以备不时之需。

恢复最小值应用延迟h

该值可以配置为小时,分钟或天,如文档中所示这里

PostgreSQL配置WAL预写日志

了解幕后情况

PostgreSQL在事务日志和流程体系结构的实现方面是一个非常独特的数据库。WAL Ahead Write ahead日志是PostgreSQL生态系统中最重要的部分。文件被写入pg xlog pg wal目录所做的每次更改都首先写入WAL,因此名称和WAL被认为是事务日志的同义词。归档模式archive命令需要两个最低设置,以确保每个WAL都被写入并检查是否完成,这是恢复过程的基础。这两个参数都可以在postgresql conf存档模式只有三个值:Off On或Always on; On或Always处于on值时并没有太大区别;它仅在服务器启动并运行时创建WAL存档;而当服务器始终保持on值时,它将继续生成归档文件,即使它们正在被还原归档命令也是用于归档WAL文件的shell命令。 PostgreSQL文档中的下面的文件

存档命令测试f mnt服务器archivedir f cp p mnt服务器archivedir f

在此,字符串中的p将自动替换为要存档的文件的路径名,而任何f将仅替换为文件名

现在让我们了解从备份中恢复时幕后的情况当PostgreSQL数据库启动时,它从一致状态开始,即在停止或进行数据库备份时检查点已完成的状态,然后对其进行检查WAL文件并开始阅读它们,直到全部完成为止这只是关于它在日志文件中的显示方式的一个想法

UTC LOG开始归档文件恢复UTC LOG从归档文件UTC LOG恢复日志文件重做开始于UTC LOG在cp处达到一致的恢复状态无法统计var lib postgresql备份没有这样的文件或目录UTC LOG重做在UTC LOG从归档文件UTC LOG还原日志文件存档恢复完成

尝试从备份中恢复时,我们使用recovery conf引导主服务器进入一致状态。在以下版本中,参数在recovery conf文件中设置,但是前进后该参数将在PostgreSQL conf中可用。服务器使用恢复目标时间了解它需要恢复的点,因此,如上文所述,将其设置为最新时,它将读取所有WAL文件

PostgreSQL的时间点恢复PITR

可以用于时间点恢复PITR的上述方法的另一次迭代是将参数恢复目标时间设置为我们认为问题发生之前的时间。如果我们拥有所有WAL档案,请以本文开头的示例为例自从基础备份以来,我们可以继续进行操作并将时间设置为删除表之前的已知时间,并且我们可以恢复表中的大多数数据

现在值得一提的是,我们了解WAL文件是从任何情况下恢复的基础,它始终有助于将pg xlog pg wal文件夹与所有WAL文件一起保留,并且不手动删除任何WAL文件来恢复磁盘空间服务器确保定期清除所有不需要的WAL文件

备份和有助于pLan的功能

现在归结为如何以及可以使用哪种备份,以及它们可以在哪些方面为我们提供帮助。PostgreSQL的选项如下

逻辑备份
pg转储
卸掉插头

逻辑转储只不过是数据库及其对象的SQL转储

物理备份
文件系统快照
pg基本备份
手动基础备份

备份时间将取决于进行备份的方法和数据库大小,这也将导致您需要考虑保留空间的需求,如果要进行物理备份,则与逻辑备份相比,空间需求可能要高得多,但是需要进行计划基于RPO恢复点目标和RTO恢复时间目标的备份策略让我们看看一些恢复方案从表中恢复以完成集群和恢复选项

让我们看一下单个恢复对象,了解我们可以使用的最快的备份方法

  1. 恢复单个表恢复表的最快方法是使用pg dump或pg dumpall创建的SQL dump,因为它是纯文本文件,也可以从pg dump Fc创建的自定义格式中提取,所以您可以分两步搜索和恢复表定义和表的数据,这使您可以灵活地继续搜索某些记录并将其还原
  2. 恢复单个数据库再次忽略了当前的大小因素,最快的方法仍然是pg dump和pg dumpall

    最好的部分是,由于还原涉及在后端运行COPY命令的单个SQL文件,因此可以应用查询调整技术以最大化性能。可以在测试环境中对其进行测试和记录,以达到最佳配置

  3. 恢复整个集群集群可能由多个数据库以及多个扩展组成,因此将所有内容还原到尽可能近的状态变得非常重要,这里最好的方法是使用文件系统级备份或pg basebackup使用快照。这确保了您不会必须做任何手动工作,并且只需要在更正权限后指向数据目录,就可以启动集群

管理PostgreSQL备份恢复

很难说一个人应该保留所有类型的备份以便能够从上述所有方案中恢复,但是我们确实了解到管理备份并将其保留为所有格式不仅耗时而且还需要硬件,想象一下我问您进行TB数据库的pg转储,我确信反应是对的。因此,这里有一些基于数据库或群集大小的建议,以便在大多数情况下计划最佳恢复

  1. DB大小小于Gb,因为这将需要更少的空间和时间,因此建议您同时进行物理和逻辑两种备份。这样做将使您具有一定的独立性,以便无论情况如何均可快速恢复
  2. DB大小介于Gb和Gb之间建议使用两种备份,但是如果您必须在两种备份之间进行选择,则建议使用物理备份它为您提供了一些灵活性,可以花一些时间和精力来恢复备份和提取从该级别的故障中恢复的任何表或数据库
  3. 大于Gb的数据库大小这是使用pg dump的挑战,物理备份最有可能是最佳的执行途径如上文所述,它可以通过进行一些尽职调查来帮助恢复单个对象和数据库。

PostgreSQL数据库备份的频率

是时候列出您的意见,以制定最佳策略

在整个过程中,最后但并非最不重要的考虑因素是备份的频率。这是通用建议最终达到的目的。为了对此发表任何评论,都需要了解其环境的机制,交易的频率,汇率数据库大小变化对应用程序的重要性及其在可用性与数据丢失方面的风险承受能力的影响您需要仔细研究这些因素,然后对备份进行一些测试,这不仅可以帮助您验证可恢复性,而且可以了解恢复所花费的时间即使您每月都有一次备份并且所有WAL文件的读取频率都介于读取所有这些WAL文件和重播事务之间的时间之间,请记住即使您需要忍受的时间也比恢复备份要花更长的时间并运行

因此,回到我开始的地方,请专家提供建议,但请确保您在环境中测试这些建议,并制定计划以适合所需的策略和结果,以便在需要时准备正确的备份和方法。

大家注意在能够还原PostgreSQL并读取数据之前,没有工具可以验证所备份的PostgreSQL的备份是否有效。因此,请确保在备份策略中不仅有进行备份的时间表,还需要有一个备份窗口。恢复并测试备份

加入Postgres Pulse Live

一如既往,我们经常看到客户面对这个例子,这始终是一次独特的讨论,以帮助理解对于当前问题的最佳解决方案以及如何着手评估其现有战略的指导。不同的需求自己有问题或疑问

4月1日星期一加入我们,参加我们的下一次Pulse Live会议我们将继续就备份失败的成功和策略进行对话,并鼓励您在对话中提出任何疑问

您可以通过以下电子邮件发送问题postgrespulse enterprisedb comPostgresPulse在Twitter上或活动期间直播

对以前的录音博客或与Postgres Pulse相关的任何东西感兴趣,我们使您可以轻松地在一个地方找到所有内容这里

艾米·夏尔马的图片

Amit Sharma是EDB技术支持高级经理,在支持和服务行业拥有多年​​经验,Amit了解如何克服挑战并保持环境运行,以及如何帮助DBA做到这一点