PostgreSQL 9.4.4 中文手册
上一页 | 上一级 |  | 下一页

# postgres

## 名称

postgres -- PostgreSQL 数据库服务器

## 大纲

`postgres` [`option`...]

## 描述

`postgres`是PostgreSQL数据库服务器。 客户端应用程序为了访问数据库，将通过网络或本地连接到一个运行中的 `postgres`进程。然后该`postgres` 实例将启动一个独立的服务器进程来处理这个连接。

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

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

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

## 选项

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

### 通用用途

`-A 0|1`

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

`-B `nbuffers``

  为服务器进程分配和管理的共享内存缓冲区数量。这个参数的缺省值是 initdb自动选择的；声明这个选项等同于设置 shared_buffers配置参数。

`-c `name`=`value``

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

`-C `name``

  打印命名的运行时参数的值，然后退出。（参阅上面的`-c`选项获取详细信息。） 这个选项可以在一个运行的服务器上使用，返回来自`postgresql.conf`的值， 通过在这个调用中提供的参数修改。当集群启动时，它不反应提供的参数。

  这个选项本应为与服务器进程交互的其他程序，例如pg_ctl， 查询配置参数值。面向用户的应用应该使用xref linkend="sql-show">或 `pg_settings`视图。

`-d `debug-level``

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

`-D `datadir``

  声明数据库配置文件的文件系统路径。细节详见第 18.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 域套接字的目录。 该值也可以是逗号分隔的目录列表。空值表明不监听任何 Unix 域套接字，在这种情况下， 只有TCP/IP套接字可以用来连接到服务器。缺省通常是`/tmp`， 但是可以在编译的时候修改。声明这个选项等同于设置unix_socket_directories 配置参数。

`-l`

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

`-N `max-connections``

  设置最多允许同时连接多少个客户端(也就是最多同时运行多少个服务器进程)。 这个参数的缺省值自动通过initdb选择。 声明这个选项等效于声明max_connections配置参数。

`-o `extra-options``

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

  反对使用该选项，所有服务器进程的命令行选项都可以直接在`postgres` 命令行上指定。

`-p `port``

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

`-s`

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

`-S` `work-mem`

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

`-V`
`--version`

  打印postgres版本然后退出。

`--`name`=`value``

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

`--describe-config`

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

`-?`
`--help`

  显示关于postgres命令行参数的帮助然后退出。

### 部分内部选项

这里描述的选项主要用于调试用途，并且在某些情况下帮助严重损坏的数据库恢复。 不应该在生产数据库的设置中使用这些选项。在这里列出只是给PostgreSQL 系统开发人员使用的。另外这些选项都可能在未来版本中改变或删除而不加说明。

`-f` `{ s | i | o | b | t | n | m | h }`

  禁止某种扫描和连接方法的使用：`s`和`i` 分别关闭顺序和索引扫描，`o`, `b` 和 `t`分别关闭只有索引扫描、位图索引扫描和TID扫描， 而`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`

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

### 单用户模式的选项

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

`--single`

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

`database`

  要访问的数据库名字。这个必须是命令行中的最后一个选项。如果忽略掉则缺省为用户名。

`-E`

  回显所有命令。

`-j`

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

`-r` `filename`

  将所有服务器输出日志保存到`filename`中。 这个选项仅在作为一个命令行选项提供时有效。

## 环境变量

`PGCLIENTENCODING`

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

`PGDATA`

  缺省数据目录位置。

`PGDATESTYLE`

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

`PGPORT`

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

`TZ`

  服务器的时区。

## 诊断

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

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

    $ ps ax | grep postgres

或

    $ ps -ef | grep postgres

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

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

## 注意

pg_ctl工具可以用于安全而有效地启停`postgres`服务器。

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

可以使用`SIGTERM`, `SIGINT`, `SIGQUIT` 信号正常结束`postgres`服务器进程。 第一个信号将等待所有的客户端退出后才退出。第二个将强制断开所有客户端， 而第三个将不停止立刻退出，导致在重启时的恢复运行。

`SIGHUP`会重新加载服务器配置文件。 也可以向一个单独的服务器进程发送`SIGHUP`信号，但是这样做没什么意义。

要取消一个正在运行的查询，可以向正在执行该查询的进程发送`SIGINT`信号。 要终止一个后端进程，可以向那个进程发送`SIGTERM`信号。也可以参阅 第 9.26.2 节里面的`pg_cancel_backend` 和 `pg_terminate_backend`获取这两个动作的相等SQL调用。

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

## Bug

`--`选项在FreeBSD或 OpenBSD上无法运行，应该使用`-c`。 这在受影响的系统里是个Bug；如果这个毛病没有修补好， 将来的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`，如1234：

    $ postgres -p 1234

要连接到这个服务器使用psql，用 -P 选项指定这个端口：

    $ 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