↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 15 / 14
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5
历史版本。 PostgreSQL 7.0 已结束支持。 请参阅 当前版本手册.

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 字节(或者在 src/include/config.h 中为 BLCKSZ 设置的值)。

-D DataDir

指定用作数据库目录树根的目录。如果没有给出 -D,默认的数据目录名是环境变量 PGDATA 的值。如果未设置 PGDATA,则使用的目录是 $POSTGRESHOME/data。如果两个环境变量都未设置且未指定这个命令行选项,则使用编译时设置的默认目录。

-N maxBackends

设置该 postmaster 允许启动的最大后端服务器进程数。默认值为 32,但只要你的系统支持那么多进程,最高可设为 1024。(注意 -B 至少要为 -N 的两倍,因此增大 -N 时也需要增大 -B。)-N 的默认值和上限都可以在构建 Postgres 时更改(见 src/include/config.h)。

-S

指定 postmaster 进程应以静默模式启动。也就是说,它将与用户的(控制)tty 脱离、建立自己的进程组,并把标准输出和标准错误重定向到 /dev/null。

注意,使用这个开关会使问题的排查变得非常困难,因为这个 postmaster 及其子后端正常情况下会产生的所有跟踪和日志输出都会被丢弃。

-d DebugLevel

决定后端服务器将产生的调试输出数量。如果 DebugLevel 为一,postmaster 将跟踪所有连接流量。二级及更高的级别会打开越来越多的来自后端进程的调试输出,postmaster 显示的信息也更多,包括后端环境和进程流量。注意,除非把 postmaster 的标准输出和标准错误重定向到日志文件,否则所有这些输出都会出现在 postmaster 的控制 tty 上。

-i

允许客户端通过 TCP/IP(Internet 域)连接。不使用这个选项时,只接受本地 Unix 域套接字连接。

-l

启用使用 SSL 的安全连接。还需要 -i 选项。你必须以启用 SSL 的方式编译才能使用这个选项。

-o BackendOptions

指定的 postgres 选项(BackendOptions)会传递给该 postmaster 启动的所有后端服务器进程。如果选项字符串包含空格,整个字符串必须加引号。

-p port

指定 postmaster 用来监听前端应用连接的 TCP/IP 端口或本地 Unix 域套接字文件扩展名。默认为 PGPORT 环境变量的值,如果未设置 PGPORT,则默认为编译 Postgres 时确定的值(通常为 5432)。如果你指定的不是默认端口,所有前端应用(包括 psql)都必须用命令行选项或 PGPORT 指定同一端口。

还有两个额外的命令行选项可用于调试导致后端异常死亡的问题。这些选项控制 postmaster 在这种情况下的行为,两个选项都不用于日常操作。

这种情况下的常规策略是通知所有其他后端必须终止,然后重新初始化共享内存和信号量。这是因为出错的后端在终止之前可能已经破坏了某些共享状态。

这些特殊情况的选项是:

-n

postmaster 不会重新初始化共享数据结构。有经验的系统程序员随后可以用调试器检查共享内存和信号量状态。

-s

postmaster 会通过发送信号 SIGSTOP 停止所有其他后端进程,但不会使它们终止。这让系统程序员可以手工收集所有后端进程的 core 转储。

输出

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 各有独立的目录和端口号时,才能在一台机器上运行多个 postmaster。

注解

如果完全可以避免,不要在杀死 postmaster 时使用 SIGKILL。应改用 SIGHUP、SIGINT 或 SIGTERM(kill(1) 的默认信号)。使用

% kill -KILL
   

或其等价形式

% kill -9
   

将阻止 postmaster 在消亡前释放它持有的系统资源(例如共享内存和信号量)。请改用 SIGTERM,以免不得不手工清理(如前所述)。

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

用法

要使用默认值启动 postmaster,键入:

% nohup postmaster >logfile 2>&1 &
   

这条命令将在默认端口(5432)上启动 postmaster。这是启动 postmaster 最简单、最常见的方式。

要用特定端口启动 postmaster:

% nohup postmaster -p 1234 &
   

这条命令将启动 postmaster 并通过端口 1234 通信。为了用 psql 连接这个 postmaster,你需要将它作为

% psql -p 1234
   

来运行,或者设置环境变量 PGPORT:

% setenv PGPORT 1234
% psql
   

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.