PG的WAL机制

举报
亚中风风寒 发表于 2021/04/11 20:09:26 2021/04/11
【摘要】 PG的WAL基本原理

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

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基本原理大概就是这样,详细还是要看代码滴。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。