PostgreSQL的点恢复(PITR)
金蝶云社区-刘映希
刘映希
0人赞赏了该文章 19次浏览 未经作者许可,禁止转载编辑于2023年08月21日 10:30:02

  PostgreSQL的点恢复(Point-In-Time Recovery,PITR)允许从基础备份和WAL(Write Ahead Logging)日志中恢复到任何特定的时间点或者特定事务。当发生如数据损坏、数据丢失或误操作时,这个功能可能非常有用。

PITR的实现原理

      PostgreSQL中的PITR基于预写日志(WAL)系统。每次对数据文件的更改都首先在WAL中记录,然后再写入实际的数据文件。这样,即使在系统崩溃或其他故障情况下,只要WAL文件没有损坏,就可以通过重放WAL日志来恢复数据库。

      当进行备份时,PostgreSQL会继续写入WAL文件。这些WAL文件可以保存并应用到基础备份上,将数据库带到备份和日志结束之间任何时间点的状态。

      假设有正在运行的PostgreSQL数据库,想要能够在任何时候恢复到特定的时间点。以下是关键操作步骤:

      1:需要在postgresql.conf文件中启用WAL归档,并指定一个归档目录将所有的WAL日志都被复制到指定的归档目录。

      wal_level = replica   -- 设置wal_level参数为replica或更高级别,以允许WAL日志被用于复制和恢复操作

      archive_mode = on   -- 启用WAL归档

      archive_command = 'cp %p /path/to/archive/%f'    -- 设置合适的归档命令。%p:表示原始WAL文件的路径和文件名。%f:表示要存档的WAL文件的文件名。每当有一个新的WAL文件需要存档时,就使用cp命令将这个WAL文件从它的原始位置(PG_DATA/pg_wal)复制到指定的归档目录,并保持原来的文件名

      2:创建一个基础备份,使用pg_basebackup命令来完成。

      -P:创建备份时显示进度信息。

      -Fp:设置备份格式为纯文本格式,是pg_basebackup默认的备份格式,也可指定其它格式。

      -Xs:设置WAL模式为stream,表示WAL文件将在备份过程中通过一个单独的连接直接流式传输到备份目录。

      -R:在备份目录中创建一个recovery.conf文件,这个文件可以用于点恢复(PITR)。

      pg_basebackup -h localhost -D /path/to/basebackup -U username -P -Fp -Xs -R

      3:停止数据库服务器,并将基础备份复制到数据目录:

      在需要进行PITR时,首先恢复基础备份

      cp -R /path/to/basebackup/* /path/to/data/directory/

      4:编辑recovery.conf文件,指定要恢复到的时间点:

      restore_command = 'cp /path/to/archive/%f %p'

      recovery_target_time = '2023-05-25 14:45:00'

      5:启动数据库服务器。PostgreSQL将从基础备份开始恢复,然后应用WAL日志,直到达到指定的时间点。

      pg_ctl start

      注意:在进行任何备份或恢复操作之前,确保你已经正确配置了PostgreSQL。如果可能,应在非生产环境中先进行测试。

PITR的优点

      1.    灵活的恢复PITR可以恢复到任何特定的时间点,这为处理各种数据问题提供了极大的灵活性。

      2.    减少数据丢失由于PITR可以恢复到任何时间点,因此可以最大限度地减少数据丢失。

      3.    事务一致性通过重放WAL日志,PITR可以确保恢复后的数据库状态与原始状态在事务层面上保持一致。

PITR的缺点

      1.    存储需求连续归档WAL文件可能会消耗大量的存储空间,特别是在高负载的数据库中。

      2.    恢复时间如果需要恢复的时间点距离最近的基础备份很远,那么重放WAL日志所需的时间可能会很长。

 


本文转载自:公共号金蝶云·天梯

作者:朱方方

原文链接:公共号金蝶云·天梯

图标赞 0
0人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0