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 接受下列命令行参数。关于这些选项的详细讨论请查阅管理员指南。通过设置配置文件,大多数这样的选项还可以省去重复输入。
- -A 0|1
启用运行时断言检查,这是一种检测编程错误的调试辅助手段。只有在编译时启用了它才可用。如果是这样,默认为开启。
- -B
nbuffers 设置服务器进程使用的共享缓冲区数量。该值默认为 64 个缓冲区,每个缓冲区为 8 kB。
- -c
name=value 设置一个命名的运行时参数。列表和描述请查阅管理员指南。大多数其他命令行选项实际上是这种参数赋值的简短形式。
-c可以出现多次以设置多个参数。- -d
debug-level 设置调试级别。该值设得越高,写入服务器日志的调试输出就越多。取值范围是 1 到 5。
- -D
datadir 指定数据目录的文件系统位置。见上面的讨论。
- -F
为了改进性能而禁用
fsync调用,代价是系统崩溃时可能发生数据损坏。这个参数对应于在postgresql.conf中设置fsync=false。使用前请阅读详细的文档!--fsync=true的效果与此选项相反。- -h
hostname 指定 postmaster 用来监听客户端应用连接的 TCP/IP 主机名或地址。默认监听所有已配置的地址(包括 localhost)。
- -i
允许客户端通过 TCP/IP(Internet 域)连接。不使用这个选项时,只接受本地 Unix 域套接字连接。这个选项对应于在
postgresql.conf中设置tcpip_socket=true。--tcpip_socket=false的效果与此选项相反。- -k
directory 指定 postmaster 用来监听客户端应用连接的 Unix 域套接字的目录。默认通常是
/tmp,但可以在构建时更改。- -l
启用使用 SSL 的安全连接。还需要
-i选项。你必须以启用 SSL 的方式编译才能使用这个选项。- -N
max-connections 设置这个 postmaster 可接受的最大客户端连接数。默认值为 32,但可以设置到你的系统所支持的程度。(注意
-B至少要为-N的两倍。关于大量客户端连接的系统资源需求的讨论见管理员指南。)- -o
extra-options 指定的命令行风格的选项(
extra-options)会传递给该 postmaster 启动的所有后端服务器进程。可能的选项见postgres。如果选项字符串包含空格,整个字符串必须加引号。- -p
port 指定 postmaster 用来监听客户端应用连接的 TCP/IP 端口或本地 Unix 域套接字文件扩展名。默认为
PGPORT环境变量的值,如果未设置PGPORT,则默认为编译时确定的值(通常为 5432)。如果你指定的不是默认端口,所有客户端应用都必须用命令行选项或PGPORT指定同一端口。- -S
指定 postmaster 进程应以静默模式启动。也就是说,它将与用户的(控制)终端脱离、建立自己的进程组,并把标准输出和标准错误重定向到
/dev/null。使用这个开关会丢弃所有日志输出,这很可能不是你想要的,因为它会使问题的排查变得非常困难。在后台启动 postmaster 的更好方法见下文。
--silent_mode=false的效果与此选项相反。- --
name=value 设置一个命名的运行时参数;这是
-c的较短形式。
还有两个额外的命令行选项可用于调试导致后端异常死亡的问题。这些选项控制 postmaster 在这种情况下的行为,两个选项都不用于日常操作。
这种情况下的常规策略是通知所有其他后端必须终止,然后重新初始化共享内存和信号量。这是因为出错的后端在终止之前可能已经破坏了某些共享状态。
这些特殊情况的选项是:
- -n
postmaster 不会重新初始化共享数据结构。有经验的系统程序员随后可以用调试器检查共享内存和信号量状态。
- -s
postmaster 会通过发送信号
SIGSTOP停止所有其他后端进程,但不会使它们终止。这让系统程序员可以手工收集所有后端进程的 core 转储。
环境
PGCLIENTENCODING客户端使用的默认字符编码。(客户端可以单独覆盖它。)该值也可以在配置文件中设置。
PGDATA默认的数据目录位置
PGDATASTYLEdatestyle运行时参数的默认值。(不推荐使用这个环境变量。)PGPORT默认端口(最好在配置文件中设置)
TZ服务器时区。
- others
其他环境变量可用来指定备选的数据存储位置。更多信息见管理员指南。
诊断
semget: No space left on device如果你看到这条消息,应当运行 ipcclean 命令。之后再次尝试启动 postmaster。如果仍然不行,你可能需要按安装说明中的描述为共享内存和信号量配置你的内核。如果你在单个主机上运行多个 postmaster 实例,或者内核的共享内存和/或信号量限制特别小,就可能需要重新配置内核以增大其共享内存或信号量参数。
提示
通过减小
-B来降低 PostgreSQL 的共享内存消耗,和/或减小-N来降低信号量消耗,你可能可以推迟重新配置内核。StreamServerPort: cannot bind to port如果你看到这条消息,应当确保没有其他 postmaster 进程已在同一端口号上运行。判断这一点的最简单方法是使用命令
$ps ax | grep postmaster或
$ps -e | grep postmaster(取决于你的系统)。
如果你确信没有其他 postmaster 进程在运行却仍得到这个错误,请尝试用
-p选项指定一个不同的端口。如果你终止 postmaster 后立即用同一端口重启它,也可能得到这个错误;这种情况下,只需等待几秒直到操作系统关闭该端口再重试即可。最后,如果你指定的端口号被操作系统视为保留端口,也可能得到这个错误。例如,许多版本的 Unix 把 1024 以下的端口号视为受信任的,只允许 Unix 超级用户访问它们。
注解
如果有可能,请不要用
SIGKILL 杀死
postmaster。这会阻止
postmaster 在终止前释放它持有的系统资源(例如共享内存和信号量)。
要正常终止 postmaster,可以使用信号 SIGTERM、SIGINT
或 SIGQUIT。第一种会在退出前等待所有客户端终止,第二种会强制断开所有客户端的连接,第三种会立即退出而不做正常的关闭,导致重启期间进行一次恢复。
实用工具命令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中的设置。