PostgreSQL中的时间点恢复(PITR)

时间点恢复(PITR)是一个强大的功能,在PostgreSQL中变得更加高效和用户友好。它使管理员能够将PostgreSQL数据库恢复到过去的特定时刻。这在管理大型系统的灾难恢复时尤其有用,因为这些系统通常具有大量的事务负载。

本博客将探讨PITR,并为您提供有关潜在陷阱及其解决方案的知识,以确保顺利和成功的实施。我们还将分享其主要优点,并详细介绍PostgreSQL的逐步实施过程。

关键组件

实施PITR涉及两个关键组件:

1. 基础备份

基础备份是数据库在特定时间点的快照。它包括恢复数据库到其原始状态所需的所有数据文件、配置文件和元数据。基础备份作为PITR的起点。

2. 预写日志(WAL)

WAL文件记录对数据库所做的每一个更改。这些日志保存了将数据库恢复到特定时间状态所需的更改。当您执行PITR时,您会按顺序重播WAL文件,以重建所需的数据库状态。

为什么使用PITR?

PITR在多种场景中都是有益的:

撤销意外更改

意外操作,例如没有 WHERE 子句的 DELETEDROP 语句,可能导致重大数据丢失。通过 PITR,您可以将数据库恢复到错误发生前的状态,从而保留关键数据。

从数据损坏中恢复

应用 漏洞、硬件故障或磁盘损坏可能导致数据不一致。PITR 允许您恢复一个干净的数据库快照,并仅重放有效的更改,最小化停机时间和数据丢失。

恢复用于测试或调试

开发人员经常需要复制生产数据库以进行调试或测试。PITR 使您能够在特定时间点创建数据库快照,从而进行受控实验而不影响实时数据。

灾难恢复

PITR 对于灾难恢复策略至关重要。在灾难性故障,例如自然灾害或网络攻击中,您可以快速将数据库恢复到最后一致的状态,以确保业务连续性。

高效利用资源

通过将定期基础备份与WAL文件结合,PITR最小化了频繁全备份的需求,从而节省存储空间并减少备份时间。PITR也是一种精确恢复方法,允许您恢复到特定秒数,并在事件期间最小化数据丢失的风险。它足够灵活,可以高效处理多样化的恢复场景,从单一事务回滚到完整数据库恢复。

PostgreSQL 17中PITR的新特性是什么?

PostgreSQL 17引入了几个针对PITR的增强功能,重点关注性能、可用性和兼容性:

故障转移槽同步

逻辑复制槽现在支持故障转移期间的同步。这确保了在故障转移后仍保留PITR所需的WAL,从而减少人工干预。

增强WAL压缩

更新了WAL压缩算法,以提高存储效率,减少归档WAL所需的空间。这对于具有高事务率的大规模系统特别有利。

更快的恢复速度

WAL重放过程中的优化导致恢复时间更快,特别是对于大型数据集。

与逻辑复制的兼容性改善

PITR现在与逻辑复制设置集成得更好,使得恢复利用物理和逻辑复制的集群变得更容易。

细粒度WAL归档控制

PostgreSQL 17提供了更多的WAL归档控制,允许您微调保留策略以匹配恢复要求。

在PostgreSQL中执行PITR的详细步骤

按照以下步骤设置和执行PITR。在使用PITR之前,您需要:

  • WAL归档:启用并配置WAL归档。
  • 基础备份:使用pg_basebackuppgBackRest进行完整的基础备份。
  • 安全存储:确保备份和WAL文件安全存储,最好是异地存储。

1. 配置WAL归档

WAL归档对PITR至关重要,因为它存储备份之间的增量变化。要配置WAL归档,请更新postgresql.conf文件,设置:

Shell

 

然后,在设置配置参数后,重启PostgreSQL服务器:

Shell

 

使用以下命令检查WAL归档的状态:

SQL

 

检查pg_stat_archiver视图或PostgreSQL日志中的任何错误。

2. 执行基础备份

执行基础备份,以作为PITR的起始点;使用pg_basebackup,命令形式为:

Shell

 

这将创建一个一致的数据库快照,并确保WAL文件被归档以供恢复。

3. 验证备份完整性

使用pg_verifybackup验证备份的完整性:

Shell

 

4. 模拟故障

出于演示目的,您可以模拟故障。例如,意外删除数据:

Shell

 

5. 恢复基础备份

在恢复基础备份之前,停止PostgreSQL服务器:

Shell

 

然后,使用以下命令更改现有数据目录的名称:

Shell

 

接下来,用基础备份替换数据目录:

Shell

 

更新数据目录的权限:

Shell

 

6. 配置恢复

要启用恢复模式,首先需要在PostgreSQL数据目录中创建一个recovery.signal文件:

Shell

 

然后,更新postgresql.conf,添加以下参数:

Shell

 

7. 在恢复模式下启动PostgreSQL

使用以下命令重新启动PostgreSQL服务器:

Shell

 

监视日志以查看恢复进度:

Shell

 

PostgreSQL在恢复完成后会自动退出恢复模式并变为可操作状态。

8. 验证恢复

恢复后,验证数据库状态:

SQL

 

解决潜在问题

缺失或损坏的WAL文件

问题

恢复所需的WAL文件缺失或损坏。

解决方案

  • 定期使用pg_verifybackup等工具验证备份和WAL归档。
  • 为WAL归档使用冗余存储。

不正确的恢复目标

问题

恢复在意外状态下停止。

解决方案

  • 仔细检查recovery_target_timerecovery_target_lsnrecovery_target_name
  • 使用pg_waldump检查WAL文件中的目标事件。

恢复期间的性能瓶颈

问题

由于WAL文件过大,恢复耗时过长。

解决方案

  • 通过增加maintenance_work_memmax_parallel_workers来优化恢复性能。
  • 使用WAL压缩来减小文件大小。

时钟偏差问题

问题

由于时钟差异,恢复时间戳需要对齐。

解决方案

使用NTP等工具同步服务器时钟。

配置错误的WAL归档

问题

不正确的 archive_command 导致 WAL 归档失败。

解决方案

  • 手动测试 archive_commandcp /path/to/test_wal /path/to/wal_archive/
  • 确保归档目录具有足够的权限。

PITR 最佳实践

  1. 自动化备份:使用 工具 如 pgBackRest 或 Barman 进行定期备份和 WAL 归档。
  2. 监控 WAL 归档:定期检查 pg_stat_archiver 以发现问题。
  3. 验证备份:始终使用 pg_verifybackup 验证备份完整性。
  4. 测试恢复程序:定期模拟恢复场景以确保准备就绪。
  5. 保护 WAL 归档:对于 WAL 归档,使用安全的冗余存储,例如云服务或 RAID 配置的磁盘。

结论

时间点恢复 (PITR) 对于维护数据库可靠性和减轻事件发生时的数据丢失至关重要。pgEdge 和 PostgreSQL 17 的增强功能使得 PITR 更快、更高效且更易于管理,特别适用于大规模或高度可用的系统。

遵循本指南的步骤和最佳实践将帮助您在 PostgreSQL 环境中有效实施和管理 PITR。定期测试和监控对于确保在您最需要时恢复过程可用至关重要。

Source:
https://dzone.com/articles/point-in-time-recovery-pitr-in-postgresql