10.4 时间点恢复与时间线历史文件

时间线历史文件在第二次及后续PITR过程中起着重要作用。通过尝试第二次恢复,我们将探索如何使用它。

同样,假设您在12:15:00又犯了一个错误,错误发生在时间线ID为2的数据库集簇上。在这种情况下为了恢复数据库集簇,你需要创建一个如下所示的recovery.conf文件:

restore_command = 'cp /mnt/server/archivedir/%f %p'
recovery_target_time = "2018-7-16 12:15:00 GMT"
recovery_target_timeline = 2

参数recovery_target_time被设置为您犯下新错误的时间,而recovery_target_timeline被设置为2,以便沿着这条时间线恢复。

重启PostgreSQL服务器并进入PITR模式,数据库会沿着时间线标识2进行恢复。如图10.5所示。

图10.5 沿着时间线2将数据库恢复至12:15的状态图10.5 沿着时间线2将数据库恢复至12:15的状态

  1. PostgreSQL从backup_label文件中读取CHECKPOINT LOCATION的值。
  2. recovery.conf中读取一些参数值;在此示例中为restore_commandrecovery_target_timerecovery_target_timeline
  3. PostgreSQL读取时间线历史文件00000002.history,该文件对应参数recovery_target_timeline的值。
  4. PostgreSQL通过以下步骤重放WAL数据:
    1. 对于从重做点到LSN 0/A000198(该值写在00000002.history文件中)之间的WAL数据,PostgreSQL会(从合适的归档日志中)读取并重放TimelineID=1的WAL数据。
    2. 对于从LSN 0/A000198,到时间戳2018-7-9 12:15:00之间的WAL数据,PostgreSQL会(从合适的归档日志中)读取并重放TimelineID=2的WAL数据。
  5. 当恢复过程完成时,当前的时间线标识将增加到3,并在pg_xlog子目录(10及后续版本为pg_wal子目录)和归档目录中创建名为00000003.history的新时间线历史文件。
    postgres> cat /home/postgres/archivelogs/00000003.history
    1         0/A000198     before 2018-7-9 12:05:00.861324+00
    2         0/B000078     before 2018-7-9 12:15:00.927133+00
    

当你进行过超过一次的PITR时,应明确设置时间线标识,以便使用合适的时间线历史文件。因此,时间线历史文件不仅仅是数据库集簇的历史日志,还是PITR过程的参考恢复指令。

下一节:在流复制中,有三种进程协同工作。首先,主库上的walsender(WAL发送器)进程将WAL数据发送到备库;同时,备库上的walreceiver(WAL接收器)在接收这些数据,而备库上的startup进程可以重放这些数据。 其中walsender和walreceiver 之间使用单条TCP连接进行通信。