postmaster
postmaster — PostgreSQL多用户数据库服务器
大纲
postmaster [-A [0] | [1] ] [-B nbuffers] [-c name=value] [-d debug-level] [-D datadir] [-F] [-h hostname] [-i] [-k directory] [-l] [-N max-connections] [-o extra-options] [-p port] [-S] [--name=value] [[-n] | [-s]]
描述
postmaster是PostgreSQL多用户数据库服务器。客户端应用要访问数据库时,会(通过网络或本地)连接到一个正在运行的
postmaster。该
postmaster随后会启动一个独立的服务器进程(“postgres”)来处理该连接。postmaster还负责管理各服务器进程之间的通信。
默认情况下,postmaster在前台启动,并将日志消息打印到标准错误流。在实际应用中,postmaster
应作为后台进程启动,例如在系统启动时启动。
一个 postmaster 总是恰好管理一个数据库集群的数据。数据库集群是存储在公共文件系统位置上的一组数据库的集合。postmaster 启动时需要知道数据库集群文件(“数据区”)的位置。这通过 -D 调用选项或
PGDATA 环境变量完成;没有默认值。一个系统上可以同时运行多个 postmaster 进程,只要它们使用不同的数据区和不同的通信端口(见下文)。数据区用initdb创建。
选项
postmaster 接受下列命令行参数。关于这些选项的详细讨论请查阅第 16.4 节。通过设置配置文件,大多数这样的选项还可以省去重复输入。
-A 0|1启用运行时断言检查,这是一种检测编程错误的调试辅助手段。只有在编译时启用了它才可用。如果是这样,默认为开启。
-Bnbuffers设置服务器进程使用的共享缓冲区数量。该值默认为 64 个缓冲区,每个缓冲区为 8 kB。
-cname=value设置一个命名的运行时参数。列表和描述请查阅第 16.4 节。大多数其他命令行选项实际上是这种参数赋值的简短形式。
-c可以出现多次以设置多个参数。-ddebug-level设置调试级别。该值设得越高,写入服务器日志的调试输出就越多。取值范围是 1 到 5。
-Ddatadir指定数据目录的文件系统位置。见上面的讨论。
-F为了改进性能而禁用
fsync调用,代价是系统崩溃时可能发生数据损坏。这个选项对应于在postgresql.conf中设置fsync=false。使用前请阅读详细的文档!--fsync=true的效果与此选项相反。-hhostname指定
postmaster用来监听客户端应用连接的 IP 主机名或地址。默认监听所有已配置的地址(包括 localhost)。-i允许客户端通过 TCP/IP(Internet 域)连接。不使用这个选项时,只接受本地 Unix 域套接字连接。这个选项对应于在
postgresql.conf中设置tcpip_socket=true。--tcpip-socket=false的效果与此选项相反。-kdirectory指定
postmaster监听来自客户端应用连接的 Unix 域套接字的目录。默认通常是/tmp,但可以在构建时更改。-l启用使用 SSL 的安全连接。还需要
-i选项。你必须以启用 SSL 的方式编译才能使用这个选项。-Nmax-connections设置这个
postmaster可接受的最大客户端连接数。默认值为 32,但可以设置到你的系统所支持的程度。(注意-B至少要为-N的两倍。关于大量客户端连接的系统资源需求的讨论见第 16.5 节。)-oextra-options在
extra-options中指定的命令行形式选项,会传给由这个postmaster启动的所有服务器进程。可能的选项见postgres。如果选项字符串中包含空格,整个字符串必须加引号。-pport指定
postmaster用来侦听客户端应用连接的 TCP/IP 端口或本地 Unix 域套接字文件扩展名。默认值取自PGPORT环境变量;如果PGPORT未设置,则默认值就是在编译期间确定的值(通常为 5432)。如果你指定了非默认端口,那么所有客户端应用都必须通过命令行选项或PGPORT指定相同的端口。-S指定
postmaster进程应以静默模式启动。也就是说,它将脱离用户的(控制)终端,启动自己的进程组,并把标准输出和标准错误重定向到/dev/null。使用该开关会丢弃所有日志输出,这很可能不是你想要的,因为它会使问题排查变得非常困难。在后台启动
postmaster的更好方法见下文。--silent-mode=false与该选项的效果相反。--name=value设置一个命名的运行时参数;这是
-c的较短形式。
还有两个附加的命令行选项可用于调试导致服务器进程异常终止的问题。在这种情况下,通常的策略是通知所有其他服务器进程必须终止,然后重新初始化共享内存和信号量。这是因为出错的服务器进程可能在终止前破坏了某些共享状态。这些选项用来选择
postmaster在这种情况下的一些替代行为。这两个选项都不适用于普通操作。
这些特殊情况选项是:
-npostmaster将不重新初始化共享数据结构。经验丰富的系统程序员随后可以使用调试器检查共享内存和信号量的状态。-spostmaster将通过发送SIGSTOP信号暂停所有其他服务器进程,但不使它们终止。这允许系统程序员手工收集所有服务器进程的核心转储。
环境
PGCLIENTENCODING客户端使用的默认字符编码。(客户端可以单独覆盖它。)该值也可以在配置文件中设置。
PGDATA默认的数据目录位置
PGDATESTYLEDATESTYLE运行时参数的默认值。(不推荐使用这个环境变量。)PGPORT默认端口(最好在配置文件中设置)
TZ服务器时区。
- others
其他环境变量可用来指定备选的数据存储位置。更多信息见第 18.5 节。
诊断
提到semget或
shmget的失败消息,很可能表明你需要配置内核,以提供足够的共享内存和信号量。更多讨论见第 16.5 节。
提示
通过减小 shared_buffers 来降低
PostgreSQL 的共享内存消耗,和/或减小 max_connections 来降低信号量消耗,你可能可以推迟重新配置内核。
表明另一个 postmaster 已经在运行的失败消息应仔细检查,例如可根据你的系统使用下面的命令:
$ps ax | grep postmaster
或
$ps -ef | grep postmaster
如果你确信没有冲突的 postmaster 在运行,可以删除消息中提到的锁文件,然后重试。
指示无法绑定到某个端口的失败消息可能表示该端口已被某个非 PostgreSQL 进程占用。如果你终止了 postmaster
然后立即用同一端口重启,也可能得到这个错误;这种情况下,只需等待几秒直到操作系统关闭该端口再重试。最后,如果你指定的端口号被操作系统视为保留端口,也可能得到这个错误。例如,许多版本的 Unix 认为 1024 以下的端口号是“受信任的”,只允许 Unix 超级用户访问它们。
注解
只要有可能,就不要使用
SIGKILL杀死
postmaster。这样会阻止
postmaster在终止前释放其持有的系统资源(例如共享内存和信号量)。这可能会导致新的postmaster实例在启动时出现问题。
要正常终止postmaster,可以使用
SIGTERM、SIGINT或
SIGQUIT信号。第一个会在退出前等待所有客户端终止,第二个会强制断开所有客户端,而第三个会在不进行正确关闭的情况下立即退出,从而在重启期间导致一次恢复运行。SIGHUP信号会重新加载服务器配置文件。
实用命令pg_ctl可用于安全、便捷地启动和关闭postmaster。
--选项在FreeBSD或OpenBSD上不起作用。请改用-c。这是受影响操作系统中的一个缺陷;如果这个问题未被修复,未来版本的PostgreSQL
将提供变通方案。
示例
要使用默认值在后台启动postmaster,输入:
$nohup postmaster >logfile 2>&1 </dev/null &
要用特定端口启动
postmaster:
$postmaster -p 1234
这条命令将启动
postmaster
并通过端口 1234 通信。为了用
psql 连接这个
postmaster,你需要将它作为
$psql -p 1234
来运行,或者设置环境变量 PGPORT:
$export PGPORT=1234$psql
命名的运行时参数可以用下面两种风格中的任一种设置:
$postmaster -c sort_mem=1234$postmaster --sort-mem=1234
这两种形式都会覆盖 postgresql.conf 中可能存在的
SORT_MEM 设置。注意,命令行上参数名中的下划线既可以写成下划线也可以写成短横线。
提示
除了短期实验之外,与其依赖命令行开关来设置参数,通常更好的做法是直接编辑
postgresql.conf中的设置。