PostgreSQL 8.2.3 中文文档
后退快退快进前进

postgres

名称

postgres -- PostgreSQL 数据库服务器

语法

postgres [option...]

描述

postgres 是 PostgreSQL 数据库服务器。客户端应用程序为了访问数据库,将通过 TCP Socket 或 Unix domain socket 连接到一个运行中的 postgres 进程。然后该 postgres 实例将启动(fork)一个新的、独立的服务器进程来处理这个连接。

一个 postgres 总是管理来自同一个数据库集群的数据。一个数据库集群是一组在同一个文件系统位置("数据区")存放数据的数据库。一个系统上可以同时运行多个 postgres 进程,只要他们使用不同的数据区和不同的端口号(见下文)。postgres 启动时需要知道数据区的位置,该位置必须通过 -D 选项或 PGDATA 环境变量指定。通常,-DPGDATA 都直接指向由 initdb 创建的集群目录。其他可能的文件布局在节17.2里面有讨论。

缺省时 postgres 在前台启动并将日志信息输出到标准错误。但在实际应用中,postgres 应当作为后台进程启动,而且多数是在系统启动时自动启动。

postgres 还能以单用户模式运行。这种用法的主要用于 initdb 的初始化过程中。有时候它也被用于调试灾难性恢复。不过,单用户模式运行的服务器并不适合于调试,因为没有实际的进程间通讯和锁动作发生。当从 shell 上以单用户模式调用时,用户可以输入查询,然后结果会在屏幕上以一种更适合开发者阅读(不适合普通用户)的格式显示出来。在单用户模式下,将把会话用户 ID 设为 1 并赋予超级用户权限。该用户不必实际存在,因此单用户模式运行的服务器可以用于对某些意外损坏的系统表进行手工恢复。

选项

postgres 接受下列命令行参数。关于这些选项的更详细讨论请参考章17。你也可以通过设置一个配置文件来减少敲击这些选项。有些(安全的)选项还可以从连接过来的客户端设置,以一种应用无关的方法仅对该会话生效。比如,如果设置了 PGOPTIONS 环境变量,那么基于 libpq 的客户端就都把那个字符串传递给服务器,并被服务器解释成 postgres 命令行选项。

通用用途

-A 0|1

打开运行时断言检查,是检测编程错误的调试帮助。只有在编译 PostgreSQL 时打开了它,你才能使用它。如果编译时打开了,缺省是打开。

-B nbuffers

为服务器进程分配和管理的共享内存缓冲区数量。这个参数的缺省值是 initdb 自动选择的;参考节17.4.1获取更多信息。

-c name=value

设置一个命名的运行时参数。PostgreSQL 支持的配置参数在章17里描述。大多数其它命令行选项实际上都是这样的参数赋值的短形式。-c 可以出现多次从而设置多个参数。

-d debug-level

设置调试级别。数值越高,写到服务器日志的调试输出越多。取值范围是 1 到 5 。还可以针对某次单独的会话使用 -d 0 来防止从父 postgres 进程继承日志级别。

-D datadir

声明数据目录或者配置文件的文件系统路径。细节详见节17.2

-e

把缺省日期风格设置为"European",也就是说用 DMY 规则解释日期输入,并且在一些日期输出格式里日子在月份前面打印。参阅节8.5获取更多细节。

-F

关闭 fsync 调用以提高性能,但是要冒系统崩溃时数据毁坏的风险。声明这个选项等效关闭了 fsync 参数。在使用之前阅读详细文档!

-h hostname

指定 postgres 侦听来自前端应用 TCP/IP 连接的 IP 主机名或地址。数值也可以是一个用空格分隔的地址列表,或者 * 表示监听所有可用的地址。空值表示不监听任何 IP 地址,而只使用 Unix 域套接字与客户端通信。缺省只监听 localhost 。声明这个选项等效于设置 listen_addresses 配置参数。

-i

这个选项允许远程客户通过 TCP/IP(网际域套接字)与服务器通讯。没有这个选项,服务器将只接受本地连接。这个选项等效于在 postgresql.conf 中或者通过 -h 选项将 listen_addresses 设为 *

这个选项已经废弃了,因为它不能实现 listen_addresses 的所有功能。所以最好直接设置 listen_addresses

-k directory

指定 postgres 侦听来自前端应用连接的 Unix 域套接字的目录。缺省通常是 /tmp ,但是可以在编译的时候修改。

-l

这个选项使用 SSL 进行的安全通讯。要使用这个选项,编译 PostgreSQL 时你必须打开了 SSL 支持。有关使用 SSL 的信息,请参考节16.7

-N max-connections

设置最多允许同时连接多少个客户端(也就是最多同时运行多少个服务器进程)。缺省值为 32 ,不过该值最大可以设置为系统所能承受的极限。请注意 -B 的值要求至少两倍于 -N 的值。参阅节16.4获取有关大量客户的系统资源需求。声明这个选项等效于声明 max_connections 配置参数。

-o extra-options

extra-options 里面指定的命令行选项将被传递给所有由这个 postgres 派生的服务进程。如果选项字符串包含任何空白,那么整个字符串必须用引号界定。

反对使用该选项,所有服务器进程的命令行选项都可以直接在 postgres 命令行上指定,不必这么麻烦。

-p port

指定 postgres 侦听客户端连接的 TCP/IP 端口或本地 Unix domain socket 文件的扩展。缺省的端口号是环境变量 PGPORT 的值。如果 PGPORT 没有设置,那么缺省是 PostgreSQL 编译时指定的值(通常是 5432)。如果你声明了一个非缺省端口,那么所有前端应用都必须用命令行选项或者 PGPORT 声明同一个端口。

-s

在每条命令结束时打印时间信息和其它统计信息。这个开关对测试性能和调节缓冲区数量有好处。

-S work-mem

声明内部排序和散列在求助于临时磁盘文件之前可以使用的内存数量。参阅节17.4.1里描述的配置变量 work_mem

--name=value

设置一个命名的运行时参数;其缩写形式是 -c

--describe-config

以制表符分隔的 COPY 格式,导出服务器内部配置变量、描述、缺省值。设计它主要是给管理工具使用。

半内部选项

还有几个其它的选项可以声明,主要用于调试用途。这些东西在这里列出只是给 PostgreSQL 系统开发人员使用的。强烈反对使用这些选项。另外这些选项的任何一项都可能在未来版本中消失而不加说明。

-f { s | i | m | n | h }

禁止某种扫描和连接方法的使用:si 分别关闭顺序和索引扫描,而 n, m, h 分别关闭嵌套循环,融合(merge)和 Hash 连接。

顺序扫描和嵌套循环都不可能完全被关闭。 -fs-fn 选项仅仅是在存在其它方法时阻碍优化器使用这些方法罢了。

-n

该选项主要用于调试导致服务器进程异常崩溃的问题。对付这种情况的一般策略是通知所有其它服务器进程终止并重新初始化共享内存和信号灯。这是因为一个出错的服务器进程可能在终止之前就已经对共享的东西造成了破坏。该选项指定 postgres 不重新初始化共享数据结构。一个有经验的系统程序员这时就可以使用调试器检查共享内存和信号灯状态。

-O

允许修改系统表的结构。这个参数用于 initdb

-P

读取系统表时忽略系统索引(但在更改数据时仍然更新索引)。这对于从索引已经损坏的系统表中回复是很有帮助的。

-t pa[rser] | pl[anner] | e[xecutor]

打印与每个主要系统模块相关的查询记时统计。它不能和 -s 选项一起使用。

-T

该选项主要用于调试导致服务器进程异常崩溃的问题。对付这种情况的一般策略是通知所有其它服务器进程终止并重新初始化共享内存和信号灯。这是因为一个出错的服务器进程可能在终止之前就已经对共享的东西造成了破坏。该选项指定 postgres 通过发送 SIGSTOP 信号停止其他所有服务器进程,但是并不让它们退出。这样就允许系统程序员手动从所有服务器进程搜集内核转储。

-v protocol

声明这次会话使用的前/后服务器协议的版本数。该选项仅在内部使用。

-W seconds

一旦看见这个选项,进程就睡眠标出的秒数。这样就给开发者一些时间把调试器附着在该服务器进程上。

-y database

表明这是一个由父 postgres 进程启动的子进程,并使用指定的数据库。该选项仅供内部使用。

单用户模式的选项

下面的选项仅在单用户模式下可用。

--single

选中单用户模式。这个必须是命令行中的第一个选项。

database

要访问的数据库名字。如果忽略掉则缺省为用户名。

-E

回显所有命令

-j

禁止使用新行作为语句分隔符

-r filename

将所有服务器输出日志保存到 filename 中。在多用户模式下该选项将被忽略,所有进程都将使用 stderr

环境变量

PGCLIENTENCODING

客户端使用的缺省字符编码。客户端可以独立地覆盖它。这个值也可以在配置文件里设置。

PGDATA

缺省数据目录位置

PGDATESTYLE

运行时参数 DateStyle 的缺省值。现在反对使用该环境变量。

PGPORT

缺省端口(最好在配置文件中设置)

TZ

服务器的时区

诊断

一个提到了 semgetshmget 的错误信息可能意味着你需要重新配置你的内核,提供足够的共享内存和信号灯。更多讨论,参阅节16.4。你也可以通过降低 shared_buffers 值以减少 PostgreSQL 的共享内存的消耗,或者降低 max_connections 值减少 PostgreSQL 的信号灯的消耗。

如果碰到一个说另外一个服务器正在运行的错误信息,可以根据不同的系统使用命令

$ ps ax | grep postgres

$ ps -ef | grep postgres

如果确信没有冲突的服务器正在运行,那么你可以删除消息里提到的锁文件然后再次运行。

抱怨无法绑定端口的错误信息可能表明该端口已经被其它非 PostgreSQL 进程使用。如果终止 postgres 后又马上用同一个端口运行它,也可能得到这个错误信息;这时,你必须多等几秒,等操作系统关闭了该端口后再试。最后,如果你使用了一个操作系统认为是保留的端口,也可能导致这个错误信息。例如,我的 Unix 版本认为低于 1024 的端口号是"可信任的",因而只有 Unix 超级用户可以使用它们。

注意

如果有可能,不要使用 SIGKILL 杀死主 postgres 服务器进程。这样会阻止 postgres 在退出前释放它持有的系统资源(例如共享内存和信号灯)。这样可能会影响到将来启动新的 postgres 进程。

可以使用 SIGTERM, SIGINT, SIGQUIT 信号正常结束 postgres 服务器进程。第一个信号将等待所有的客户端退出后才退出。第二个将强制断开所有客户端,而第三个将不停止立刻退出,导致在重启时的恢复运行。SIGHUP 会重新加载服务器配置文件。也可以向一个单独的服务器进程发送 SIGHUP 信号,但是这样做没什么意义。

pg_ctl 工具可以用于安全而有效地启停 postgres ,推荐使用。

要推出一个正在运行的查询,可以向正在执行该查询的进程发送 SIGINT 信号。

postgres 服务器进程向子进程发送 SIGTERM 信号让它们正常退出;发送 SIGQUIT 信号立即退出且不做清理工作,用户应当尽量避免使用该信号。同时,发送 SIGKILL 信号也是不明智的:主 postgres 进程将把这个信号当作崩溃信号,然后会强制其他兄弟进程作为标准的崩溃回复过程退出。

臭虫

-- 选项在 FreeBSDOpenBSD 上无法运行,应该使用 -c 。这在受影响的系统里是个臭虫;如果这个毛病没有修补好,将来的 PostgreSQL 版本将提供一个绕开的办法。

用法

启动一个单用户模式的服务器:

postgres --single -D /usr/local/pgsql/data other-options my_database

-D 给服务器提供正确的数据库目录的路径,或者确保环境变量 PGDATA 已经正确设置。同时还要声名你想用的特定数据库名字。

通常,独立运行的服务器把换行符当做命令输入完成字符;它还不懂分号的作用,因为那些东西是在 psql 里的。要想把一行分成多行写,你必需在除最后一个换行符以外的每个换行符前面敲一个反斜杠。

但是如果使用了 -j 命令行选项,新行将不被当作命令结束符。此时服务器将从标准输入一直读取到 EOF 标志为止,然后把把所有读到的内容当作一个完整的命令字符串看待,并且反斜杠与换行符也被当作普通字符来看待。

输入 EOF(Control+D)即可退出会话。如果你已经使用了 -j 则必须连续使用两个 EOF 才行。

请注意单用户模式运行的服务器不会提供复杂的行编辑功能(比如,没有命令行历史)。

例子

用缺省值在后台启动 postgres

$ nohup postgres >logfile 2>&1 </dev/null &

在指定的端口启动 postgres

$ postgres -p 1234

这条命令将在端口 1234 启动 postgres 。你应该这样使用 psql 与之连接:

$ psql -p 1234

或者设置环境变量 PGPORT

$ export PGPORT=1234
$ psql

命名的运行时参数可以用下列的风格之一设置:

$ postgres -c work_mem=1234
$ postgres --work-mem=1234

两种形式都覆盖那些现有的在 postgresql.conf 里面的 work_mem 设置。请注意在参数名里的下划线在命令行上可以写成下划线,也可以写成连字符。除了用于短期的实验以外,更好的习惯是编辑 postgresql.conf 里面的设置,而不是倚赖命令行开关设置参数。

又见

initdb, pg_ctl


后退首页前进
pg_resetxlog上一级postmaster