Brian Pace:余下的皆是历史:WAL历史文件探究

Brian Pace:余下的皆是历史:WAL历史文件探究

💡 原文英文,约2000词,阅读约需7分钟。
📝

内容提要

PostgreSQL用时间线标识WAL记录序列,恢复或备库提升时生成新时间线,但高时间线号不代表数据最新。通过pg_controldata和WAL历史文件可追踪时间线关系:时间线11虽最新,仅含约2小时数据,而时间线9有84小时应用变更。恢复前应检查历史文件、时间线创建时间及WAL段内容,选择对业务最有用的时间线。

🔎

延伸解读

时间线号高不等于数据新

文章指出,一个常见误区是认为时间线号越高,数据就越新。实际上,高时间线号只代表数据库的最新化身,并不保证包含对业务最有用的数据。例如,时间线11虽然最新,但仅包含约2小时的应用变更,而时间线9却有84小时的应用变更。因此,在恢复前不能仅凭时间线号做决定,必须深入检查历史文件和WAL段内容。

历史文件揭示时间线家族树

WAL历史文件记录了时间线的创建来源和LSN位置,形成数据库的“家族树”。通过查看$PGDATA/pg_wal/*.history文件,可以了解时间线之间的分叉关系。如果当前实例不是时间线创建时的主库,可能只有最新的历史文件,此时需要从备份仓库恢复缺失的历史文件,才能完整追踪时间线的演变过程。

恢复前应检查的关键步骤

文章建议,在执行恢复、重建备库或副本之前,应进行一系列调查:使用pg_controldata查看当前时间线;检查pg_wal目录下的历史文件;必要时从备份仓库恢复缺失的历史文件;查看时间线的创建时间;检查WAL段的内容。这些步骤有助于确定哪个时间线包含对业务最有用的数据,避免因盲目选择而丢失重要变更。

❓

Q&A

PostgreSQL中的时间线是什么?它是如何产生的?

PostgreSQL使用时间线来标识一系列WAL记录。每次使用时间点恢复(PITR)或备库提升时,都会生成一个新的时间线。时间线用数字标识,有时用十进制,有时用十六进制。

为什么更高的时间线号不一定代表数据最新?

更高的时间线号指向数据库的最新化身,但不保证它包含对应用最有用的数据。例如,时间线11虽然最新,但只包含约2小时的应用变更,而时间线9有84小时的应用变更。

如何查看PostgreSQL当前所在的时间线?

可以使用pg_controldata命令查看,输出中的'Latest checkpoint's TimeLineID'字段显示了当前时间线。

WAL历史文件的作用是什么?如何解读其内容?

WAL历史文件记录了时间线的家族树,显示每个时间线从哪个时间线、在哪个LSN创建,以及创建原因(如'no recovery target specified'表示可能是提升,'before 时间戳'表示在某个提交之前创建)。

如果缺少某些时间线的历史文件,如何获取?

可以从备份仓库(如pgBackRest)中恢复缺失的历史文件。例如,使用pgbackrest archive-get命令恢复特定时间线的历史文件。

在进行恢复前,应该检查哪些内容以确定哪个时间线包含最有用的数据?

应检查:1) 使用pg_controldata查看当前时间线;2) 查看$PGDATA/pg_wal/*.history文件;3) 如有必要,从备份恢复缺失的历史文件;4) 查看时间线创建时间;5) 检查WAL段的内容。

🏷️

标签

➡️

继续阅读