金蝶开发踩坑记:PostgreSQL 崩溃恢复失败的应急处理原创

所属产品:金蝶云·苍穹所属云/领域:环境运维金蝶开发踩坑记:PostgreSQL 崩溃恢复失败的应急处理原创

金蝶开发踩坑记:PostgreSQL 崩溃恢复失败的应急处理原创

HN_刘敏关注作者

10人赞赏了该文章 91次浏览 未经作者许可,禁止转载编辑于2026年03月03日 10:07:59

金蝶开发踩坑记:PostgreSQL 崩溃恢复失败的应急处理原创摘要

由AI智能服务提供

早上调试金蝶模块时,发现PostgreSQL服务启动后立即停止。排查日志发现,数据库非正常关闭且 WAL 日志损坏。使用 pg_resetwal 重置 WAL 日志后服务正常启动,提醒重要数据要定期备份,不要异常关闭电脑。

有用

反馈

问题:PostgreSQL 12 服务启动后立即停止,导致业务系统无法正常运行。

一、问题初现:服务启动即停止

早上打开电脑,准备调试金蝶相关模块时,发现依赖的 PostgreSQL 服务没有运行。于是我打开 Windows 服务管理器,手动启动postgresql-x64-12 - PostgreSQL Server 12,却立刻收到了系统提示:

本地计算机上的 postgresql-x64-12 – PostgreSQL Server 12 服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。

这种 “启动即停止” 的现象,通常意味着 PostgreSQL 在启动过程中遇到了致命错误,导致进程自我终止。

如下图:

金蝶开发踩坑记:PostgreSQL 崩溃恢复失败的应急处理原创

二、深入排查:从日志中寻找线索

遇到这种问题,最有效的方法就是查看数据库日志。PostgreSQL 的日志文件通常位于数据目录下的logpg_log文件夹中,我的数据目录是D:\postgresql\data\log,所以我找到了最新的日志文件postgresql-2026-03-03_090014.log

金蝶开发踩坑记:PostgreSQL 崩溃恢复失败的应急处理原创

从日志中可以清晰地看到几个关键信息:

  1. 非正常关闭:数据库系统没有正确关闭,处于自动恢复状态。这很可能是由于昨天(3 月 2 日)下午电脑意外断电或强制重启导致的。
  2. WAL 日志损坏:在执行redo恢复操作时,遇到了 “记录长度不合法” 的错误。这表明预写式日志(WAL)文件出现了损坏,导致数据库无法完成崩溃恢复,从而启动失败。三、果断决策:使用 pg_resetwal 重置 WAL 日志既然问题出在损坏的 WAL 日志上,我决定使用 PostgreSQL 自带的pg_resetwal工具来重置预写式日志。这个工具可以清除所有 WAL 日志,并重置控制文件,让数据库以一个 “干净” 的状态启动。但需要注意的是,这会丢失所有未写入数据文件的事务数据,因此是一个数据丢失风险的操作,必须谨慎使用。我打开命令行工具,切换到 PostgreSQL 的bin目录,执行了以下命令:金蝶开发踩坑记:PostgreSQL 崩溃恢复失败的应急处理原创四、成功恢复:服务正常启动重置 WAL 日志后,我再次回到 Windows 服务管理器,尝试启动 PostgreSQL 服务。这一次,服务成功启动并保持了运行状态!虽然pg_resetwal操作可能导致了少量未提交事务的数据丢失,但在紧急情况下,这是让数据库恢复可用的有效手段。金蝶开发踩坑记:PostgreSQL 崩溃恢复失败的应急处理原创金蝶开发踩坑记:PostgreSQL 崩溃恢复失败的应急处理原创

五:总结

  • PostgreSQL 启动失败,优先看日志,90% 问题日志里都写得很清楚。
  • 出现 “记录长度不合法”“redo 失败”,基本就是 WAL 日志损坏
  • pg_resetwal 是强力应急工具,能用但要谨慎。
  • 重要数据一定要定期备份,这才是最稳妥的保障。

最后切记,不要异常关闭电脑

这次 PostgreSQL 启动失败,直接原因就是电脑没有正常关闭,导致数据库在运行中被强制中断,WAL(预写日志)文件损坏,进而无法完成崩溃恢复。

财税知识

报价单分录添加二开字段携带至比价单(定标单)原创

2026-3-6 15:27:05

财税知识

openapi查询接口超时问题排查以及解决方案原创

2026-3-6 15:28:40

搜索