有几个非常常见的原因会导致服务器启动失败。通过检查服务器日志或者使用手工启动的方法
(不做 stdout 和 stderr 的重定向),就可以看到错误消息。下面我们更详细地解释了其中一些错误消息。
LOG: could not bind IPv4 socket: Address already in use
HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
FATAL: could not create TCP/IP listen socket
就像它提示的那样:你试图在已经有一个服务器运行着的端口上再运行了一个服务器。不过,
如果内核的错误消息不是Address already in use或者是其它的变种,
那就有可能是别的毛病。比如,试图在一个保留的端口上运行服务器会收到下面这样的信息:$ postgres -p 666
LOG: could not bind IPv4 socket: Permission denied
HINT: Is another postmaster already running on port 666? If not, wait a few seconds and retry.
FATAL: could not create TCP/IP listen socket
像这样的信息:FATAL: could not create shared memory segment: Invalid argument
DETAIL: Failed system call was shmget(key=5440001, size=4011376640, 03600).
可能意味着内核对共享内存区的限制小于PostgreSQL试图分配的缓冲区大小
(本例中是 4011376640 字节)。或者可能意味着你根本就没有配置 System-V 风格的共享内存支持。
作为一个临时的解决办法,你可以试着以小于正常数量的缓冲区数(shared_buffers)
启动服务器。你最终还是会希望重新配置内核,以增加共享内存的尺寸。
如果你试图在同一台机器上启动多个服务器,而且它们所需的总空间超过了内核的限制,也会报这个错。
像下面这样的错误:FATAL: could not create semaphores: No space left on device
DETAIL: Failed system call was semget(5440126, 17, 03600).
并不意味着着你已经用光磁盘空间了。它的意思是内核的
System V信号灯的限制小于PostgreSQL想创建的数量。
和上面一样,你可以通过减少允许的连接数(max_connections)来绕开,
但最终你还是会希望修改内核的限制。
如果你收到一个"illegal system call"错误,那么很有可能是内核根本不支持共享内存或者信号灯。
如果是这样的话,你唯一的选择就是重新配置内核并且把这些特性打开。
关于配置系统System V IPC资源的细节见第 17.4.1 节。