PG数据库中。事务日志文件称为 Write Ahead Log , 在数据库恢复、高可用、流复制、逻辑复制等Postgres模块中十分重要

当数据变更时:

  • change发生时:先将变更后内容计入wal buffer,再将变更后的数据写入data buffer
  • commit 发生时:wal buffer中数据刷新到磁盘
  • checkpoint发生时:将所有data buffer刷新到磁盘

image.png

概念

redo log

redo log称为重做日志,在写入数据文件前,每个变更都会先写入到redo log中,存储数据库的所有修改历史,用于数据库故障恢复增量备份PITR复制
**

WAL segment file

为了便于管理,PG把事务日志文件划分为N个segment,每个segment称为wal segment file ,每个wal segment file大小默认为16MB

XLOG RECORD

这是一个逻辑概念,可以理解为PG中的每一个变更都对应一条XLOG RECORD,这些XLOG Record存储在WAL segment file中。PG读取这些XLOG Record进行故障恢复/PITR等操作

WAL buffer

缓冲区,不管是WAL segment file 的header还是XLOG Record都会先行写入到WAL缓存区中,在合适的时候再通过WAL writer 写入到WAL segment file中

LSN

日志序列号(uint64),在事务日志种,LSN单调递增且唯一

checkpointer

是PG的一个后台程序,周期性执行checkpoint,把XLOG Record写入到当前的WAL segment file中,该XLOG Record记录包含了最新的Redo point位置

checkpoint

检查点checkpoint由checkpointer进程执行,主要流程如下:

  1. 获取redo point,狗仔 redo检查点信息的XLOG Record并写入到WAL Segment file
  2. 刷新脏页到磁盘上
  3. 更新redo point等信息到pg_control文件中

    REDO point

    PG启动恢复的起始点,是最后一次checkpoint启动时事务日志文件的末尾即写入Checkpoint XLOG Record时的位置(偏移量)

pg_control

磁盘上的物理文件,保存检查点的基本信息

触发归档

  1. 手动切换WAL日志
  2. 写满后自动归档

    清理WAL日志

  3. 自动清理:

    1. checkpoint
    2. 数据库启动时
  4. 手动
    1. pg_archivecleanup /data/pg_root/pg_wal/ 000000010000001600000027