阅读postgreSQL文档时:
在写入每个新记录时,WAL记录会附加到WAL日志中。插入位置由日志序列号(LSN)描述,该日志序列号是日志中的字节偏移量,随着每条新记录的增加而单调增加。LSN值作为数据类型pg_lsn返回。值可以进行比较,以计算分离它们的WAL数据的体积,因此它们用于测量复制和恢复的进度。
我们能不能依赖于这个序号是严格单调的呢?难道没有时间点,这种偏移重置到以前的位置(由于WAL存档,或其他类型的操作)?
发布于 2018-12-05 11:04:00
它是严格单调的,但LSN
指向某个段文件中的物理偏移量。
难道没有时间点,这种偏移重置到以前的位置(由于WAL存档,或其他类型的操作)?
有这样一个时间点,但在另一个段文件。
这里供参考的是PG代码中的一个宏,它从LSN
(internal.h)中提取段号:
/*
* Compute a segment number from an XLogRecPtr.
........
*/
#define XLByteToSeg(xlrp, logSegNo, wal_segsz_bytes) \
logSegNo = (xlrp) / (wal_segsz_bytes)
发布于 2019-06-02 13:23:17
从postgres 关于wal内部件的文档 (强调地雷)
在写入每个新记录时,WAL记录会附加到WAL日志中。插入位置由日志序列号(LSN)描述,日志序列号是日志中的字节偏移,随每个新记录单调增加。LSN值作为数据类型pg_lsn返回。值可以比较来计算分离它们的WAL数据的体积,因此它们被用来测量复制和恢复的过程。 WAL日志存储在数据目录下的目录pg_wal中,作为一组段文件,通常每个文件大小为16 MB (但可以通过更改-wal-segsize initdb选项来更改大小)。每个片段被划分为页面,通常每个页面8 kB (这个大小可以通过-wal-wal-块大小配置选项来更改)。访问/xlog记录器.h中描述了日志记录头;记录内容取决于正在记录的事件的类型。从000000010000000000000000开始,段文件以名称的形式提供不断增加的数字。数字没有包装,但是需要很长一段时间才能用完的可用库存。
https://stackoverflow.com/questions/53629031
复制相似问题