Ubuntu下PostgreSQL连接问题排查与修复
一 快速自检
- 确认服务是否在运行:执行sudo systemctl status postgresql,若未运行则sudo systemctl start postgresql。
- 本地通过套接字连接:执行sudo -u postgres psql,能进入说明本地套接字与本地认证正常。
- 远程连接测试:从客户端执行psql -h <服务器IP> -p 5432 -U <用户> -d <库名>;若仅远程失败而本地正常,多为网络/监听/认证策略问题。
- 检查端口监听:执行ss -lntp | grep 5432,应看到0.0.0.0:5432或:::5432的监听;若仅看到127.0.0.1:5432,说明未对外监听。
- 查看日志定位:到**/var/log/postgresql/**查看对应实例日志,能直接指出配置、权限或启动失败原因。
二 常见错误与修复
-
错误1:psql: could not connect to server: No such file or directory(套接字文件缺失)
原因:服务未启动或unix_socket_directories配置目录与客户端默认查找目录不一致。
处理:
- 确认服务运行:sudo systemctl status postgresql;未运行则启动。
- 查找套接字:ls /tmp/.s.PGSQL.5432 或 ls /var/run/postgresql/.s.PGSQL.5432;若不存在,重启服务后再查。
- 若套接字在/tmp而客户端在找/var/run/postgresql,可做软链:
sudo ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432
- 也可在postgresql.conf中统一unix_socket_directories到/tmp或/var/run/postgresql,然后重启。
-
错误2:FATAL: no pg_hba.conf entry for host “…”, user “…”, database “…”, no encryption
原因:客户端IP未被pg_hba.conf允许或缺少加密设置。
处理:编辑**/etc/postgresql//main/pg_hba.conf**,在末尾按需添加(示例为允许某IP段使用密码认证):
host all all 192.168.1.0/24 md5
若使用较新客户端并启用了SSL,建议同时启用服务器端SSL(postgresql.conf):
ssl = on
ssl_cert_file = ‘server.crt’
ssl_key_file = ‘server.key’
修改后执行sudo systemctl reload postgresql使配置生效。
-
错误3:服务器仅监听127.0.0.1,远程连不通
原因:postgresql.conf中的listen_addresses未包含服务器IP或“”。
处理:编辑**/etc/postgresql//main/postgresql.conf**,设置:
listen_addresses = '’
保存后重启:sudo systemctl restart postgresql。
-
错误4:修改数据目录后无法启动或本地连接失败
原因:新目录权限/属主不正确或数据目录路径配置错误。
处理:
- 查看当前数据目录:sudo -u postgres psql -c “show data_directory;”
- 停止服务:sudo systemctl stop postgresql
- 迁移数据后修正权限(示例):
sudo chown -R postgres:postgres /new/data/dir
sudo chmod 700 /new/data/dir
- 在postgresql.conf中正确设置data_directory,再启动:sudo systemctl start postgresql。
三 远程访问完整配置清单
- 修改postgresql.conf:设置listen_addresses = ‘*’,必要时开启SSL。
- 修改pg_hba.conf:按需添加允许规则,例如:
host all all 0.0.0.0/0 md5(放行所有IPv4,生产环境请改为白名单网段)
- 防火墙放行:
- UFW:sudo ufw allow 5432/tcp
- iptables:sudo iptables -A INPUT -p tcp --dport 5432 -j ACCEPT
- 云服务器安全组:在控制台放行TCP 5432入站。
- 重启生效:sudo systemctl restart postgresql;从客户端测试连接。
四 仍无法连接时的定位技巧
- 查看服务与日志:
- 服务状态:sudo systemctl status postgresql
- 实例日志:/var/log/postgresql/postgresql--main.log(关注FATAL/ERROR行)
- 网络连通性:
- 端口可达:nc -vz <服务器IP> 5432 或 telnet <服务器IP> 5432
- 监听地址:ss -lntp | grep 5432
- 客户端侧:核对主机、端口、用户、密码、SSL设置;必要时用PGSSLMODE=require测试SSL连接。
- 若使用pgAdmin:同时检查其日志(如**/var/log/pgadmin/pgadmin4.log**)与连接配置。