3

在阅读 postgreSQL 文档时:

WAL 记录会在写入每个新记录时附加到 WAL 日志中。插入位置由日志序列号 (LSN) 描述,该序列号是日志中的字节偏移量,随着每个新记录单调增加。LSN 值作为数据类型 pg_lsn 返回。可以比较值来计算将它们分开的 WAL 数据量,因此它们用于衡量复制和恢复的进度。

我们可以相信这个序列号是严格单调的吗?没有时间点将此偏移量重置为先前的位置(由于 WAL 存档或其他类型的操作)吗?

4

2 回答 2

5

它是严格单调的,但LSN指向某个段文件中的物理偏移量。

没有时间点将此偏移量重置为先前的位置(由于 WAL 存档或其他类型的操作)吗?

有这样一个时间点,但在另一个段文件中。

这里仅供参考,是 PG 代码中的一个宏,它从LSNhttps://github.com/postgres/postgres/blob/master/src/include/access/xlog_internal.h)中提取段号:

/*
 * Compute a segment number from an XLogRecPtr.
 ........
 */
#define XLByteToSeg(xlrp, logSegNo, wal_segsz_bytes) \
    logSegNo = (xlrp) / (wal_segsz_bytes)
于 2018-12-05T11:04:00.443 回答
2

来自关于 wal internals的 postgres文档(重点是我的)

WAL 记录会在写入每个新记录时附加到 WAL 日志中。插入位置由日志序列号 (LSN) 描述,该序列号是日志中的字节偏移量,随着每个新记录单调增加。LSN 值作为数据类型 pg_lsn 返回。可以比较值来计算将它们分开的 WAL 数据量,因此它们用于衡量复制和恢复的进度。

WAL 日志存储在数据目录下的目录 pg_wal 中,作为一组段文件,通常每个 16 MB 大小(但可以通过更改 --wal-segsize initdb 选项来更改大小)。每个段被分成页面,通常每个 8 kB(这个大小可以通过 --with-wal-blocksize 配置选项进行更改)。日志记录头在 access/xlogrecord.h 中描述;记录内容取决于正在记录的事件类型。段文件被赋予不断增加的数字作为名称,从 000000010000000000000000 开始。这些数字不会换行,但是用完可用的数字库存需要非常非常长的时间

于 2019-06-02T13:23:17.130 回答