postmaster

名称

postmaster — 运行 Postgres 多用户后端

语法

postmaster [ -B nBuffers ] [ -D DataDir ] [ -N maxBackends ] [ -S ]
    [ -d DebugLevel ] [ -i ] [ -l ]
    [ -o BackendOptions ] [ -p port ] [ -n | -s ]

输入

postmaster 接受下列命令行参数:
 
-B nBuffers
postmaster 为它启动的后端进程分配和管理的共享内存缓冲区数量。此值缺省为 64 个缓冲区,每个缓冲区是 8k 字节(或者 config.h 里设置的 BLCKSZ 大小)。
-D DataDir
声明用做数据库目录树的根的目录。如果没有给出 -D,缺省目录名是环境变量 PGDATA 的值。如果没有设置 PGDATA,那么使用的目录是 $POSTGRESHOME/data。如果两个环境变量和命令行选项都没有给出,用的缺省目录是编译时设置的。
-N maxBackends

此 postmaster 允许启动的后端服务器的最大数目。缺省配置时,该值为 32,如果你的系统能支持更多进程,该值最大可以设置为 1024。缺省值和最大值都可以在制作 Postgres 时修改(参阅 src/include/config.h)。
-S
指明 postmaster 进程将以安静模式启动。也就是说,它将与用户的(控制)tty 脱离并且启动其自身的进程组。这个选项不应和调试选项结合使用,因为向标准输出和标准错误打印的任何信息都被丢弃。

 

 
 
 
 
 
 
 

请注意使用这个开关会令除错非常困难,因为通常由这个 postmaster 和它生成的后代产生的跟踪和日志信息都将被丢弃.

-d DebugLevel
决定后端服务器将产生的调试信息输出的数量。如果 DebugLevel 是一,将跟踪所有联接动作,而对其它的一律忽略。对于级别二或更高,后端进程的调试被打开并且 postmaster 显示更多信息,包括后端环境和处理动作。注意如果没有给后端服务器声明他们的调试输出指向的文件,则输出会出现在它们的父postmaster 的控制 tty 上。
-i
这个选项打开 TCP/IP 或者网际域套接字通讯。没有这个选项,只能进行本地 Unix 域套接字通讯。

 
-l
这个选项打开 SSL 套接字通讯。同样还需要 -i 选项。要使用这个选项,编译时你必须打开了 SSL 选项。
-o BackendOptions
BackendOptions 里声明的 postgres 选项都传递给所有由这个 postmaster 启动的后端服务进程。如果选项字串包含任何空白,整个字串必须引起来。
-p port
声明 postmaster 侦听着等待连接的互联网 TCP/IP 端口或一个本地 Unix 域套接字文件扩展(描述符).缺省的端口号是环境变量 PGPORT 的值。如果没有设置 PGPORT,缺省是 Postgres 编译时建立的值(通常是 5432)。如果你声明了一个非缺省端口,那么所有前端应用(包括psql)都必须用命令行选项或者 PGPORT 声明同一个端口。
还有几个命令行选项用于在后端非正常退出时进行调试。这些选项用于在这种情况下控制postmaster,而且没有一个选项是为了用于正常操作的

用于这种状况的一般策略是通知所有其它后端必须退出,然后重新初始化共享内存和信号灯。这是因为一个出错的后端在退出前可能已经破坏了一些共享的状态。

这些特殊选项是:
 
-n

 

 
 
 
 
 
 
 

postmaster 将不会重新初始化共享数据结构。一个有经验的系统程序员这时就可以使用shmemdoc 程序检查共享内存和信号灯状态。

-s

 

 
 
 
 
 
 
 

postmaster 将通过发送信号 SIGSTOP 停止所有其他后端进程,但不会导致它们退出。这样就允许系统程序员手工从所有后端进程收集倾倒的核心(core dumps)。

输出

semget: No space left on device

 
如果你看到这条信息,你应该运行 ipcclean 命令。干完这个之后,试着重新启动 postmaster。如果还不行,你可能需要按照安装指导里描述的那样配置你的内核的共享内存和信号灯。如果你在一台主机上运行多个postmaster 实例,或者如果你的内核的共享内存和/或信号灯被限制得很小,你可能要重新配置你的内核以增加共享内存和信号灯参数。
小技巧:你也可以通过降低 -B 的参数以减少 Postgres 的共享内存的消耗,或者降低 -N 的参数减少 Postgres 的信号灯的消耗,以此可以推迟重新配置内核。
StreamServerPort: cannot bind to port

 

 
 
 
 
 
 
 

如果看到这样的信息,你应该确保没有其他的postmaster 进程正在运行。判断这个情况的最简单的办法是使用命令

% ps -ax | grep postmaster
(这是在 BSD 类型的系统上),或者
% ps -e | grep postmast
(这是在 System V 类型或者 POSIX 兼容的系统象 HP-UX 上)。

如果你确信没有其他 postmaster 进程在运行但是你还是收到这个错误信息,试着用 -p 选项声明一个不同的端口。如果你终止 postmaster 后又马上用同一个端口运行它,你也有可能得到这个错误信息;这时,你必须多等几秒,等操作系统关闭了该端口后再试。最后如果你使用了一个操作系统认为是保留的端口,也可能导致这个错误信息。例如,我的 Unix 版本认为低于 1024 的端口号是可信任的因而只有 Unix 超级用户可以使用它们。
 

IpcMemoryAttach: shmat() failed: Permission denied
一个可能的解释是另外一个用户企图在同一端口上运行一个postmaster 进程,该进程请求共享资源然后退出。因为 Postgres 的共享内存键是以赋予 postmaster 的端口号为基础的,因此在同一台主机上有好几个安装的话很有可能冲突。如果当前没有其他postmaster 进程正在运行(见上面),运行 ipcclean 然后再尝试一下。如果其他 postmaster 镜象正在运行,你就不得不与那些进程的所有者协调端口号的分配和/或删除未用的共享内存段。

描述

postmaster 管理前端和后端进程之间的通讯,还负责分配共享缓冲池和 SysV 信号灯(在没有测试和设置指令的机器上)。postmaster 本身并不与用户交互并且应该作为一个后台进程启动。

每个 Postgres 安装每次应该只启动一个 postmaster。这里,一个安装意味着一个数据库目录和postmaster 端口号。你可以在一台机器上运行多于一个 postmaster,前提是每个有不同的目录和端口号。

注意

如果有可能,不要使用 SIGKILL 杀死 postmaster。而应该使用 SIGHUPSIGINTSIGTERMkill(1)的缺省信号)。用
% kill -KILL
或者其可选形式
% kill -9
会阻止 postmaster 在退出前释放它持有的系统资源(例如共享内存和信号灯)。这样就无法让你免于处理上面描述的共享内存的问题。

处理共享内存问题的有用的工具包括 ipcs(1)ipcrm(1),和ipcclean(1)
 

用法

用缺省值启动 postmaster 键入:
% nohup postmaster >logfile 2>&1 &
这条命令将在缺省端口(5432)启动 postmaster。这是最简单和最常用的启动postmaster 的方法。

要在指定的端口启动 postmaster

% nohup postmaster -p 1234 &
这条命令将启动通过端口1234通讯的 postmaster。为了用 psql 与这个 postmaster 联接,你需要这样运行(psql):
% psql -p 1234
或者设置环境变量 PGPORT
% setenv PGPORT 1234
% psql