面试题答案
一键面试WAL日志写入策略
- 循环写:PostgreSQL的WAL日志采用循环写的方式,当一个WAL段文件写满后,会切换到下一个WAL段文件继续写入。WAL段文件大小固定,默认是16MB 。
- 检查点机制:定期执行检查点操作,在检查点时,会将共享缓冲区中所有已修改的页面刷新到磁盘,同时在WAL日志中记录检查点信息。检查点会截断不再需要的WAL日志,使得崩溃恢复时只需从最近的检查点之后的WAL日志开始重放。
- 即时写入:对于一些关键操作,如事务提交等,相关的WAL记录会即时写入磁盘,确保数据的持久性。而普通的WAL记录会根据配置参数(如
checkpoint_timeout
、checkpoint_segments
等),以一种优化的方式批量写入磁盘,平衡性能与数据安全。
WAL对数据库崩溃恢复的作用
- 崩溃恢复原理:当PostgreSQL数据库发生崩溃后重新启动时,会利用WAL日志进行崩溃恢复。数据库会从最近的检查点位置开始,重放检查点之后的所有WAL日志记录。这些日志记录包含了自检查点以来数据库发生的所有数据修改操作。
- 数据一致性保证:通过重放WAL日志,数据库能够重建崩溃前的状态,确保已提交事务对数据的修改都被应用,未提交事务对数据的修改都被回滚,从而保证数据的一致性和完整性。即使在崩溃时部分数据可能还在内存中未写入磁盘,通过WAL日志也能恢复到崩溃前的正确状态。