第三十二章. 错误分析

内容
Postmaster 启动失败
客货端联接问题
调试信息

Postmaster 启动失败

有几个常见的原因会导致 postmaster 启动失败。检查 postmaster 的日志文件,或者手工启动它(不把标准输出或标准错误重定向)看看出现什么样的抱怨信息。有些可能的错误信息可以自解释,但是有些不能:
FATAL: StreamServerPort: bind() failed: Address already in use
        Is another postmaster already running on that port?
这里通常意味着它实际推测的:你不小心在同样的端口上启动了第二个 postmaster,而这时已经有一个在运行了。不过,如果核心错误信息不是"Address already in use"(地址已被使用)或者其他类似的意思的信息,那就有可能是一个不同的问题。例如,试着在一个保留的端口上运行 postmaster 可能出现象下面这样的信息:
$ postmaster -i -p 666
FATAL: StreamServerPort: bind() failed: Permission denied
        Is another postmaster already running on that port?
IpcMemoryCreate: shmget failed (Invalid argument) key=5440001, size=83918612, permission=600
FATAL 1:  ShmemCreate: cannot create region
这样的信息可能意味着你的核心对的共享内存区大小的限制小于 Postgres 试着创建的缓冲区大小。(或者也可能是你根本没有在核心里配置支持 SysV 风格的共享内存。)作为一个临时解决办法,你可以试着用一个小于正常数量的缓冲区数目(-B开关)启动。不过,最终你还是会希望重新配置你的核心以增加可用共享内存的大小。如果试图在同一台机器上启动多个 postmaster,而他们对空间的总需求超过了核心的限制,你也可能看到这条信息。
IpcSemaphoreCreate: semget failed (No space left on device) key=5440026, num=16, permission=600
一条这样的信息并不意味着你缺乏磁盘空间;它意味着你的核心对 SysV 信号灯的限制比 Postgres 想创建的少。如上所述,你可以通过减少信号灯数目启动 postmaster 来绕开这个问题(-N 开关),但是最终你还是会希望提高核心的限制。