重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛
标题:
checkpoint 与 pg_switch_wal()区别与联系
[打印本页]
作者:
郑全
时间:
2025-9-5 15:43
标题:
checkpoint 与 pg_switch_wal()区别与联系
本帖最后由 郑全 于 2025-9-5 15:45 编辑
在 PostgreSQL 中,checkpoint(检查点)是一个机制,pg_switch_wal() 是一个函数,它们既有区别又存在联系:
区别
功能本质
checkpoint:是数据库维持数据一致性和提升恢复效率的一种内部机制。它负责将内存中共享缓冲区里,修改记录已写入 WAL 日志的脏数据页刷新到磁盘;记录检查点相关信息(如 WAL 位置等)到 WAL 日志中;还能在一定条件下帮助截断不再需要的 WAL 日志,释放磁盘空间 。例如,数据库持续运行产生大量脏页,checkpoint 会定期将这些脏页写入磁盘,减少崩溃恢复时 WAL 日志重放量。
pg_switch_wal():是供用户或应用程序调用的函数,主要作用是强制立即切换 WAL 日志文件。调用后,当前正在使用的 WAL 日志文件会被关闭,后续的 WAL 记录将写入新的日志文件。此外,它会返回当前 WAL 日志的序列号(LSN),方便用于后续的记录和操作 。比如在备份前调用,能明确备份时间点对应的 WAL 位置,便于后续恢复。
触发方式
checkpoint:可由多种方式触发。一是根据配置参数 checkpoint_timeout(默认 5 分钟),到达指定时间间隔后自动触发;二是当 WAL 日志文件达到 checkpoint_segments(旧参数,新版本使用 max_wal_size 等相关配置) 配置的大小阈值时触发;还能通过 SQL 命令 CHECKPOINT 手动触发。
pg_switch_wal():只能通过在 SQL 语句中显式调用该函数来触发,如 SELECT pg_switch_wal(); ,没有自动触发的机制。
对 WAL 日志处理
checkpoint:虽然会涉及 WAL 日志截断(在确保数据可恢复前提下),但主要是围绕数据页持久化和记录检查点信息,对 WAL 日志的操作是数据库内部根据整体状态进行的,目的是保障数据一致性和优化恢复流程。
pg_switch_wal():单纯聚焦于 WAL 日志文件的切换,强制生成新的 WAL 日志文件,方便归档和记录特定时间点后的事务操作,本身不涉及对数据页的刷新等操作。
联系
都与 WAL 日志相关
checkpoint 机制和 pg_switch_wal() 函数都围绕 WAL 日志展开工作。checkpoint 通过 WAL 日志确保数据一致性,对 WAL 日志进行截断等管理;pg_switch_wal() 则是用于控制 WAL 日志文件的切换,并且切换后的 WAL 日志文件也会参与到数据库的恢复流程中,比如归档后的日志可用于时间点恢复。
辅助数据恢复
二者都为数据库的数据恢复提供支持。checkpoint 通过记录检查点信息、刷新脏页,能让恢复时更快定位重放起点,减少恢复时间;pg_switch_wal() 切换 WAL 日志文件并返回 LSN,方便在恢复时准确匹配备份和日志,确保能恢复到期望的时间点状态。
相互影响
在一定程度上,checkpoint 的执行会影响 WAL 日志文件的状态,进而影响 pg_switch_wal() 函数调用的效果。例如,checkpoint 执行后截断了部分 WAL 日志,那么后续调用 pg_switch_wal() 切换后的新日志文件是基于截断后的状态开始记录的。反之,频繁调用 pg_switch_wal() 切换日志文件,也可能影响 checkpoint 对 WAL 日志的管理和截断判断
欢迎光临 重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛 (http://bbs.cqsztech.com/)
Powered by Discuz! X3.2