PG的WAL机制

网友投稿 705 2022-05-28

对于数据库的设计,数据库的数据安全最为重要,如何才能保证数据库的数据不丢失。PG是使用WAL(Write Ahead Logging)来实现的,即数据页写入磁盘前务必要将对应的Xlog写入磁盘,这句话就是整个数据库实现数据不丢失的核心思想。在PG中主要要做到以下两点:

PG的WAL机制

1. 数据页落盘前必须要保证对应的XLog刷盘。即数据页落盘前要查看PageHeader中存储的LSN对应的日志是否落盘,若没有落盘一定要等此LSN落盘后才可以将数据页落盘。

2.为了防止数据页的半写问题(操作系统的刷盘的原子操作的最小单位是4K,而一个page页面的大小是8K,所以一个数据页落盘时可能出现机器宕机等情况,导致数据写了一半,另一半没有写下去),PG使用full Page write机制来应对此问题,即checkpoint后,第一次修改页面时将页面的所有信息存储在XLog中,这样当出现上述情况后就可以使用Xlog中保存的页面数据来恢复数据页面。

然而上面的描述很显然有一个场景没有解决,如果Xlog页面坏掉怎么办,因为我们需要使用Xlog来恢复数据页面,Xlog坏掉了没法修复了。这种情况PG提供了一个有损恢复的工具,貌似叫做pg_xlogreset。

其还有一种场景就是某个Xlog页面坏掉了,且对应的数据页面同事出现半写的问题,这种情况使用pg_xlogreset可以让数据库起来,但是这个半写的页面没有修复,一旦读取此页面就会出现CRC校验报错或者其他的问题,总之会报错或者直接Painc掉。这种情况PG又提供了一个GUC参数zero_damaged_pages,即遇到此页面先跳过,使其可以读取其它页面。

WAL基本原理大概就是这样,详细还是要看代码滴。

数据仓库服务 GaussDB(DWS)

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:mysql 双1设置
下一篇:(精华)2020年7月12日 vue 键盘事件
相关文章