启动PGPOOL2报failed to create INET domain socket错误如何解决
PGPOOL2启动绑定套接字失败故障处理
故障现象
完成PGPOOL2所有配置后启动服务直接报错退出,前台执行pgpool -n获取的启动日志核心报错如下:
2022-06-20 18:48:40.344: main pid 33987: LOG: Setting up socket for 0.0.0.0:9999 2022-006-20 18:48:40.344: main pid 33987: FATAL: failed to create INET domain socket 2022-06-20 18:48:40.344: main pid 33987: DETAIL: bind on socket failed with error "Address already in use" 2022-06-20 18:48:40.347: main pid 33987: LOG: shutting down
报错指向服务绑定0.0.0.0:9999监听地址时触发FATAL错误,错误详情为地址已被占用,随后服务直接走关闭流程退出。
另外日志开头还有一行提示:reading status file: 1 th backend is set to down status,说明当前PGPOOL记录的1号后端数据库节点处于下线状态,后续服务恢复后需要额外检查该节点状态。
故障根因
PGPOOL2默认配置下会监听9999端口对外提供服务,当前服务器上已经有其他进程占用了9999端口,导致新启动的pgpool进程无法完成套接字绑定,启动失败。
排查操作
执行以下命令确认9999端口的占用进程:
# 两个命令二选一即可,优先使用ss ss -tulpn | grep :9999 netstat -tulpn | grep :9999
命令返回结果会直接展示占用端口的进程ID、进程名称,常见的占用原因有两种:
- 之前启动的pgpool进程异常退出,残留进程持续占用端口
- 服务器上部署的其他业务服务/代理程序配置了9999作为监听端口
修复方案
根据端口占用的实际场景选择对应处理方式:
- 残留pgpool进程占用
先执行以下命令清理所有残留pgpool进程:
清理完成后再次执行端口检查命令,如果没有返回9999端口的占用记录,说明端口已经释放,直接重新启动pgpool即可。如果pkill无法清理残留进程,拿到端口查询结果里的进程ID后,执行pkill pgpoolkill -9 进程ID强制终止即可。 - 其他业务服务占用9999端口
两种方案二选一:- 停止占用9999端口的非必要业务,释放端口后重启pgpool
- 修改PGPOOL配置文件
pgpool.conf中的port配置项,将监听端口改为一个未被占用的端口(比如5432、9998等),保存配置后重新启动pgpool。
注意:端口问题解决、pgpool正常启动后,记得检查日志里提到的处于down状态的1号后端节点,确认节点网络、PostgreSQL服务正常后,可通过
pcp_attach_node命令将节点重新加入集群。
内容的提问来源于stack exchange,提问作者Priyank Panchal
相关产品推荐
相关产品推荐

