客户端联接问题
一旦你有了一个正在运行的 postmaster,用客户端应用试着联接它失败的原因可能有很多种。这里显示的样例错误信息是以最近版本的
libpq 为基础的,以其他接口库为基础的客户端可能生成其它的或多或少的信息。
connectDB() -- connect() failed: Connection refused
Is the postmaster running (with -i) at 'server.joe.com' and accepting connections on TCP/IP port '5432'?
这是常见的"我找不到一个可交谈的 postmaster "错误。当试图用 TCP/IP 通讯时看起来想上面那样,或者用
Unix 套接字与本地 postmaster 通讯时象下面这样:
connectDB() -- connect() failed: No such file or directory
Is the postmaster running at 'localhost' and accepting connections on Unix socket '5432'?
最后一行对校验客户端应该向哪里联接很有帮助。如果实际上没有 postmaster 在运行,核心错误信息很可能会是
"Connection refused" 或者 "No such file or directory",就象上面描述的那样。(在这里,理解在这个环境里
"Connection refused" 并
不意味着 postmaster 收到你的联接请求然后拒绝了它
--- 那种情况会产生一条不同的信息,下面会介绍。)其他错误信息,如 "Connection
timed out"可能表示更基本的问题,好象缺乏网络联接等。
No pg_hba.conf entry for host 123.123.123.123, user joeblow, database testdb
这样的信息最有可能出现在你成功地与 postmaster 进行了联接,但是人家不愿意理你。如该信息推测的那样,postmaster
因为在它的 pg_hba.conf 配置文件里找不到认证信息而拒绝联接请求。
Password authentication failed for user 'joeblow'
这样的信息表明你与 postmaster 联接上了,并且她愿意理你,但是你必须先通过在
pg_hba.conf 文件里声明的认证方法。检查你提供的口令,或者检查你的 Kerberos
或 IDENT 软件 --- 如果抱怨信息提到了那些认证类型之一。
FATAL 1: SetUserId: user 'joeblow' is not in 'pg_shadow'
这是认证失败的另一个变种:对给出的用户名没有执行一条 Postgres create_user
命令。
FATAL 1: Database testdb does not exist in pg_database
在这个 postmaster 控制范围内没有叫这个名字的数据库。要注意如果你不声明数据库名,缺省是你的
Postgres 用户名,有可能不是正确的(数据库)名称。
NOTICE: Unrecognized variable client_encoding
这不是个错误,实际上它相当无害.如果你使用一个编译时带 MULTIBYTE (多字节编码)支持的客户端与一个编译时没有这个支持的服务器联接,就会看到这条信息.(客户端尝试告诉服务器它需要的字符集编码,但是服务器不知道该说些什么好.)如果这条信息让你觉得烦,那就用带着与服务器一样的选项编译的客户端.