第一帧:历史的血泪与防呆改名(pg_xlog ->pg_wal)
官方原话:“PostgreSQL将XLOG记录写入在pg_wal目录中(10之前为pg_xlog目录)”
- 慢动作推演:时间回到 PG 10 发布之前。夜里 3 点,某公司的服务器磁盘空间报警(使用率 99%)。一位睡眼惺忪的初级运维登录服务器,用
ls扫了一眼数据目录,看到了一个叫pg_xlog的巨大文件夹。他的大脑瞬间触发了肌肉记忆:“带有log字眼?那肯定是随便打印的运行日志,删了腾空间!”于是他潇洒地敲下rm -rf pg_xlog/*。物理结局:下一秒,数据库当场触发PANIC崩溃。由于预写式日志(Write-Ahead Log)被物理抹除,内存中未落盘的脏页彻底失去了兜底保障,全库数据陷入不可逆的损坏。 - 架构定性:原厂架构师在 PG 10 强行将其改名为
pg_wal。这根本不是底层逻辑的变动,而是一道极其冷酷的社会工程学防线。用底层专业术语警告所有人:“这是整个数据库的命脉,绝对禁止人类的手动干预!”
第二帧:I/O 资源的生死轮回(回收与删除)
官方原话:“切换后的段文件通常会被回收以供下次使用;如果不需要,也可能会被删除。”
- 慢动作推演(Checkpointer 进程的两把手术刀):当一个 16MB 的文件被写满并封板后,后台的
Checkpointer(检查点进程)会像法医一样走过来接管它的尸体。- 首选分支(极速回收 Recycle):内核发现当前 WAL 总量尚未触及预估的天花板。它绝对不会去调用极其昂贵的
create()函数新建文件。相反,它抽出 C 语言底层的rename()函数,直接把废弃的旧文件名(比如00000001000000000000000A)篡改为未来即将需要的新段号(比如...000F)。- 物理意义:这极其精妙地锁死了 Linux 磁盘上的 16MB 连续物理扇区和 inode 节点,彻底避开了新文件分配与全零(Zero)初始化带来的恐怖 I/O 延迟。
- 备选分支(冷酷处决 Remove):如果是双十一大促刚过,业务进入冷清的凌晨。内核的移动平均算法算出:“未来几小时根本用不到这么多日志文件”。此时,
Checkpointer才会抽出屠刀,调用底层的unlink()函数,将多余的空闲文件从硬盘上彻底物理抹除,归还磁盘空间。
- 首选分支(极速回收 Recycle):内核发现当前 WAL 总量尚未触及预估的天花板。它绝对不会去调用极其昂贵的
第三帧:三大切换引爆器的扣动瞬间
官方原话:“WAL文件切换的规则为:1. WAL文件已经写满;2. 手工执行 pg_switch_wal();3. 启用 archive_mode 且超过 archive_timeout”
这三条规则,分别代表了物理空间、人类意志与时间底线对 WAL 日志流的强制切割:
- 引爆器 1:物理边界触顶(自然溢出切换)
- 微观画面:内存中的
XLogRecord像子弹一样不断射入 16MB 的文件池。当 LSN(日志序列号)坐标的低 32 位精准撞击到 16777216 字节(16MB) 这个绝对数学边界时。内核探测到“越界”,立刻调用close()封闭当前文件描述符,触发.ready归档状态,并顺滑地open()下一个由rename准备好的复用文件。这是最丝滑的自然切换。
- 微观画面:内存中的
- 引爆器 2:上帝之手的战术截断(暴力填零)
- 微观画面:DBA 敲下了
SELECT pg_switch_wal();。为什么要敲?通常是为了打一个干净的备份断点,或者强制下游流复制节点立刻同步。 - 物理代价:此时,当前的 16MB 文件可能仅仅写了 2MB 真实数据。内核收到指令后,绝对不能直接把文件切断成 2MB(因为底层引擎要求 WAL 文件必须是绝对对齐的 16MB)。于是,内核会在极短的时间内,向剩下的 14MB 空间疯狂灌入纯粹的
0x00(空白零字节,Zero-padding)!直到硬生生把文件撑满到 16MB,然后封板。这叫“用磁盘空间献祭,换取战术动作的即刻执行”。
- 微观画面:DBA 敲下了
- 引爆器 3:时空安全网的强制兜底(RPO 容灾极限)
- 微观画面:假设业务极其冷清,半夜 1 个小时才写了 100KB 的日志。如果不切换,这 100KB 包含最新交易的日志就会永远憋在当前文件里。归档进程(Archiver)像个瞎子,只有看到
.ready状态才会去搬运文件。如果本地机房此时起火,这 1 小时的数据将彻底灰飞烟灭。 - 物理防线:一旦配置了
archive_timeout = 10min,内核定时器就会启动死亡倒计时。10 分钟一到,无论当前文件写了 10KB 还是 10MB,内核都会强行唤醒引爆器 2 的逻辑——疯狂灌入零字节撑满 16MB,强行封板生成.ready!逼迫归档进程立刻将这份记录着最后生机的日志送往同城双活或异地灾备中心。
- 微观画面:假设业务极其冷清,半夜 1 个小时才写了 100KB 的日志。如果不切换,这 100KB 包含最新交易的日志就会永远憋在当前文件里。归档进程(Archiver)像个瞎子,只有看到
了解 www.876873.xyz 的更多信息
订阅后即可通过电子邮件收到最新文章。
段文件的回收与删除 wal日志文件的切换:等您坐沙发呢!