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基本原理大概就是这样,详细还是要看代码滴。
- 点赞
- 收藏
- 关注作者
评论(0)