温馨提示×

Ubuntu上PostgreSQL如何进行故障排查

小樊
40
2025-11-21 03:38:54
栏目: 云计算

Ubuntu上PostgreSQL故障排查速查

一 快速定位流程

  • 确认服务状态:使用命令查看 PostgreSQL 是否运行,例如:sudo systemctl status postgresql 或 sudo service postgresql status。若未运行,优先查看服务启动日志以定位原因。
  • 区分连接类型:本地报错“No such file or directory”多与 Unix 域套接字有关;远程或 -h 指定主机时报错多与 TCP 端口 5432 有关。
  • 检查监听与端口:本地用 ss -lunpt | grep 5432 或 netstat -nlp | grep 5432 查看是否监听;远程用 nc -vz 目标IP 5432 或 telnet 测试连通性。
  • 核对日志:Ubuntu 常见日志路径为 /var/log/postgresql/,版本化目录如 /var/log/postgresql/12/main/;优先查看最新的 .log 文件获取 FATAL/ERROR 细节。

二 常见故障与修复

  • 本地套接字错误(Unix domain socket)

    • 现象:psql 报错“could not connect to server: No such file or directory/var/run/postgresql/.s.PGSQL.5432”。
    • 处理:
      1. 确认服务器确实在运行(systemctl status postgresql)。
      2. 查找实际套接字:ss -lunpx | grep postgres 或 netstat -lp --protocol=unix | grep postgres,常见路径为 /tmp/.s.PGSQL.5432/var/run/postgresql/.s.PGSQL.5432
      3. 若客户端默认目录与服务端不一致:
        • 连接时改用套接字目录:psql -h /tmp;或设置环境变量 PGHOST=/tmp。
        • 或创建软链接统一路径:sudo ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432。
      4. 第三方/自编译包常见套接字目录差异,优先统一为 Debian/Ubuntu 打包的 /var/run/postgresql
      5. 仍失败时,重启服务再试:sudo systemctl restart postgresql。
  • 远程连接失败(端口 5432)

    • 现象:psql -h 主机 -p 5432 失败或超时。
    • 处理:
      1. 服务端监听地址:编辑 postgresql.conf,确保 listen_addresses = ‘*’(或包含服务器IP),并确认端口为 5432
      2. 客户端连通性:在客户端执行 nc -vz 服务器IP 5432 或 telnet 服务器IP 5432;若不通,排查云安全组/本机防火墙(如 ufw/iptables)。
      3. 服务端防火墙:sudo ufw allow 5432/tcp 或按需配置 iptables。
      4. 访问权限:编辑 pg_hba.conf,为来源网段添加规则,例如:host all all 192.168.1.0/24 md5,然后执行 sudo systemctl reload postgresql 使配置生效。
  • 启动失败或 SSL 密钥权限错误

    • 现象:服务起不来,日志含 “private key file … ssl-cert-snakeoil.key has group or world access”。
    • 处理:修正密钥权限与属主,例如:
      sudo chown postgres:postgres /etc/ssl/private/ssl-cert-snakeoil.key
      sudo chmod 640 /etc/ssl/private/ssl-cert-snakeoil.key
      然后重启:sudo systemctl restart postgresql。
  • 数据目录/磁盘问题导致异常

    • 现象:日志出现 “could not read/write block … read only 0 of 8192 bytes”,常见于磁盘满或故障引发索引损坏。
    • 处理:
      1. 立刻释放/修复磁盘,确认文件系统可写。
      2. 以 postgres 用户登录,查询疑似损坏索引并重建:
        • 查损坏索引:grep -E “could not read block|could not write block” $PGDATA/log/*.log | awk -F"in file" ‘{print $2}’ | cut -d ‘:’ -f1 | tr -d ‘"’ | sort | uniq
        • 重建索引:reindex table 表名;(或 reindex index 索引名;)
      3. 重建完成后重启相关服务。

三 日志与性能分析

  • 日志路径与实时查看:Ubuntu 常见为 /var/log/postgresql/版本/main/,可用 tail -f /var/log/postgresql/12/main/postgresql-*.log 实时观察错误与慢查询。
  • 使用 pgbadger 生成报告:
    • 安装:sudo apt-get install pgbadger。
    • 分析:
      • 文本日志:pgbadger /var/log/postgresql/*.log -o report.html -j 8
      • CSV 日志:pgbadger -f csv /var/log/postgresql/*.csv -o report.html
    • 建议开启合理的 log_line_prefix,便于 pgbadger 解析与统计。

四 常用命令清单

  • 服务与进程:sudo systemctl status|restart|reload postgresql;ps -ef | grep postgres
  • 端口与套接字:ss -lunpt | grep 5432;ss -lunpx | grep postgres;netstat -nlp | grep 5432
  • 远程连通性:nc -vz 目标IP 5432;telnet 目标IP 5432
  • 客户端连接:psql -U 用户名 -h 主机 -p 端口 -d 数据库
  • 配置与权限:
    • postgresql.conf:listen_addresses、port
    • pg_hba.conf:host/ hostssl 规则
    • 使配置生效:sudo systemctl reload postgresql
  • 日志与报告:tail -f /var/log/postgresql/12/main/*.log;pgbadger …

0