You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

log_hostname=off时client_hostname仍被填充的原因排查

问题排查与解决方案

1. 确认连接是否为参数生效后建立的新连接

PostgreSQL重启后所有旧连接会被强制断开,但客户端(如pgAdmin、应用连接池)可能在重启后快速重建连接,你需要验证这些连接的创建时间是否晚于PostgreSQL重启时间:

SELECT pid, client_hostname, backend_start, now() - backend_start AS connection_age
FROM pg_stat_activity
WHERE pid != pg_backend_pid(); -- 排除当前查询的连接

若连接的backend_start早于重启时间,说明是异常残留的旧连接,可手动断开:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE backend_start < '你的PostgreSQL重启时间'::timestamp;

2. 彻底验证log_hostname参数的生效范围

用以下SQL查看参数的实际值与来源,确保全局配置未被会话级设置覆盖:

SELECT name, setting, source, sourcefile, sourceline
FROM pg_settings
WHERE name = 'log_hostname';
  • 若source显示为session,说明当前会话被手动设置了log_hostname=on,需检查客户端连接时是否传递了自定义参数(比如pgAdmin的连接配置)。
  • 若source是postgresql.conf,确认sourcefile指向你修改的配置文件,且sourceline对应的行确实是log_hostname=off。

3. 检查连接类型是否为Unix域套接字

对于本地Unix域套接字连接(未使用IP),client_addr字段为空,部分PostgreSQL版本会在client_hostname显示本地主机名,这不属于log_hostname参数控制的范围。可通过以下SQL区分连接类型:

SELECT pid, client_addr, client_hostname, conninfo
FROM pg_stat_activity
WHERE pid != pg_backend_pid();

4. 排除系统级DNS静态映射干扰

操作系统的/etc/hosts(Linux)或C:\Windows\System32\drivers\etc\hosts(Windows)若存在客户端IP的静态映射,少数情况下PostgreSQL会读取该值,即使log_hostname=off。可通过系统命令验证:

# Linux
dig -x 客户端IP地址
cat /etc/hosts | grep 客户端IP地址

# Windows
nslookup 客户端IP地址
type C:\Windows\System32\drivers\etc\hosts | findstr 客户端IP地址

5. 核对对应PostgreSQL版本的文档逻辑

不同版本的client_hostname处理逻辑可能有差异,执行SELECT version();获取版本号,确认该版本的官方文档中client_hostname的生成规则是否与你查阅的内容一致。


内容的提问来源于stack exchange,提问作者Youlounn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:18:13