PostgreSQL pg_rewind 执行过程分析
1. pg_rewind 功能描述
pg_rewind 是 PostgreSQL 提供的一个工具,在主库故障切换后,用于修复旧主的流复制。PG 主备切换后,流复制的时间线会发生变化,在异步复制场景下,旧主产生的 WAL 日志可能有部分未同步到备库,此时做故障切换,就会导致新的主库丢失一部分数据,而旧主恢复后,也无法与新主库建立复制关系,因为旧主有一些事务需要回滚,然后才能与新主建立复制关系。pg_rewind 工具能够自动将旧主多出的事务数据进行回滚,并与新主建立复制关系。
2. pg_rewind 实现细节
以下分析基于 PG 13 源码。
旧主库称之为 target,新主库称之为 source。
如果 target 的时间线与 source 的时间线相同,则无需做 pg_rewind,直接就可以建立流复制。时间线通过 global/pg_control 获取。其对应的源码结构如下:
struct ControlFileData
{
...
CheckPoint checkPointCopy; /* copy of last check point record */
...
}
if (ControlFile_target.checkPointCopy.ThisTimeLineID == ControlFile_source.checkPointCopy.ThisTimeLineID)
{
pg_log_info("source and target cluster are on the same timeline");
rewind_needed = false;
}