从 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 之前需要做两件事
- 通过编辑 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
命令必须在与数据库超级用户 (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服务