面试题答案
一键面试基本原理
- 日志与脏页关联:PostgreSQL使用预写式日志(Write-Ahead Logging, WAL),在对数据页进行修改前,先将相应的修改记录写入日志。当数据页发生变化但还未写入磁盘时,该页成为脏页。
- 检查点作用:检查点是一个数据库系统定期执行的操作,它的主要任务是将一定时间内积累的脏页刷新到磁盘。在检查点发生时,系统会记录当前日志位置(称为检查点位置),确保在此之后发生崩溃时,只需重放检查点之后的日志记录来恢复数据,减少恢复时间。
- 刷页过程:当触发检查点时,系统从共享缓冲区中找到所有的脏页,并将它们写入磁盘的数据文件中。同时,更新控制文件(如pg_control)中的检查点信息,包括检查点时间、日志位置等。
主要触发条件
- 时间触发:PostgreSQL有一个参数
checkpoint_timeout
(默认值为5分钟),表示两次检查点之间的最大时间间隔。当达到这个时间限制时,就会触发一个检查点,将脏页刷入磁盘。 - 日志量触发:另一个参数
checkpoint_segments
(默认值为32),它定义了在触发检查点之前可以使用的WAL日志段数量。每个WAL日志段大小固定(通常为16MB)。当使用的WAL日志段数量达到checkpoint_segments
设定的值时,会触发检查点,将脏页刷入磁盘。 - 手动触发:数据库管理员可以通过执行特定的SQL命令(如
CHECKPOINT
语句)手动触发检查点,强制将所有脏页刷入磁盘。这种方式通常用于在进行一些特殊操作(如备份)之前,确保数据的一致性。