Windows 2012服务器PostgreSQL备份批处理密码输入问题求助
哈哈,这问题一看就似曾相识!你4年前遇到的应该就是同一个核心错误——脚本里的变量名写错了,导致PostgreSQL的密码配置文件生成无效,所以才会弹出密码提示。
最关键的修复:修正pgpass.conf的变量名
看你脚本里生成pgpass.conf的这一行:
for %%a in (%PGPASS%) do (>"%PGPassFile%" echo %PG_HOST%:%PG_PORT%:%PRODDB%:%PGUSER%:%%~a)
你前面定义的是PGHOST和PGPORT(没有下划线),但这里却用了%PG_HOST%和%PG_PORT%——这俩变量根本没赋值,所以生成的pgpass.conf里主机和端口的位置是空的!PostgreSQL找不到匹配的认证规则,自然会弹出密码框要你输入。
把这行改成下面这样,变量名对应上:
for %%a in (%PGPASS%) do (>"%PGPassFile%" echo %PGHOST%:%PGPORT%:%PRODDB%:%PGUSER%:%%~a)
额外要检查的两个点
1. pgpass.conf的权限必须正确
PostgreSQL对这个密码文件的权限要求特别严:
- 文件必须在
%APPDATA%\postgresql\目录下(你的脚本已经设置对了) - 只能给当前执行脚本的用户读写权限,不能给其他用户(比如Everyone、管理员组)任何权限。如果权限不对,PostgreSQL会直接忽略这个文件,照样弹密码提示。
你可以右键pgpass.conf → 属性 → 安全 → 编辑,删掉所有非当前用户的权限条目,只保留当前用户的完全控制权限。
2. 确认pg_hba.conf的认证规则
检查PostgreSQL安装目录下data文件夹里的pg_hba.conf,确保针对localhost的条目认证方式是md5或者scram-sha-256(密码认证),如果是peer或ident,PostgreSQL会尝试用Windows用户身份认证,和pgpass无关,也会触发密码提示。
可选的小优化
脚本里还有个未定义的变量:IF not exist %BACKUPVER% (mkdir %BACKUPDES%\%BACKUPVER%)里的BACKUPVER没设置,会导致创建一个名为%BACKUPVER%的奇怪目录,建议要么补上这个变量的定义,要么删掉这行(如果不需要按版本分备份目录的话)。
修改完之后,先手动跑一遍脚本,然后打开%APPDATA%\postgresql\pgpass.conf确认内容是类似这样的:
localhost:5432:database_name:username:your_password
再执行备份,应该就不会弹密码提示了!
内容的提问来源于stack exchange,提问作者Gerhard Peters

