news 2026/5/30 22:16:02

postgresql下pg_rewind数据库恢复

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
postgresql下pg_rewind数据库恢复

在 PostgreSQL 主备切换(Failover)后,旧的主库因为数据可能领先或与新主库(原备库)产生了分歧,无法直接启动同步。pg_rewind 的作用是对比两者的 WAL 日志,将旧主库“回滚”到分叉点,使其能够以增量同步的方式重新加入集群,避免了全量重做数据(pg_basebackup)的巨大开销。

一、实现流程

pg_rewind的工作可以分为五个关键阶段:

1. 扫描新主库的 WAL 日志

pg_rewind首先读取新主库的 WAL 日志,从当前时刻向上追溯,直到找到与旧主库最后一次同步时的共同时间线位置。

2. 扫描旧主库的数据文件

这是最关键的一步。pg_rewind会读取旧主库从分叉点开始之后的所有 WAL 日志。

  • 它会解析这些 WAL 记录中的Data Page ID
  • 记录下哪些数据页(Page)在分叉后被修改过了。
  • 将这些被修改过的块编号放入一个散列表中。

3. 从新主库获取对应数据块

一旦确定了旧主库中哪些块是“脏”的(即分叉后修改过的),pg_rewind就会连接到新主库,仅请求这些特定块的最新副本。

  • 此时它会利用新主库的wal_log_hints参数或数据校验和,因为这些机制强制 PostgreSQL 在 checkpoint 后的第一次修改时记录整个数据页的内容(Full Page Writes)。

4. 覆盖旧主库的数据块

将从新主库拷贝过来的“正确”数据页,直接写入到旧主库对应的文件位置中。同时,它还会同步一些系统文件(如pg_controlpg_xact等)。

5. 复制新主库的 WAL 日志

最后,它会从新主库拷贝分叉点之后的所有 WAL 日志到旧主库的pg_wal目录。这是为了确保旧主库在下次启动时,可以通过重放这些 WAL 日志来实现数据的最终一致性。

二、pg_rewind 恢复示例

以下是使用 pg_rewind 恢复旧主库为新从库的详细步骤:

2.1 前提条件

  1. 配置要求:主库在故障前必须开启了 wal_log_hints = on,或者数据库初始化时开启了数据校验和(data checksums)。
  2. 状态确认
    • 新主库(原备库)已提升并处于读写状态。
    • 旧主库(待恢复库)必须已经彻底停止(干净关闭或宕机后未再写入)。

2.2 操作步骤

假设:

  • 新主库 IP:192.168.1.102
  • 旧主库 IP:192.168.1.101 (当前操作在该机器上执行)
  • 数据目录:/var/lib/postgresql/data
2.2.1. 停止旧主库(如果还在运行)

# 确保旧主库完全停止

systemctl stop postgresql

2.2.2. 执行 pg_rewind

旧主库节点上,使用 postgres 用户执行以下命令:

pg_rewind --target-pgdata=/var/lib/postgresql/data \

--source-server="host=192.168.1.102 user=postgres dbname=postgres password=your_password" \

--progress

  • --target-pgdata:旧主库的数据目录。
  • --source-server:指向新主库的连接字符串。
  • 注意:连接用户需具备超级用户权限或 pg_rewind 所需的特定权限。
2.2.3. 配置为从库模式

pg_rewind 只负责同步数据文件,不会自动开启流复制。你需要将其设置为备库:

  1. 创建从库标记文件

touch /var/lib/postgresql/data/standby.signal

  1. 修改连接信息: 编辑 /var/lib/postgresql/data/postgresql.auto.conf,更新 primary_conninfo 指向新主库

primary_conninfo = 'host=192.168.1.102 port=5432 user=replica_user password=your_password'

2.2.4. 启动旧主库(此时作为新从库)

systemctl start postgresql

2.3 验证状态

  1. 检查同步状态: 在新主库执行:

SELECT * FROM pg_stat_replication;

  1. 查看日志: 检查旧主库(现从库)日志,确认是否出现 started streaming WAL from primary at ... 的字样。

三、核心注意事项

  • WAL保留:pg_rewind 需要新主库上保留自“分叉点”以来的所有 WAL 日志。可以调大 max_slot_wal_keep_size 或使用 WAL 归档。如果日志已被清理,pg_rewind 会失败,此时只能通过 pg_basebackup重新做全量备份。
  • 配置文件:pg_rewind 默认会覆盖 postgresql.conf 等配置文件。如果主从配置有细微差异(如内存分配),建议执行后检查一下。
  • 复制槽:如果使用了物理复制槽,在新主库上可能需要重新创建对应新从库的复制槽。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 16:39:29

Docker Run命令结合Miniconda镜像快速构建PyTorch训练环境

Docker 与 Miniconda 协同构建 PyTorch 训练环境 在深度学习项目中,最让人头疼的往往不是模型设计本身,而是“环境配置”这个看似简单却极易出错的环节。你是否经历过这样的场景:论文复现时因为 PyTorch 版本不匹配导致报错?团队协…

作者头像 李华
网站建设 2026/5/30 18:40:42

Docker diff查看Miniconda容器文件变更记录

Docker diff 查看 Miniconda 容器文件变更记录 在 AI 和数据科学项目中,环境“在我机器上能跑”依然是个老生常谈的问题。即便使用了 Conda 这样的环境管理工具,不同开发者的本地依赖、系统库、缓存路径仍可能导致行为差异。当团队协作或部署到生产环境时…

作者头像 李华
网站建设 2026/5/29 21:36:28

对抗样本攻击详解:如何让AI模型产生错误判断

精心构造的输入样本能让机器学习模型产生错误判断,这些样本与正常数据的差异微小到人眼无法察觉,却能让模型以极高置信度输出错误预测。这类特殊构造的输入在学术界被称为对抗样本(adversarial examples)。 模型将右侧图像判定为长臂猿,置信…

作者头像 李华
网站建设 2026/5/30 18:40:49

数据科学家必备:Miniconda-Python3.10镜像实现PyTorch环境精准复现

数据科学家必备:Miniconda-Python3.10镜像实现PyTorch环境精准复现 在深度学习项目中,你是否曾遇到过这样的场景?同事发来一份 Jupyter Notebook,声称“模型准确率高达95%”,可你在本地一跑,却报出一堆包版…

作者头像 李华
网站建设 2026/5/30 21:18:45

Miniconda环境文档化:Sphinx生成API参考手册

Miniconda环境文档化:Sphinx生成API参考手册 在人工智能和数据科学项目日益复杂的今天,一个常见的困扰是:代码能在本地运行,却在同事或生产环境中报错。更糟的是,当需要发布某个算法库时,发现API文档早已与…

作者头像 李华
网站建设 2026/5/28 15:35:13

GitHub Pull Request流程:贡献Miniconda相关开源项目

GitHub Pull Request流程:贡献Miniconda相关开源项目 在数据科学和人工智能项目日益复杂的今天,一个常见的工程痛点是:为什么代码在你的机器上运行正常,却在CI流水线或同事环境中报错? 答案往往指向依赖管理的不一致。…

作者头像 李华