Name
postmaster --
PostgreSQL
多用户数据库服务器
Synopsis
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 个缓冲区,每个缓冲区是 8k 字节。
-
-c
name
=
value
-
设置一个命名的运行时参数.参考
管理员手册
获取列表和描述.
大多数其他命令行选项实际上都是这样的参数赋值的短形式.
-c
可以出现多次用以设置多个参数.
-
-d
debug-level
-
设置调试级别.数值越高,写到服务器日志的调试输出越多.
缺省是 0,意思是没有调试.最高可以设为 4 是有意义的;再高的
数值也不会产生额外的输出.
-
-D
datadir
-
声明数据目录的文件系统路径.参阅上文的讨论.
-
-F
-
关闭
fsync
调用,提高性能,但是要冒
系统崩溃时数据毁坏的风险.在使用这个选项前先读一下详细文档!
-
-h
hostname
-
声明
postmaster
侦听着等待来自前端应用联接的 TCP/IP 主机名或地址.
它缺省侦听所有配置了的地址(包括
localhost
).
-
-i
-
这个选项打开 TCP/IP (网际域套接字)通讯。
没有这个选项,只能进行本地 Unix 域套接字通讯。
-
-k
directory
-
声明
postmaster
侦听着等待来自前端应用联接的 Unix 域套接字的位置.
缺省通常是
/tmp
,但是可以在制作的时候修改.
-
-l
-
这个选项打开用 SSL 进行的安全通讯。同样还需要
-i
选项。要使用这个选项,编译时你必须打开了 SSL 选项。
-
-N
max-connections
-
设置
postmaster
允许启动的后端服务器的最大数目。缺省配置时,该值为 32,
如果你的系统能支持更多进程,该值最大可以设置为你的系统所能支持的极限。
时修改(参阅 src/include/config.h)。
(请注意
-B
选项要求至少是两倍
-N
参阅
管理员手册
获取有关大客户量的
系统资源需求.)
-
--
name
=
value
-
设置一个命名的运行时参数;其缩写形式是
-c
.
-
-o
extra-options
-
在
extra-options
里声明的
postgres
选项都传递给所有由这个
postmaster
.
启动的后端服务进程。
参阅
postgres
获取可能选项.
如果选项字串包含任何空白,整个字串必须引起来。
-
-p
port
-
声明
postmaster
侦听着等待客户端应用连接的互联网 TCP/IP 端口或一个本地 Unix
域套接字文件扩展(描述符).
缺省的端口号是环境变量
PGPORT
的值。如果没有设置
PGPORT
缺省是 PostgreSQL 编译时建立的值(通常是 5432)。
如果你声明了一个非缺省端口,那么所有前端应用(包括
psql
)都必须用命令行选项或者
PGPORT
声明同一个端口。
-
-S
-
指明
postmaster
进程将以安静模式启动。也就是说,
它将与用户的(控制)tty 脱离并且启动其自身的进程组。
并且它把标准输出和标准错误重定向到
/dev/null
。
使用这个开关会将日志输出都丢弃,可能不是你希望的,
因为这样令错误查找非常困难.参阅下文获取一个在后台启动
postmaster
的更好的方法.
有两个额外的命令行选项可以用于调试导致后端异常退出.
这些选项控制这种环境下的
postmaster
的性质,而且
没有哪个选项是为普通操作准备的
.
用于这种状况的一般策略是通知所有其它后端必须退出,
然后重新初始化共享内存和信号灯。这是因为一个出错的
后端在退出前可能已经破坏了一些共享的状态。
这些特殊选项是:
-
-n
-
postmaster
将不会重新初始化共享数据结构。
一个有经验的系统程序员这时就可以使用调试器
检查共享内存和信号灯状态。
-
-s
-
postmaster
将通过发送信号
SIGSTOP
停止所有其他后端进程,但不会导致它们退出。
这样就允许系统程序员手工
从所有后端进程收集倾倒的核心(core dumps)。
输出
-
semget: No space left on device
-
如果你看到这条信息,你应该运行
ipcclean
命令。干完这个之后,试着重新启动
postmaster
。
如果还不行,
你可能需要按照安装指导里描述的那样配置你的内核的共享内存和信号灯。
如果你在一台主机上运行多个
postmaster
实例,或者如果你的内核的共享内存和/或信号灯被限制得很小,
你可能要重新配置你的内核以增加共享内存和信号灯参数。
小技巧:
你也可以通过降低
-B
的参数以减少
PostgreSQL
的共享内存的消耗,
或者降低
-N
的参数减少
PostgreSQL
的信号灯的消耗,
以此可以推迟重新配置内核。
-
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
这条命令将在端口 1234 启动
postmaster
.
为了用 psql 与这个
postmaster
联接,
你应该这么运行 psql
$
psql -p 1234
或者设置环境变量
PGPORT
:
$
export PGPORT=1234
$
psql
命名的运行时参数可以用下列的风格之一设置∶
$
postmaster -c sort_mem=1234
$
postmaster --sort-mem=1234
两种形式都覆盖那些现有的在
postgresql.conf
里面的
sort_mem
的设置.请注意在参数名里的下划线在命令行
上可以写成下划线,也可以写成划线.
小窍门:
除了用于短期的实验以外,更好的习惯是编辑放在
postgresql.conf
里面的设置,而不是倚赖命令行开关
设置参数.
|