七叶笔记 » 数据库 » PostgreSQL时间线(timeline)和History File的用法

PostgreSQL时间线(timeline)和History File的用法

当一个wal日志被写满后,便会创建新的wal日志000000010000000000000002,以此类推。

该文件中前8位,即:00000001表示的便是数据库的时间线。

从控制文件中也可以看到:

每当我们进行基于时间点的还原后,时间线便会加1,并创建一个名为NewTimelineID.history的新文件。这个文件是干什么用的我们后面会介绍。

recovery_target_timeline是一个参数,它可以帮助我们将集群带入历史记录中的任何时间线,只要有效的基本备份和所有存档日志都到位。

我们来看看下面的例子:

首先,重新初始化一个新的数据库集群。

然后创建一张表并插入数据。

刚刚插入的数据便记录在000000010000000000000001的wal日志中。

当wal日志写到000000010000000000000005时,进行一次完整的备份,接着再产生一些新的wal日志。

可以看到,现在最新的wal日志是000000010000000000000008

接着插入一条新的数据。

然后再产生几个wal日志,现在的情况如下:

如下图所示:

此时,在我插入第二条数据前,我想要把数据还原到000000010000000000000007这个点。

因此我在postgresql.conf文件中将恢复目标lsn设置为“ 0/07000060”。

接着进行还原,当我们还原之后,数据库切换到了新的时间线。

除此之外还有哪些改变呢?

恢复结束是指数据库打开进行写入的点。

创建了新的时间线的 history file文件,如00000002.history。

前一个时间线上的部分WAL文件已被新时间线的ID复制。

检查点记录写在新的时间线上。

日志中会记录下列信息:

此时,PostgreSQL已在wal日志7处分支到新的时间线,并开始创建时间线ID为2的新wal日志。我们可以下wal日志目录下看到00000002.history文件。

该文件是可读文件,内容大致为:

接下来,我向wal日志00000002000000000000000A (0/A000060)中插入新的数据。

以及另一个wal日志00000002000000000000000D(0/D000000)中插入另一条数据。

这个时候,我在00000002000000000000000D的wal日志中执行了错误的操作,想要回退到时间线2的00000002000000000000000C处,那么我要如何操作呢,如果像前面一样只指定lsn那么怎么保证不会回退到时间线1中呢?

这个时候我们便可以通过指定recovery_target_timeline来实现。

在postgresql.conf文件中添加:

接着,启动数据库,可以看到日志中:

然后查询该表验证:

此时可以看到新建了00000003.history文件,该文件内容如下:

我们不难发现:

history file这个文件中记录的就是这个时间线是从哪个WAL位置开始生成的。

补充:PostgreSQL promote过程 和 一主多备 时间线 无缝对接 详解

PostgreSQL的physical standby数据库的promote过程,数据库会在pg_xlog目录产生3个文件。

例如将备库1 promote,它将在pg_xlog目录产生如下文件:

例如备库1当前已接收到的XLOG位置是 00000001000000000000002D 文件中的某个位置 0/2D15D7D0,现在promote它 。

将会在pg_xlog目录中产生3个文件:

假设还有一个备库叫备库2,备库2如何能顺利的对接到已激活的备库1呢?

有个前提条件

备库2在TL1这条时间线上,还没有接收到00000001000000000000002D 这个文件。

把00000002.history拷贝到备库2的pg_xlog。

备库2会在应用完00000001000000000000002C后请求下一个时间线的 00000002000000000000002D 文件。

这样就能完美对接。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持七叶笔记。如有错误或未考虑完全的地方,望不吝赐教。

相关文章