客户端联接问题

一旦你有了一个正在运行的 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 (多字节编码)支持的客户端与一个编译时没有这个支持的服务器联接,就会看到这条信息.(客户端尝试告诉服务器它需要的字符集编码,但是服务器不知道该说些什么好.)如果这条信息让你觉得烦,那就用带着与服务器一样的选项编译的客户端.