一、背景
本地 PostgreSQL 数据库的 用户密码未知,导致后台服务(RT)报错:
text
System.InvalidOperationException: "The Connection is not open."堆栈指向
PostgresqlDB.ExecuteReader,说明数据库连接失败。同时,项目配置文件里写的是
Password=your_password,但本地数据库密码不是这个,导致连接被拒绝。核心问题:下载的数据库自动跳过密码设置,导致密码随机生成,重新下载仍然不行。
数据库密码与配置文件不一致,需要重置本地密码。
二、具体思路(核心逻辑)
PostgreSQL 的密码认证由pg_hba.conf文件控制。默认情况下,本地连接使用md5认证,需要密码。如果密码未知,可以通过以下思路绕过:
核心思路:临时把认证方式改成trust(免密),无密码登录后,用ALTER USER修改密码,再把认证方式改回md5。
整个流程分五步:
改配置:把
pg_hba.conf里的md5改成trust重启服务:让配置生效
无密码登录:用
psql免密进入数据库改密码:执行
ALTER USER设置新密码恢复配置:把
trust改回md5,重启服务
为什么这样做?
不需要知道旧密码,直接绕过认证
改完后恢复安全配置,不影响生产环境
只影响本地连接,不影响远程
三、具体做法如下:(Windows 为例)
环境信息
操作系统:Windows 10/11
PostgreSQL 版本:9.5
安装路径:
C:\Program Files\PostgreSQL\9.5\数据目录:
C:\Program Files\PostgreSQL\9.5\data\
第一步:修改pg_hba.conf
文件位置:
text
C:\Program Files\PostgreSQL\9.5\data\pg_hba.conf
用管理员身份打开记事本(右键记事本 -> 以管理员身份运行 -> 文件 -> 打开)。
找到以下两行:
text
host all all 127.0.0.1/32 md5 host all all ::1/128 md5
把md5改成trust:
text
host all all 127.0.0.1/32 trust host all all ::1/128 trust
保存文件。
注意:
trust表示“本地连接免密”,仅用于临时重置密码。改完后必须恢复成md5。
第二步:重启 PostgreSQL 服务
方式一:用命令重启
打开 CMD,进入bin目录:
cmd
cd /d "C:\Program Files\PostgreSQL\9.5\bin"
执行:
cmd
pg_ctl restart -D "C:\Program Files\PostgreSQL\9.5\data"
方式二:用 Windows 服务管理器
按Win + R,输入services.msc,找到postgresql-x64-9.5,右键 -> 重启。
第三步:无密码登录数据库
在 CMD 中执行:
cmd
psql -U postgres -h localhost
因为pg_hba.conf已经改成trust,这次不会提示输入密码,直接进入:
text
postgres=#
注意:如果提示
fe_sendauth: no password supplied,说明pg_hba.conf没改对,或者服务没重启。
第四步:修改密码
在postgres=#提示符下执行:
sql
ALTER USER postgres WITH PASSWORD 'your_password';
说明:
换成你想要的密码(这里跟项目配置文件对齐)。
单引号必须是英文单引号。
分号
;不能少。
回车后,如果显示ALTER ROLE,说明修改成功。
退出 psql:
text
\q
第五步:恢复认证配置
再次用管理员身份打开pg_hba.conf,把刚才改的trust改回md5:
text
host all all 127.0.0.1/32 md5 host all all ::1/128 md5
保存文件。
重启 PostgreSQL 服务:
cmd
pg_ctl restart -D "C:\Program Files\PostgreSQL\9.5\data"
第六步:验证密码是否修改成功
在 CMD 中执行:
cmd
psql -U postgres -h localhost
这次会提示输入密码:
text
用户 postgres 的口令:
盲打 your_password(输入时不显示任何字符),回车。
成功进入your_password
=#→ 密码修改成功。提示
password authentication failed→ 密码没改成功,检查pg_hba.conf是否改对、服务是否重启。
四、 常见问题与踩坑记录
问题 1:
psql: 无法联接到服务器: Connection refused原因:PostgreSQL 服务没启动。
解决:执行pg_ctl start -D "C:\Program Files\PostgreSQL\9.5\data"。问题 2:
psql: fe_sendauth: no password supplied原因:
pg_hba.conf没改成trust,或者改完没重启服务。
解决:重新检查配置文件,重启服务。问题 3:
password authentication failed for user "your_password"原因:密码不对。
解决:重新走一遍trust绕过流程,用ALTER USER改密码。问题 4:改完密码后,RT 还是报
The Connection is not open原因:RT 的连接字符串里,数据库地址可能不是
localhost,而是内网 IP。
解决:去VceClusterRT项目的App.config里,确认ConnectionString里的Server=是什么。如果是内网 IP,说明 RT 连的是内网数据库,本地密码改了也没用。问题 5:
pg_ctl命令找不到原因:不在
bin目录下。
解决:先cd /d "C:\Program Files\PostgreSQL\9.5\bin",或者把bin目录加到系统环境变量 PATH 里。
核心口诀:
改 trust → 重启 → 免密登录 → ALTER USER → 改回 md5 → 重启 → 验证。
一句话总结:
PostgreSQL 忘记密码不可怕,通过临时调整pg_hba.conf的认证方式,可以无密码进入数据库重置密码。关键是改完必须恢复md5,否则数据库会处于无密码保护的危险状态