PostgreSQL-WAL日志介绍(一)
1. 概述
1.1 WAL日志
WAL日志:即预写式日志(Write-Ahead Logging),是保证数据完整性、实现事务日志的一种标准方法。WAL的中心思想是数据文件的修改必须在这些动作被日志记录后才被写入,即先写日志,再写数据。
数据库采用WAL日志的方式实现故障恢复,它将SQL对数据的修改抽象成一系列WAL日志记录(Record),多个Record组成一个流式的日志序列。在数据库出现故障时,可以通过逐条重做(REDO)WAL日志记录,恢复尚未落盘的数据,从而保证数据的持久性。
1.2 日志文件
事务日志的文件名中隐含着日志的信息,每个文件名的长度都是24个字符,每个字符以16进制表示。其中前八个字符表示时间线;中间八个字符表示逻辑ID,每个逻辑id默认大小为256*16MB,每个逻辑id被划分为多个日志段(即日志文件));后八个字符表示段号,每个日志段默认大小为16MB(可以通过wal_segment_size指定),因此在末尾的8个字符中,只有最后两个字符有用(即用256以内整数的十六进制表示),这两个字符表示当前文件是第几个日志段),每个段是一个独立的日志文件。
逻辑ID、段号以及段内的偏移量构成日志序列号LSN,形如“0/24E9AB68”的字符串,其中0表示逻辑ID,24表示段ID,E9AB68表示这个LSN在段内的偏移量,如果此时时间线为1,那么这个LSN对应的日志文件时000000010000000000000024,它在文件中的偏移量是15313768。
使用pg_waldump可以查看日志文件。日志被划分为多个类型的资源管理器(Rmgr),每个资源管理器只需要负责与自己相关的日志处理,这样就可以将庞杂的日志类型更加清晰地表达出来。
【注】PostgreSQL数据库中的事务日志只有Redo日志,没有Undo日志。
1.3 日志页面
日志由固定大小的多个段组成,每个段是一个独立的日志文件。每个日志文件都在内部划分为多个日志页面。默认情况下,每个日志页面大小为8KB。日志页面由页面头(Header)和连续的日志记录(Record)组成,日志记录是事务日志的最小单元。
Header分为两种类型:1、第一个页面的Header中包含段的长度、段页面的大小等信息,通常使用XLogLongPageHeaderData来标识。2、其他页面使用“short”表示页面的Header信息,对应的结构体是XLogPageHeaderData,包含当前事务日志对应的版本、时间线等信息。(XLogLongPageHeaderData和XLogPageHeaderData是包含关系)
日志记录的数据主要分为两部分:一部分是与页面有关的信息,这部分不保存实际数据,只保存与页面相关的header信息;实际数据在第二部分,紧随着XLogRecordDataHeader存储。每个页面中都有多条日志记录。为了节省空间以及处理一些特殊情况,如果页面的剩余空间大于日志记录的头部(及大于XlogRecord结构体的大小),同时又不足以放下一条完整的日志记录,那么这条日志记录可以跨页面保存;否则这部分剩余空间无法被使用。此外,日志记录之间隐含着连接关系,通过xl_prev能够定位到上一条日志记录的起始位置。由于日志记录是顺序存储的,所以通过xl_tot_len能够定位到下一条日志记录的起始位置,因此日志记录之间形成了一个“双向链表”。
原文地址:https://blog.csdn.net/gofordata/article/details/145163940
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!