在阅读postgreSQL文档时:
在写入每个新记录时,WAL记录将附加到WAL日志中。插入位置由日志序列号(LSN)描述,该序列号是日志中的字节偏移量,随每个新记录单调增加。 LSN值作为数据类型pg_lsn返回。可以比较这些值以计算将它们分开的WAL数据量,以便将它们用于衡量复制和恢复的进度。
我们可以依靠这个序列号严格单调的事实吗?
>是否没有时间将该偏移量重置为先前位置(由于WAL存档或其他类型的操作)?答案 0 :(得分:1)
它严格是单调的,但是LSN
指向某个段文件中的物理偏移量。
是否没有时间偏移将其重置为先前位置(由于WAL存档或其他类型的操作)?
有一个时间点,但是在另一个段文件中。
这里仅供参考,是PG代码中的宏,该宏从LSN
(https://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)
答案 1 :(得分:1)
来自postgres documentation on wal internals(重点是我)
将WAL记录附加到WAL日志中,因为每个新记录都是 书面。插入位置由对数序列号描述 (LSN),它是日志中的字节偏移量,单调递增 每条新记录。 LSN值作为数据类型pg_lsn返回。 可以比较值 来计算WAL数据量 分开它们,所以它们用于衡量进度 复制和恢复。
WAL日志存储在data目录下的pg_wal目录中, 作为一组段文件,通常每个文件大小为16 MB(但 可以通过更改--wal-segsize initdb选项进行更改)。每 该段分为几页,通常每页8 kB(此大小可以 通过--with-wal-blocksize配置选项进行了更改)。日志记录 标头在access / xlogrecord.h中描述;记录内容为 取决于正在记录的事件的类型。段文件是 以越来越多的数字作为名称,从 000000010000000000000000。数字不会自动换行,但是要耗尽可用的数字库存会花费非常非常长的时间。