此博客旨在帮助您理解章节的内侧概念:9 [书面记录(WAL)]
注意:确保您对
有透彻的了解 在进入第9章第2章之前,Chapter 9 Part-1和Posttresql的基础是我们探索的基础。
所以,让我们继续:
全页写入
-
假设table_a在存储中的页面数据已损坏,因为操作系统在背景撰写过程中一直在编写肮脏页面时失败。由于无法在损坏的页面上重播XLOG记录,因此我们需要一个全页写入来处理此类失败的其他功能。
-
在PostgreSQL中,包含整个页面的这样的XLOG记录称为备份块或全页图像。
全页写入 postgresql中的图:
-
(1)CheckPointer开始检查点过程。
-
(2)在第一个插入语句的插入中,尽管PostgreSQL的运行方式几乎与以前的小节相同,但此XLOG记录是此页面的备份块(即它包含页面完整包含页面),因为这是最新检查点之后的此页面的第一篇文章。
-
(3)由于此交易所做的,PostgreSQL的运作方式与以前的小节相同。
-
(4)在插入第二个插入语句的插入中,PostgreSQL以与上一小节相同的方式运行,因为此XLOG记录不是备份块。
-
(5)当此语句的交易进行时,PostgreSQL以与上一小节相同的方式运行。
-
(6)要演示全页写入的有效性,在这里,我们考虑了由于操作系统故障发生在背景 - 作者一直在编写时,该案例已损坏了存储的表_a页面。它进入HDD。
数据库恢复带有备份块的数据库 postgresql中的如下图:
-
(1)PostgreSQL读取第一个插入语句的XLOG记录,并将损坏的Table_a的页面从数据库群集加载到共享的缓冲池中。在此示例中,Xlog记录是备份块,因为根据全页写入规则,每个页面的第一个XLOG记录始终是其备份块。
-
(2)当Xlog记录是其备份块时,应用了另一个重播的规则:记录的数据输入(即页面本身)将被覆盖到页面上,无论两个LSN的值如何,并且页面的LSN更新为XLOG记录的LSN。
-
对于示例,PostgreSQL将记录的数据输入到损坏的页面上,并将表_a的LSN更新为LSN_1。通过这种方式,损坏的页面由其备份块恢复。
-
(3)由于第二个Xlog记录是一个非背包块,因此PostgreSQL的运作方式与以前小节中的指令相同。
-
以这种方式,即使某些数据写入错误是由于过程或操作系统下降而发生的,PostgreSQL也可以恢复数据库。
交易日志和WAL细分文件
-
从逻辑上讲,PostgreSQL将XLOG记录写入交易日志中,该记录是虚拟文件 8字节 long( 16 exabyte)。
li> -
有效的交易日志容量无限,因此可以说 8字节地址空间足够广泛,我们不可能处理一个档案的容量为8字节长度。因此,默认情况下,将PostgreSQL中的事务日志分为 16-MBYTE 的文件,每个文件称为 wal saggment 。
交易日志和Wal segment Files PostgreSQL中的图表如下图:
-
使用内置函数 pg_xlogfile_name (版本9.6或更早)或 pg_walfile_name (versoin 10或更高版本),我们可以找到Wal sement segment File File File File Name其中包含指定的LSN。
-
示例:
testdb=# SELECT pg_xlogfile_name('1/00002D3E'); # In version 10 or later, "SELECT pg_walfile_name('1/00002D3E');"
pg_xlogfile_name
--------------------------
000000010000000100000000
(1 row)
内部布局
-
默认情况下,WAL段为 16 MB 文件,并将其内部分为 8192字节(8 kb)的页面。第一页具有由结构 xloglongpageheaderdata 定义的标头数据,而所有其他页面的标题的页面信息由结构 xlogpageheaderdata 定义。
-
页面标题后,Xlog记录从下降 order中的每个页面写入每个页面。
Wal段文件的内部布局 postgresql中的图表如下图:
我希望,这个博客帮助您理解了postresql中的前进伐木(WAL)的内侧概念。
查看Chapter : 9 Part-3的摘要
如果您想了解PostgreSQL In-Depth。