使用 PITR 恢复 PostgreSQL 数据

0 postgresql

我无法使用 PostgreSQL 网站文章 23.3.3 中提到的 PITR 步骤将数据库恢复到以前的时间。使用在线备份恢复 ( http://www.postgresql.org/docs/8.1/static/backup-online.html#RECOVERY-TARGET-XID )

以下是我遵循的步骤:

  1. 我对位于数据文件夹中的 postgresql.conf 文件进行了以下更改:

    wal_level = archive
    archive_mode = on   
    archive_command = 'copy "%p" "C:\\archivedir\\%f"'
    
    Run Code Online (Sandbox Code Playgroud)

    我在 C 盘上创建了一个名为“archivedir”的文件夹

  2. 我对 recovery.conf 文件进行了以下更改:

    recovery_target_time = '2014-02-05 11:45:00 CST'
    primary_conninfo = 'host=localhost port=5433 user=owner password=xxxxx'
    restore_command = 'copy "C:\\archivedir\\%f" "%p"'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 停止了 postgresql 的服务和已删除的文件夹内容 pg_xlog

  4. 重新启动服务
  5. Recovery.conf 改为 recovery.done
  6. 但是我无法将数据库恢复到以前的状态。

我通过删除表并尝试将数据库恢复到较早的状态进行了多次检查。有什么我想念的吗?

Cra*_*ger 7

首先,永远,永远pg_xlog永远,永远永远,永远,删除任何东西破坏你的数据库。现在,谈谈你对这一切的误解:

我通过删除表并尝试将数据库恢复到较早的状态进行了多次检查。有什么我想念的吗?

PITR 不是那样工作的。它不会将正在运行的数据库恢复到较旧的时间点。

它的工作原理是在需要恢复之前先设置它:

  • 设置 WAL 归档,以便将 WAL 记录到安全位置。

  • 您需要恢复之前,您需要进行基本备份。您可以pg_start_backup()为此使用和 rsync,但使用pg_basebackup(). 有关创建基本备份的详细信息,请参阅文档。您必须设置 WAL 存档执行此操作,以便存档包含从执行 basebackup 开始的所有 WAL。

  • 继续使用 WAL 归档运行,定期进行新的基本备份以减少您必须保留的旧 WAL 数量和您需要的恢复时间。像pgbarman这样的自动化工具可以帮助解决这个问题。

当您需要创建数据库状态的历史副本以从某些内容中恢复时,您:

  • 将基本备份复制到可写存储

  • 使用recovery.conf指定适合restore_command获取 WAL 的文件和recovery_target_time您想要重播的文件来设置副本。设置primary_conninfo没有意义,因为您不会将其用作暖或热备用流媒体副本。

  • 启动副本,并允许它重放 WAL,直到它报告恢复完成。

  • 连接到副本,然后执行任何您需要的操作来获取您希望从中恢复的数据。您可以用于pg_dump提取数据库或其中的一部分,用于COPY提取表的内容等。

如果您希望完全恢复数据库,您可以删除 datadir,将其替换为副本,然后按照上述步骤将副本重播到某个时间点。

不能做的是将现有数据库回滚到过去的某个时间点。WAL 重放只会及时进行。因此,您必须恢复旧的基本备份,然后允许它在您想要的时间点重放 WAL。