pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
postmaster — 运行 Postgres 多用户后端
postmaster [ -BnBuffers] [ -DDataDir] [ -i ] postmaster [ -BnBuffers] [ -DDataDir] [ -NnBackends] [ -S ] [ -d [DebugLevel] [ -i ] [ -oBackendOptions] [ -pport] postmaster [ -n | -s ] ...
postmaster 接受下列命令行参数:
nBufferspostmaster 为它启动的后端服务器进程分配和管理的 共享内存缓冲区数量。该值默认为 64 个缓冲区, 每个缓冲区为 8k 字节(或者在 config.h 中为 BLCKSZ 设置的值)。
DataDir指定用作数据库目录树根的 目录。如果没有给出 -D,默认的数据目录名是 环境变量 PGDATA 的值。如果未设置 PGDATA,则使用的目录是 $POSTGRESHOME/data。 如果两个环境变量都未设置且未指定这个 命令行选项,则使用编译时设置的 默认目录。
nBackends该 postmaster 允许启动的最大 后端服务器进程数。在默认配置中,该值 通常设为 32,只要你的系统支持 那么多进程,最高可设为 1024。默认值和上限都 可以在构建 Postgres 时更改 (见 src/include/config.h)。
指定 postmaster 进程应以静默模式启动。也就是说,它将与 用户的(控制)tty 脱离并建立自己的进程组。 不应把这个选项与调试选项组合使用,因为 打印到标准输出和标准错误的任何消息 都会被丢弃。
DebugLevel ]可选参数 DebugLevel 决定后端服务器将产生的调试输出 数量。 如果 DebugLevel 为一,postmaster 将跟踪所有连接流量, 仅此而已。 对于二级及更高的级别, 后端进程中会打开调试,postmaster 显示的信息也更多, 包括后端环境和进程流量。 注意,如果没有为后端服务器指定 发送调试输出的文件,这些输出就会出现在 其父 postmaster 的 控制 tty 上。
这个选项启用 TCP/IP 或 Internet 域套接字通信。 不使用这个选项时,只能进行本地 Unix 域套接字通信。
BackendOptions指定的 postgres 选项(BackendOptions) 会传递给该 postmaster 启动的所有后端服务器进程。 如果选项字符串包含空格,整个字符串 必须加引号。
port指定 postmaster 用来监听前端应用连接的 TCP/IP 端口或本地 Unix 域套接字文件扩展名。默认为 PGPORT 环境变量的值,如果未设置 PGPORT, 则默认为编译 Postgres 时确定的值(通常为 5432)。如果你指定的不是默认端口, 所有前端应用(包括 psql)都必须用 命令行选项或 PGPORT 指定同一端口。
在后端异常死亡的情况下, 有几个命令行选项可用于调试。 这些选项控制 postmaster 在这种情况下 的行为,两个选项都不用于 日常操作。
这种情况下的常规策略是通知所有其他 后端必须终止,然后重新初始化共享 内存和信号量。这是因为出错的后端在 终止之前可能已经破坏了某些共享状态。
这些特殊情况的选项是:
postmaster 不会重新初始化共享数据结构。有经验的系统 程序员随后可以用 shmemdoc 程序检查共享内存和信号量状态。
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 在消亡前释放它持有的系统资源(例如共享内存和信号量)。 改用其他信号可以让你免去处理前述共享内存问题的麻烦。
处理共享内存问题的有用工具包括 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
.
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。