使用 pg_upgrade 时,Windows 上的 PostgresSQL 从 9.6 升级到 10 失败(fe_sendauth:未提供密码)

使用 pg_upgrade 时,Windows 上的 PostgresSQL 从 9.6 升级到 10 失败(fe_sendauth:未提供密码)

从 Windows 2012 迁移到 2019 的部分工作涉及将当前安装的 Postgres 从 9.6 升级到 10。我正在尝试使用 pg_upgrade,在对文件权限进行了一些调整后,我设法使用以下命令启动该过程

pg_upgrade.exe -b "c:/Program Files/PostgreSQL/9.6/bin" -B "d:/PostgreSQL/10/bin" -d "D:/PostgreSQL/9.6/data" -D "D:/PostgreSQL/10/data" --old-port=5432 --new-port=5433 -U postgres -v --check

开始很好,但过了一段时间就失败了,像这样

"d:/PostgreSQL/10/bin/pg_ctl" -w -l "pg_upgrade_server.log" -D "D:/PostgreSQL/10/data" -o "-p 5433 -b -c synchronous_commit=off -c fsync=off -c full_page_writes=off -c vacuum_defer_cleanup_age=0 " start >> "pg_upgrade_server_start.log" 2>&1

connection to database failed: fe_sendauth: no password supplied
could not connect to target postmaster started with the command:
"d:/PostgreSQL/10/bin/pg_ctl" -w -l "pg_upgrade_server.log" -D "D:/PostgreSQL/10/data" -o "-p 5433 -b -c synchronous_commit=off -c fsync=off -c full_page_writes=off -c vacuum_defer_cleanup_age=0 " start

但是如果我尝试单独运行该命令,它会顺利启动。我已更新文件,pg_hba.conf因此无需输入密码即可运行psql -U postgres -host 5433。除此之外,我在 pg_upgrade*.log 文件中找不到任何有价值的东西。

答案1

在 Windows 上,启动 pg_upgrade 之前需要做两件事

  1. 通过编辑 pg_hba.conf 启用“无密码”身份验证,替换 ipv4 和 v6 部分中的 md5 或其他任何信任方法
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
#host    all             all             127.0.0.1/32            md5
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
#host    all             all             ::1/128                 md5
host    all             all             ::1/128                 trust
  1. 命令必须在与数据库超级用户 (postgres) 相同的用户下运行

    创建本地用户 postgres 并授予他管理员权限。不要忘记授予两个数据库中 postgres\data 文件夹的完全控制权,然后以该用户身份运行 cmd.exe(以管理员身份)

最后,从 postgres 可以读取/写入日志文件的位置运行该命令

运行最新版本的 pg_upgrade。

你只需要这些参数

d:\PostgreSQL\10\bin\pg_upgrade.exe -b “c:\Program Files\PostgreSQL\9.6\bin” -B “d:\PostgreSQL\10\bin” -d “D:\PostgreSQL\9.6\data” -D “D:\PostgreSQL\10\data”

编辑:为了提高安全性,postgres 可以在没有管理员权限的情况下运行,但需要作为批处理作业和服务权限运行。步骤:

  • 停止 postgresql 服务
  • 创建本地或域用户
  • 添加用户到备份操作员组(或以批处理作业权限登录)
  • 编辑本地安全策略:安全设置->用户权限分配->作为服务登录(在此处添加您的用户)
  • 编辑服务登录用户并用专用用户替换系统
  • 更改 postgres 主目录的访问权限以允许您的用户读写。
  • 启动postgresql服务

相关内容