当前位置: 首页 > news >正文

PostgreSQL安装后启动失败:connection timeout expired的解决方案

写在前面:
当 PostgreSQL 遭遇Connection Timeout Expired且服务无法启动时,真相往往藏在受损的配置文件与复杂的Windows权限中。本文将记录该问题的修复过程,旨在为同样遭遇‘服务启动后停止’困境的开发者提供一套标准化的技术闭环方案。

一、问题描述

PostgreSQL官网下载地址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

在部署 PostgreSQL17(尤其是修改了默认安装路径,如迁至F盘,笔者的安装位置为F:\postgreSQL)后,出现以下的报错:客户端(pgAdmin/DBeaver)连接时弹出Connection timeout expired,这意味着数据库根本没有监听端口。

点击Win+ R,输入“services.msc”,进入 Windows 服务管理器尝试手动启动PostgreSQL的服务(一般情况下找到的是postgresql-x64-17 - PostgreSQL Server 17,17是版本),右键服务点击启动。一般此时已经能够解决问题,但有时会出现报错:本地计算机上的xx服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止。

产生上述问题可能的原因:

原因一:配置文件遭到二进制损坏

在PostgreSQL安装位置(F:\postgreSQL)下找到data文件夹,找到postgresql.conf日志文件,打开看到都是乱码,内容非纯文本,可能是非正常关机、磁盘写入缓存错误,或者是安装在非系统盘(F盘)时,文件系统在初始化过程中发生了冲突。除此之外,PostgreSQL 引擎启动时会首先扫描这两个文件,一旦探测到非 ASCII/UTF-8 的非法字符,词法分析器(Lexer)就会直接报错并拒绝继续加载内存,导致服务闪退。

原因二:Windows 服务的权限隔离机制

PostgreSQL 服务并不是以“当前登录用户”运行的,而是默认使用Network Service当你data 目录放在非默认路径时,该文件夹往往继承了根目录的受限权限。如果Network Service账户没有对 Data 目录的完全控制权,它就无法创建临时的postmaster.pid锁文件,也无法读取被损坏的配置文件,最终导致“服务启动后立即停止”。

原因三:注册表 ImagePath 路径偏差

如果你在安装后手动移动过文件夹,或者重新初始化了 Data 目录,Windows 注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\下记录的启动指令可能依然指向旧的路径或错误的配置文件位置,导致服务虽然显示存在,但“查无此人”。

原因四:管理权限的“自我保护”协议

PostgreSQL 为了防止提权攻击,严禁以Administrator(管理员)身份直接运行主程序。如果你在管理员 CMD 中启动报错,那其实是数据库的安全防护机制在起作用,并非故障。

针对以上可能的原因,我们依次尝试不同的办法解决问题。

二、解决方案

1、重置环境

(方法一:保留数据)日志出现受损后,可以删掉data文件夹下的postgresql.conf日志文件,在安装地址下的share文件夹(F:\postgreSQL\share)找到postgresql.conf.sample文件并复制,重命名为postgresql.conf覆盖到data目录,同时手动清空postgresql.auto.conf中所有乱码内容,仅保留首行注释。

(方法二:全部重置)如果数据库刚安装且没有重要数据,直接删除data目录并重新初始化,在管理员模式下运行cmd(按下Win+R,输入cmd,按Ctrl + Shift + Enter运行),输入以下指令(根据你的实际安装路径调整):

"F:\postgreSQL\bin\initdb.exe" -D "F:\postgreSQL\data" -E UTF8 --locale=Chinese_China.936

前提是删除整个data文件夹,若未删除则会出现以下提示:

重置data文件夹成功如图所示:

(方法三:手动初始化数据库集群)当postgresql.conf和postgresql.auto.conf出现无法修复的乱码,或者手动替换模板后依然报底层错误时,最稳妥的方法是使用 PostgreSQL 自带的initdb工具重新生成整个数据目录。

若方法二失效的话,强烈建议为数据库数据单独指定一个目录,不要放在安装目录下,这里笔者在F盘根目录创建一个pgdata文件夹作为数据目录,以管理员身份运行cmd(按下Win+R,输入cmd,按Ctrl + Shift + Enter运行),输入以下指令(根据你的实际安装路径调整):

"F:\postgreSQL\bin\initdb.exe" F:\pgdata -U postgres -W -E UTF8 --locale=Chinese_China.936 -U postgres

参数解析:

  • -D "F:\pgdata":指定数据守护目录。将 Data 目录与程序目录(bin)分离(如放在非安装目录F:\pgdata),是运维规范中的好习惯,能有效避免升级覆盖风险。
  • -U postgres:显式指定数据库超级用户名为postgres。
  • -W:强制提示输入密码。如果不加这个参数,初始化后的postgres用户可能没有密码,导致后期配置pg_hba.conf时出现“信任连接”安全隐患。
  • -E UTF8:设定数据库簇的默认字符编码。对于中文开发环境,UTF8 是兼容性最好的选择,能彻底杜绝因编码不一致导致的“乱码”报错。
  • --locale=Chinese_China.936:设置操作系统的语言环境。这决定了数据库的排序规则(Collation)和日期格式,确保在处理中文排序时符合逻辑。

输入以上指令以后需要输入两遍新的超级用户密码(注意:这个密码输入的时候不会显示内容,不要反复输入!!)

成功如下图所示:

手动初始化F:\pgdata后,我们需要告诉 Windows:“请把这个目录作为一个服务运行”。继续在管理员权限下的cmd中输入以下命令:

"F:\postgreSQL\bin\pg_ctl.exe" register -N "PostgreSQL17new" -D "F:\pgdata" -w

参数解析:

  • register:告诉pg_ctl插件去操作 Windows 服务列表。
  • -N "PostgreSQL17new":指定服务名称(你可以自定义服务器名称,笔者设置为PostgreSQL17new)。
  • -D "F:\pgdata":核心参数,指向你刚刚初始化的数据目录。
  • -w:等待启动完成。

完成后不会返回任何内容,如下图所示:

但在服务中可以看到你新建的这个服务:

补充:

删除旧服务的方法,管理员权限下cmd输入以下指令,引号中填写的是需要删除的服务的名称:

sc delete "PostgreSQL15"

删除成功如下图所示:

2、打通权限

PostgreSQL 服务默认使用Network Service当你data 目录放在非默认路径时,该文件夹往往继承了根目录的受限权限,所以需要给data文件夹(或者是你新建的F:\pgdata文件夹)添加权限。

这里以data文件夹为例,F:\pgdata文件夹同样操作。右键data文件夹,选择“属性”,点击“安全”,在组或用户名中找到NETWORK SERVICE。

若没有NETWORK SERVICE用户,则点击下面的“编辑”,点击“添加”,在“输入对象名称来选择”中输入network service,点击“检查名称”,确保字母大写且加下划线后点击确定。

选择NETWORK SERVICE用户,在权限部分全部勾选,主要是勾选“完全控制”,点击确定。

最后进行递归应用,点击下面的“高级”。

勾线底部的“使用可从此对象继承的权限项目替换所有子对象的权限项目”,只有执行了这一步,内部的控制文件(pg_control)才能被服务正确读写,点击确定。

3、对齐路径

针对注册表ImagePath路径偏差,需要在注册表中修改。点击Win+R输入regedit打开注册表,跳转至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,找到你需要修改的服务postgresql-x64-17(安装数据库的服务),双击右侧的ImagePath,确保其数值数据的路径参数准确。正确示例:

"F:\postgreSQL\bin\pg_ctl.exe" runservice -N "postgresql-x64-17" -D "F:\postgreSQL\data"

如果是你新建的服务PostgreSQL17new以及新建的手动初始化数据库集群F:\pgdata,注意路径是否正确。正确示例:

"F:\postgreSQL\bin\pg_ctl.exe" runservice -N "PostgreSQL17new" -D "F:\pgdata" -w

修改后无需重启电脑,直接关闭注册表,在服务管理器里尝试启动。

打开服务,选择其中的服务postgresql-x64-17(安装数据库的服务)或者你新建的服务PostgreSQL17new,右键“属性”,选择“登录”,选择“此账户”。

点击右边的“浏览”,在在“输入对象名称来选择”中输入network service,点击“检查名称”,确保字母大写且加下划线后点击确定。

把密码和确认密码的内容都删除,点击确定。

现在右键服务点击“启动”即可正常启动服务,注意不要两个服务同时启动。

打开pgAdmin4,成功连接服务的数据库如图所示。

欢迎交流!🌹🌹


PostgreSQL安装后初始化失败:手动解决initdb与pg_ctl的实战指南-CSDN博客

本地计算机上的 postgresql 服务启动后停止解决方法_本地计算机 上的 postgresgl-x64-10 - postgresql server 10 -CSDN博客

postgresql启动故障【已解决】_本地计算机 上的 postgresql-x64-12-postgresql server 12 服务-CSDN博客

http://www.jsqmd.com/news/511863/

相关文章:

  • 聊聊漆爵微修,其市场推广能力、口碑和技术实力究竟怎么样 - 工业推荐榜
  • 探讨2026年杭州税务合规咨询公司,哪个品牌靠谱 - 工业设备
  • MySQL你了解多少?——基础速查
  • 6-Iodoacetamidofluorescein,73264-12-7用于蛋白质半胱氨酸定位标记
  • Godi baseentity等实现原理
  • OpenAI 打造桌面超级应用,能否打破 AI 工具使用困局?
  • 中望3D2026 工程图:三维点坐标统计表的标准流程
  • MySQL事务隔离级别
  • 杭州正规的税务合规服务公司费用大概多少钱 - 工业品网
  • Matlab Simulink下直驱永磁风电机组并网仿真模型详解:双PWM变流器控制策略及详细...
  • SPSS岭回归实战:从语法调用到结果解读全流程解析
  • 想通过gometa实现通用excel导出工具
  • 类目竞争加剧如何找到细分需求切入点
  • 解读高新企业代理记账机构,推荐几家杭州值得选的 - 工业品牌热点
  • 美胸-年美-造相Z-Turbo入门秘籍:写好描述词,让AI听懂你的想法
  • 中国地形地势分布+地貌矢量数据shp
  • 时域信道估计和时域信道均衡以及matlab代码手搓(注意是时域,后续讲ofdm相关的频域信道估计和均衡)
  • 聊聊2026年金杉木双筋直拼板ENF级板材厂家,哪家性价比高 - myqiye
  • 用Three.js+OrbitControls打造可旋转的3D中国地图:新手避坑指南
  • 百考通:AI赋能实践报告,智能生成优质内容,让实习总结高效又专业
  • 字符编码:从基础到实战的核心解析
  • 基于企微API与CRM对接,构建试听后的自动化跟进与转化SOP
  • 苹果 M5 系列 MacBook 发布,升级与选择的深度剖析
  • 讲讲甘肃万通汽修教育网址和学校地址,学新能源汽车价格如何 - mypinpai
  • 当大事件突然降临,普通人的第一反应往往是懵的
  • 【无人售货柜・RK+YOLO】篇 4:效果拉满!针对无人售货柜场景的 YOLO 模型优化技巧,解决 90% 的识别问题
  • Ant Table隐藏技巧:用reduce+sticky实现财务系统级合计行
  • 基于观测器的LOS制导结合反步法控制:无人船艇路径跟踪控制的Fossen模型在Matlab S...
  • BrowseComp-ZH:中文网络生态下大模型检索能力的极限挑战
  • 思阳GEO思考:3步破解搜索痛点,抢占AI优先推荐