如何检测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:
- 启动数据库:
pg_ctl start -D $PGDATA- 启动时PostgreSQL会自动执行崩溃恢复,等恢复完成后数据库会处于正常运行状态
- 正常关闭数据库:
pg_ctl stop -D $PGDATA -m fast- 用
-m fast保证快速且正常关闭,此时集群状态会变为shut down,满足pg_rewind的前置要求
- 用
数据状态检查建议
碰到非正常关闭的情况,建议做这些数据检查:
- 用
pg_checksums校验数据完整性
运行pg_checksums -c -D $PGDATA,该命令会检查所有数据块的校验和,确认是否存在损坏- 注意:必须在数据库关闭状态下才能执行此命令
- 查看日志中的恢复记录
检查崩溃恢复过程中是否有错误或警告(比如corrupted page),如果有,需要针对性修复对应的数据块
整合到你的同步修复流程
把检测逻辑加到现有代码中,流程大概如下:
- 检测备库是否不同步
- 检查备库的PostgreSQL关闭状态:
- 若为非正常关闭:
a. 启动备库,等待自动恢复完成
b. 正常关闭备库
c. 执行pg_checksums检查数据完整性
d. 数据无损坏的话,执行pg_rewind操作 - 若为正常关闭:直接执行pg_rewind操作
- 若为非正常关闭:
内容的提问来源于stack exchange,提问作者caffein
相关产品推荐
相关产品推荐

