日志序列号在postgres中真的单调吗?

时间:2018-12-05 09:28:34

标签: postgresql wal

在阅读postgreSQL文档时:

  

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

我们可以依靠这个序列号严格单调的事实吗?

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

2 个答案:

答案 0 :(得分:1)

它严格是单调的,但是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)

答案 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。数字不会自动换行,但是要耗尽可用的数字库存会花费非常非常长的时间