温馨提示×

PostgreSQL在Ubuntu上的故障排查步骤是什么

小樊
33
2025-11-23 02:43:52
栏目: 云计算

Ubuntu 上 PostgreSQL 故障排查步骤

一 快速定位与通用检查

  • 确认服务状态与版本:使用命令查看 PostgreSQL 是否运行、是否启用开机自启,以及实际运行的版本与实例名(如 15-main)。
    示例:sudo systemctl status postgresqlsudo systemctl is-enabled postgresqlpg_lsclusters
  • 查看日志:优先查看 PostgreSQL 集群日志与系统日志,定位启动失败、权限、端口占用等根因。
    示例:sudo tail -n50 /var/log/postgresql/postgresql-15-main.logsudo journalctl -u postgresql@15-main -b
  • 端口与进程:确认 5432 端口是否被监听、是否被其他进程占用。
    示例:ss -lntp | grep 5432sudo lsof -iTCP:5432 -sTCP:LISTEN
  • 本地套接字:若本地连接报 “No such file or directory”,检查套接字文件(如 /var/run/postgresql/.s.PGSQL.5432/tmp/.s.PGSQL.5432)是否存在,以及客户端连接时使用的目录是否与服务器配置一致。
  • 防火墙与云安全组:确保 UFW/iptables 放行 5432/tcp,以及云上实例的安全组规则允许来源 IP 访问。
    示例:sudo ufw allow 5432/tcp

二 常见故障与修复对照表

症状 关键检查 修复建议
服务启动失败,状态显示 failed journalctl -u postgresql@15-main/var/log/postgresql/*.log 依据日志逐项修复(如权限、配置、数据目录)
本地 psql 报 “No such file or directory” 套接字路径:/var/run/postgresql/.s.PGSQL.5432 或 /tmp/.s.PGSQL.5432 确认服务器实际创建的套接字目录,使用 psql -h /var/run/postgresql 指定目录,或创建符号链接统一路径
FATAL: private key file 权限错误 /etc/ssl/private/ssl-cert-snakeoil.key 权限与属主 执行:sudo chown postgres:postgres /etc/ssl/private/ssl-cert-snakeoil.key && sudo chmod 640 /etc/ssl/private/ssl-cert-snakeoil.key
端口被占用 `ss -lntp grep 5432`
远程连接被拒绝或超时 listen_addressespg_hba.conf、防火墙 设置 listen_addresses='*',在 pg_hba.conf 增加 host all all 0.0.0.0/0 md5(按需收紧),并放行 5432/tcp
启动日志提示数据目录不可访问或 PID 文件无法创建 数据目录挂载、权限、/run 临时目录 确认挂载已就绪、目录属主为 postgres:postgres,必要时调整挂载顺序或 systemd 启动依赖
FATAL: could not create semaphores 系统信号量不足 调大内核参数(如 kernel.sem),或减少 max_connections

三 远程连接专项排查

  • 服务器端配置:
    • postgresql.conf:listen_addresses = '*'(或指定服务器 IP),port = 5432
    • pg_hba.conf:按需添加规则,例如允许某网段或所有主机使用口令认证:
      • 示例:host all all 192.168.1.0/24 md5host all all 0.0.0.0/0 md5(生产环境请限制来源)。
  • 网络与安全:
    • 防火墙放行:sudo ufw allow 5432/tcp;如使用云服务器,同步放通安全组入站规则。
    • 避免仅开放回环地址(127.0.0.1)导致外网无法连接。
  • 客户端验证:
    • 从远程主机测试:psql -h <服务器IP> -p 5432 -U <用户> -d <库名>
    • 若报 “no pg_hba.conf entry …”,说明 pg_hba.conf 未允许该来源;若超时,多为网络/防火墙问题。

四 启动依赖与系统资源问题

  • 外置存储或慢速设备导致启动过早失败:
    • 现象:systemctl status 显示 Result: protocol,日志提示数据目录不可访问或 PID 文件无法创建。
    • 处理:为实例添加启动延迟,例如创建 drop-in 配置:
      • sudo mkdir -p /etc/systemd/system/postgresql@15-main.service.d
      • sudo tee /etc/systemd/system/postgresql@15-main.service.d/override.conf <<'EOF'
        [Service]
        ExecStartPre=/bin/sleep 5
        EOF
      • sudo systemctl daemon-reload && sudo reboot
  • 信号量不足导致无法启动:
    • 现象:日志出现 “FATAL: could not create semaphores: No space left on device”。
    • 处理:调高内核 kernel.sem(如 sysctl -w kernel.sem="250 32000 100 128"),或减少 max_connections 以降低信号量占用。

五 最小复现与验证清单

  • 本地连通性:sudo -u postgres psql -c "select version();"(能连说明服务与本地套接字正常)。
  • 远程连通性:psql -h <IP> -p 5432 -U <user> -d postgres(能连说明网络、防火墙、listen_addresses、pg_hba 正常)。
  • 端口监听:ss -lntp | grep 5432 应看到 postgres 进程监听 0.0.0.0:5432*:5432
  • 日志干净:最近启动无 FATAL/ERROR,仅见正常启动与连接日志。
  • 配置热加载:修改 postgresql.conf/pg_hba.conf 后优先执行 sudo systemctl reload postgresql,减少业务中断。

0