PostgreSQL主从切换后时间线修复操作手册

当PostgreSQL发生主从切换导致时间线分裂时,可以通过pg_rewind工具来修复。

触发时间线分裂时,通常会在旧主降级并连接到新主时,日志中出现如下报错并退出:

sql 复制代码
FATAL: timeline X of the primary does not match recovery target timeline Y

以下是具体的修复操作步骤:

备份配置文件

在执行pg_rewind之前,首先需要备份新主库和需要rewind的库的配置文件,以免在rewind过程中这些配置文件被修改或覆盖。重要的配置文件包括postgresql.conf、pg_hba.conf和recovery.conf(如果存在)。

在需要rewind的库上操作:

登录到数据库服务器:

复制代码
su - postgres
ssh 172.25.100.1

停止PostgreSQL服务:

arduino 复制代码
pg_ctl stop -m fast

进入PGDATA目录:

bash 复制代码
cd /data/postgres/pgdata

备份配置文件:

bash 复制代码
export BACKUP_DIR=/data/backup
mkdir -p $BACKUP_DIR
cp postgresql.conf $BACKUP_DIR/postgresql.conf.bak
cp pg_hba.conf $BACKUP_DIR/pg_hba.conf.bak
if [ -f recovery.conf ]; then cp recovery.conf $BACKUP_DIR/recovery.conf.bak; fi

使用pg_rewind

pg_rewind工具用于在主从切换后,将一个之前是主库的PostgreSQL实例同步到新的主库上,以解决时间线分裂的问题。确保新主库正在运行,并且需要rewind的库已经停止。

确保新主库(172.21.100.1)正在运行。

在需要rewind的库上执行pg_rewind:

ini 复制代码
# 验证(dry-run)
pg_rewind -n --target-pgdata=/data/postgres/pgdata --source-server='host=172.21.100.1 port=1921 user=postgres password=fake_password dbname=postgres'

# 实际执行
pg_rewind --target-pgdata=/data/postgres/pgdata --source-server='host=172.21.100.1 port=1921 user=postgres password=fake_password dbname=postgres'

确认pg_rewind执行完成后没有错误。

恢复配置文件

在pg_rewind操作完成后,需要将之前备份的配置文件恢复到PGDATA目录。

进入PGDATA目录:

bash 复制代码
cd /data/postgres/pgdata

恢复配置文件:

bash 复制代码
export BACKUP_DIR=/data/backup
mkdir -p $BACKUP_DIR
cp $BACKUP_DIR/postgresql.conf.bak postgresql.conf
cp $BACKUP_DIR/pg_hba.conf.bak pg_hba.conf
if [ -f $BACKUP_DIR/recovery.conf.bak ]; then cp $BACKUP_DIR/recovery.conf.bak recovery.conf; fi

重启PostgreSQL服务

重启PostgreSQL服务,以应用pg_rewind操作和恢复的配置文件。

sql 复制代码
pg_ctl start

验证

登录到PostgreSQL数据库,检查数据是否同步,且配置是否正确。

使用psql或其他客户端工具连接到数据库:

复制代码
psql

运行一些基本的SQL命令来检查数据是否同步:

csharp 复制代码
SELECT pg_current_wal_lsn();

检查时间线是否已经修复:

csharp 复制代码
SELECT timeline_id FROM pg_control_checkpoint();

注意事项

  • 确保在执行这些操作之前,理解每一步的作用和潜在的风险。
  • 如果在使用pg_rewind时遇到任何问题,参考官方文档或寻求专业帮助。
  • 在执行pg_rewind之前,确保目标库已经完全停止,以避免数据损坏。
  • 在生产环境中操作时,建议先在测试环境进行验证。
相关推荐
掘金者阿豪19 分钟前
SQL Server数据迁移完成后,凌晨的数据库告警该怎么查?
前端·后端
鶴哥只手遮天29 分钟前
AFSIM 2.9.0 深度解析·进阶卷第 1 章 插件源码精读:16 个 WSF 插件的架构与实现
后端
愚农搬码36 分钟前
低代码表单与在线问卷不是一回事:产品定位和技术边界
后端
武子康38 分钟前
固定时间步已经开了,为什么游戏回放还会走出不同位置?
人工智能·后端·agent
70后写java的老码农41 分钟前
换模型只改三行配置:LangChain4j + Spring Boot 3.5 实战,一次分别接入 9 家模型服务
后端·ai编程
愚农搬码1 小时前
2026 年开源表单设计器选型:哪个更好用?
后端
vipxieliang1 小时前
ValidX 正则表达式预编译优化:Pattern 复用策略
java·spring boot·后端
vipxieliang1 小时前
OpenTelemetry 生产实践:Skyscanner 24 集群管理经验与 Mastodon 小团队方案
后端
明月_清风2 小时前
为什么 Skill 很难商业化?Bot 才是 AI 时代真正的商业机会
人工智能·后端·agent
苍何2 小时前
DeepSeek 的 Super-agent 设计,和我们的工程实践
后端