PostgreSQL 15升级至16:客户端切换成功但服务器升级失败求助
PostgreSQL 15 升级至 16 故障排查方案
核心问题定位
当前pg_upgrade失败的直接原因是PostgreSQL 15 源集群无法临时启动,导致无法通过套接字连接完成一致性检查。以下是分步排查与解决步骤:
1. 手动验证 PostgreSQL 15 实例启动能力
先单独启动15版本实例,获取具体启动失败日志,这是排查的关键:
su - postgres -c "/usr/pgsql-15/bin/pg_ctl start -D /var/lib/pgsql/15/data/ -l /tmp/pg15_start.log"
查看日志文件/tmp/pg15_start.log,里面会包含pg_ctl无法启动服务器的具体原因(比如配置错误、权限问题、文件损坏等)。
2. 检查目录权限与配置
- 数据目录权限:确保15版本数据目录权限正确,postgres用户需拥有完整读写权限:
ls -ld /var/lib/pgsql/15/data/ # 正常权限应为 drwx------ postgres postgres - 套接字目录配置:查看15版本
postgresql.conf中的unix_socket_directories参数,确认是否包含/var/lib/pgsql(错误提示的套接字创建目录):
若参数值不包含该目录,可临时修改为grep unix_socket_directories /var/lib/pgsql/15/data/postgresql.confunix_socket_directories = '/var/lib/pgsql',再尝试启动实例。 - 端口占用检查:确认错误中的50432端口未被其他进程占用:
ss -tulpn | grep 50432
3. 修正pg_upgrade命令参数
确保命令中使用绝对路径,避免相对路径导致的目录识别错误:
/usr/pgsql-16/bin/pg_upgrade \ -b /usr/pgsql-15/bin/ \ -d /var/lib/pgsql/15/data/ \ -B /usr/pgsql-16/bin/ \ -D /var/lib/pgsql/16/data/
同时确认-b和-B指向的二进制目录下,pg_ctl、postgres等文件存在且可执行。
4. SELinux 与磁盘空间排查
- SELinux 临时验证:若当前SELinux为Enforcing状态,临时关闭后重试启动:
若实例能正常启动,后续需恢复SELinux并调整策略:setenforce 0restorecon -R /var/lib/pgsql/ setenforce 1 - 磁盘空间检查:确保
/var/lib/pgsql所在磁盘有足够空间(至少与15版本数据目录大小相当):df -h /var/lib/pgsql/
内容的提问来源于stack exchange,提问作者paul runner
相关产品推荐
相关产品推荐

