You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测PostgreSQL是否正常关闭?适配pg_rewind执行需求

检测PostgreSQL非正常关闭及对应处理方案

怎么判断PostgreSQL是否非正常关闭

下面是几个靠谱的检测方式:

  • 用pg_controldata查看集群状态
    运行pg_controldata $PGDATA,找到Database cluster state字段:

    • 显示in production:说明数据库未正常关闭(崩溃、强制杀进程、服务器宕机都属于这类情况)
    • 显示shut down:正常关闭
    • 显示shut down in recovery:备库正常关闭
  • 核对postmaster.pid与实际进程

    • 如果$PGDATA/postmaster.pid存在,但文件中记录的PID在系统中查不到(用ps -p <PID>验证),说明进程被强制终止或崩溃,属于非正常关闭
    • 划重点:正常关闭时postmaster.pid会被自动删除,只有非正常关闭才会残留该文件
  • 查看PostgreSQL日志找线索
    搜索日志中的这些关键词:

    • server process (PID xxx) was terminated by signal xx:进程被信号强制终止(比如kill -9)
    • database system was interrupted:服务器崩溃或意外断电
    • database system was not properly shut down; automatic recovery in progress:启动时会提示之前是非正常关闭

为pg_rewind做前置处理

如果检测到非正常关闭,得先让数据库进入正常关闭状态才能执行pg_rewind:

  1. 启动数据库:pg_ctl start -D $PGDATA
    • 启动时PostgreSQL会自动执行崩溃恢复,等恢复完成后数据库会处于正常运行状态
  2. 正常关闭数据库:pg_ctl stop -D $PGDATA -m fast
    • 用-m fast保证快速且正常关闭,此时集群状态会变为shut down,满足pg_rewind的前置要求

数据状态检查建议

碰到非正常关闭的情况,建议做这些数据检查:

  • 用pg_checksums校验数据完整性
    运行pg_checksums -c -D $PGDATA,该命令会检查所有数据块的校验和,确认是否存在损坏
    • 注意:必须在数据库关闭状态下才能执行此命令
  • 查看日志中的恢复记录
    检查崩溃恢复过程中是否有错误或警告(比如corrupted page),如果有,需要针对性修复对应的数据块

整合到你的同步修复流程

把检测逻辑加到现有代码中,流程大概如下:

  1. 检测备库是否不同步
  2. 检查备库的PostgreSQL关闭状态:
    • 若为非正常关闭:
      a. 启动备库,等待自动恢复完成
      b. 正常关闭备库
      c. 执行pg_checksums检查数据完整性
      d. 数据无损坏的话,执行pg_rewind操作
    • 若为正常关闭:直接执行pg_rewind操作

内容的提问来源于stack exchange,提问作者caffein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:55:31