合 PG中的时间线Timeline
Tags: PG备份恢复PITR不完全恢复基于时间点的恢复Timeline时间线
时间线Timeline概述
为了区分因数据库恢复造成的不同时间段的wal日志而产生的时间记录称为时间线(timeline)。当归档文件恢复完成后,会创建一个新的时间线用来区别新生成的WAL记录。
每当我们在数据库中完成一个事务时,所做的操作都会记录到$PGDATA/pg_wal目录下的wal日志文件中。WAL文件名由时间线和日志序号组成。
wal日志文件一般都是下面这种格式:
1 | 000000010000000000000001 |
当一个wal日志被写满后,便会创建新的wal日志000000010000000000000002,以此类推。
该文件中前8位,即:00000001表示的便是数据库的时间线。
1 2 3 4 5 6 7 8 9 10 | [postgres@dbaup archive]$ ll total 4 lrwxrwxrwx. 1 postgres postgres 69 Feb 17 22:51 000000010000000000000001 lrwxrwxrwx. 1 postgres postgres 69 Feb 17 22:51 000000010000000000000002 lrwxrwxrwx. 1 postgres postgres 69 Feb 17 22:51 000000010000000000000003 [postgres@dbaup archive]$ [postgres@dbaup archive]$ pg_controldata | grep TimeLineID Latest checkpoint's TimeLineID: 2 Latest checkpoint's PrevTimeLineID: 2 [postgres@dbaup archive]$ |
时间线ID号是WAL文件名组成之一,因此一个新的时间线不会覆盖由以前的时间线生成的WAL。
每个时间线类似一个分支,在当前时间线的操作不会对其他时间线WAL造成影响。
时间线就是为了让数据库管理员在数据库出现未知灾难时候依据基础备份和wal日志(包含已经归档的)恢复到宕机前的任意一个状态。
新生成时间线的情况(需要执行select pg_wal_replay_resume();
):
- 当对数据库进行了基于时间点的还原(PITR)后,就会产生一次新的时间线
- 当备库切换成主库也会产生一次时间线。
PG中通过timeline机制能够方便地实现数据库恢复到任意时间点,这对我们数据库备份有重要的作用。我们可以在数据库的使用中合理地备份和归档我们的数据,一旦数据出现丢失或损坏,我们都能有条不紊的使用timeline机制恢复出来我们需要的数据。
参数recovery_target_timeline
recovery_target_timeline ( string
)
指定恢复到特定时间轴。默认设置是沿着执行基本备份时的当前时间线恢复。将此设置为 latest 将恢复到存档中找到的最新时间轴,这在备用服务器中很有用。
recovery_target_timeline这个参数可以帮助我们将集群带入历史记录中的任何时间线,只要有效的基本备份和所有存档日志都到位。
除此之外,您只需要在复杂的重新恢复情况下设置此参数,您需要返回到在时间点恢复后到达的状态。
在pg中,当我们进行了基于时间点的还原(PITR)后,数据库会启用新的时间线并继续进行操作。
但是,当我们进行基于时间点的还原后如果发现又出现错误,想要继续还原数据库该如何操作呢?如何还原到原先旧的时间线呢?
我们可以使用recovery_target_timeline参数来指定数据库还原到某一个时间线上。
在通过pg_basebackup进行备份的时候添加参数“-R”就可以在备中自动产生recovery.conf文件,在这里就可以指定recovery_target_timeline=’’和recovery_target_time=’’参数来进行精准恢复了,而这里的recovery_target_timeline参数可以直接填写时间线产生的“历史文件”名字用来指定恢复到哪一条时间线上去。