所属产品:金蝶云·苍穹所属云/领域:环境运维

10人赞赏了该文章 91次浏览 未经作者许可,禁止转载编辑于2026年03月03日 10:07:59
摘要
由AI智能服务提供
早上调试金蝶模块时,发现PostgreSQL服务启动后立即停止。排查日志发现,数据库非正常关闭且 WAL 日志损坏。使用 pg_resetwal 重置 WAL 日志后服务正常启动,提醒重要数据要定期备份,不要异常关闭电脑。
有用
反馈
问题:PostgreSQL 12 服务启动后立即停止,导致业务系统无法正常运行。
一、问题初现:服务启动即停止
早上打开电脑,准备调试金蝶相关模块时,发现依赖的 PostgreSQL 服务没有运行。于是我打开 Windows 服务管理器,手动启动postgresql-x64-12 - PostgreSQL Server 12,却立刻收到了系统提示:
本地计算机上的 postgresql-x64-12 – PostgreSQL Server 12 服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。
这种 “启动即停止” 的现象,通常意味着 PostgreSQL 在启动过程中遇到了致命错误,导致进程自我终止。
如下图:

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

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

五:总结
- PostgreSQL 启动失败,优先看日志,90% 问题日志里都写得很清楚。
- 出现 “记录长度不合法”“redo 失败”,基本就是 WAL 日志损坏。
pg_resetwal是强力应急工具,能用但要谨慎。- 重要数据一定要定期备份,这才是最稳妥的保障。
最后切记,不要异常关闭电脑
这次 PostgreSQL 启动失败,直接原因就是电脑没有正常关闭,导致数据库在运行中被强制中断,WAL(预写日志)文件损坏,进而无法完成崩溃恢复。

四、成功恢复:服务正常启动重置 WAL 日志后,我再次回到 Windows 服务管理器,尝试启动 PostgreSQL 服务。这一次,服务成功启动并保持了运行状态!虽然

