面试题答案
一键面试事务日志(WAL)的主要作用
- 故障恢复:当数据库系统发生崩溃(如停电、软件故障等)后,PostgreSQL可以利用WAL日志进行崩溃恢复。通过重放WAL日志中记录的操作,数据库能够将数据恢复到崩溃前的状态,确保已提交事务的持久性。
- 复制:在流复制等主从复制架构中,主库将WAL日志发送给从库,从库通过重放这些日志来保持与主库的数据同步,实现数据的高可用性和灾难恢复。
WAL机制保证数据持久性的方式
- 预写式日志(Write-Ahead Logging):在对数据页面进行实际修改之前,先将相应的修改操作记录到WAL日志中。这样即使在数据页面修改过程中发生故障,由于WAL日志已经记录了操作,系统可以在恢复时重放这些日志来完成未完成的操作。
- 检查点(Checkpoint):定期在WAL日志中设置检查点。检查点的作用是将当前内存中已修改的数据页面(称为脏页)刷新到磁盘上的物理数据文件中。当发生崩溃恢复时,只需要从检查点之后的WAL日志开始重放,而不需要重放整个日志,从而减少恢复时间。
- 日志序列号(LSN - Log Sequence Number):每个WAL记录都有一个唯一的LSN。LSN用于跟踪日志记录的顺序和位置,确保在恢复过程中按正确的顺序重放日志,保证数据的一致性和持久性。在崩溃恢复时,数据库系统会根据LSN确定需要重放的日志范围。
- 日志刷盘策略:PostgreSQL有不同的日志刷盘策略,例如在事务提交时将相关的WAL日志记录强制刷新到磁盘(fsync操作)。这样可以确保一旦事务提交成功,其对应的日志记录已持久化到磁盘,即使系统崩溃也不会丢失,从而保证了数据的持久性。