PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

postgres

postgres — PostgreSQL 数据库服务器

Synopsis

postgres [option...]

描述

postgres 是 PostgreSQL 数据库服务器。客户端应用程序要访问数据库时,会(通过网络或本地)连接到一个正在运行的 postgres 实例,然后该 postgres 实例会启动一个单独的服务器进程来处理这个连接。

一个 postgres 实例始终只管理一个数据库集群的数据。数据库集群是存储在同一个文件系统位置(即“数据区”)的数据库集合。一个系统上可以同时运行多个 postgres 实例,只要它们使用不同的数据区和不同的通信端口(见下文)。postgres 启动时需要知道数据区的位置。该位置必须通过 -D 选项或 PGDATA 环境变量来指定,没有默认值。通常,-D 或 PGDATA 直接指向 initdb 所创建的数据区目录。其他可能的文件布局在 Section 19.2 中讨论。

默认情况下,postgres 以前台方式启动,并把日志消息打印到标准错误流。在实际应用中,应当将 postgres 作为后台进程启动,比如在系统引导时启动。

postgres 命令也可以在单用户模式下调用。这种模式的主要用途是在 initdb 执行引导初始化的过程中。有时它也被用于调试或灾难恢复;但请注意,运行单用户服务器并不真正适合用来调试服务器,因为此时不会发生真实的进程间通信和加锁。从 shell 以单用户模式调用时,用户可以输入查询,结果会被打印到屏幕上,只是其形式对开发者而言比对最终用户更有用。在单用户模式下,会话用户将被设置为 ID 为 1 的用户,并被授予隐式超级用户权限。该用户实际上并不需要真实存在,因此可以利用单用户模式来手工恢复系统目录的某些意外损坏。

选项

postgres 接受下列命令行参数。有关这些选项的详细讨论请参阅 Chapter 19。通过设置配置文件,可以省去键入其中大多数选项的工作。一些(安全的)选项也可以由连接的客户端以依赖于应用的方式设置,从而只对该会话生效。例如,如果设置了环境变量 PGOPTIONS,基于 libpq 的客户端就会把该字符串传给服务器,服务器会将其解释为 postgres 的命令行选项。

通用选项

-B nbuffers

设置供服务器进程使用的共享缓冲区数量。此参数的默认值由 initdb 自动选定。指定此选项等同于设置 shared_buffers 配置参数。

-c name=value

设置一个命名的运行时参数。PostgreSQL 支持的配置参数在 Chapter 19 中描述。其他大多数命令行选项实际上都是这类参数赋值的简写形式。-c 可以多次出现,以设置多个参数。

-C name

打印指定运行时参数的值并退出。(详情请参见上面的 -c 选项。)它返回来自 postgresql.conf 的值,并由本次调用中提供的参数加以修改。它不反映集群启动时所提供的参数。

对于大多数参数,可以在运行中的服务器上使用此选项。但是,对于某些在运行时计算的参数(例如 shared_memory_size、shared_memory_size_in_huge_pages 和 wal_segment_size),必须先关闭服务器。

此选项供与服务器实例交互的其他程序(例如 pg_ctl)用来查询配置参数的值。面向用户的应用程序则应改用 SHOW 命令或 pg_settings 视图。

-d debug-level

设置调试级别。此值设置得越高,写入服务器日志的调试输出就越多。取值范围是 1 到 5。也可以为特定的会话传递 -d 0,这将阻止父 postgres 进程的服务器日志级别传播到该会话。

-D datadir

指定数据库配置文件的文件系统位置。详情请参见 Section 19.2。

-e

把默认日期风格设置为“欧洲”风格,即输入日期字段采用 DMY 顺序。这还会使日期在某些日期输出格式中打印在月份之前。更多信息请参见 Section 8.5。

-F

禁用 fsync 调用以提升性能,但代价是系统崩溃时可能出现数据损坏。指定此选项等同于禁用 fsync 配置参数。使用它之前请务必阅读详细的文档!

-h hostname

指定 postgres 在其上监听来自客户端应用 TCP/IP 连接的 IP 主机名或地址。该值也可以是一个以逗号分隔的地址列表,或者 *(表示监听所有可用的接口)。空值表示不监听任何 IP 地址,此时只能使用 Unix 域套接字连接到服务器。默认只在 localhost 上监听。指定此选项等同于设置 listen_addresses 配置参数。

-i

允许远程客户端通过 TCP/IP(Internet 域)连接。不使用此选项时,只接受本地连接。此选项等同于把 listen_addresses 设置为 *,可以在 postgresql.conf 中设置,或者通过 -h 选项来设置。

此选项已被弃用,因为它无法使用 listen_addresses 的全部功能。通常直接设置 listen_addresses 是更好的做法。

-k directory

指定 postgres 在其上监听来自客户端应用连接的 Unix 域套接字目录。该值也可以是一个以逗号分隔的目录列表。空值表示不监听任何 Unix 域套接字,此时只能使用 TCP/IP 套接字连接到服务器。默认值通常为 /tmp,但可以在构建时更改。指定此选项等同于设置 unix_socket_directories 配置参数。

-l

启用使用 SSL 的安全连接。PostgreSQL 必须在编译时带有 SSL 支持,此选项才可用。有关使用 SSL 的更多信息,请参阅 Section 18.9。

-N max-connections

设置此服务器将接受的最大客户端连接数。此参数的默认值由 initdb 自动选定。指定此选项等同于设置 max_connections 配置参数。

-p port

指定 postgres 在其上监听来自客户端应用连接的 TCP/IP 端口号或本地 Unix 域套接字文件扩展名。默认取 PGPORT 环境变量的值;如果未设置 PGPORT,则默认取编译时确定的值(通常为 5432)。如果你指定的端口不是默认端口,那么所有客户端应用都必须通过命令行选项或 PGPORT 指定相同的端口。

-s

在每条命令结束时打印时间信息和其他统计信息。这对基准测试或调整缓冲区数量很有用。

-S work-mem

指定排序和哈希表在转用临时磁盘文件之前可以使用的基本内存量。有关 work_mem 配置参数的描述,请参见 Section 19.4.1。

-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 则分别禁用嵌套循环连接、合并连接和哈希连接。

顺序扫描和嵌套循环连接都无法被完全禁用;-fs 和 -fn 选项只是在优化器还有其他可选方案时,劝阻它使用那几类计划。

-O

允许修改系统表的结构。initdb 会使用此选项。

-P

读取系统表时忽略系统索引,但在修改这些表时仍会更新索引。这在从受损的系统索引中恢复时很有用。

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

针对每个查询,打印与各个主要系统模块相关的计时统计信息。此选项不能与 -s 选项一起使用。

-T

此选项用于调试导致服务器进程异常终止的问题。这种情况下的常规策略是向所有其他服务器进程发送 SIGQUIT 信号,通知它们必须终止。使用此选项时,将改为发送 SIGABRT 信号,从而生成核心转储文件。

-v protocol

指定特定会话要使用的前端/后端协议的版本号。此选项仅供内部使用。

-W seconds

启动新的服务器进程时,会在完成认证过程后延迟此处指定的秒数。这是为了提供使用调试器附加到服务器进程的机会。

单用户模式的选项

以下选项仅适用于单用户模式(见下文 Single-User Mode)。

--single

选择单用户模式。它必须是命令行上的第一个参数。

database

指定要访问的数据库的名称。它必须是命令行上的最后一个参数。如果省略,则默认为用户名。

-E

在执行之前把所有命令回显到标准输出。

-j

使用分号后跟两个换行符(而不是单个换行符)作为命令输入终止符。

-r filename

把所有服务器日志输出发送到 filename。只有以命令行选项的形式给出时,此选项才会生效。

环境

PGCLIENTENCODING

客户端使用的默认字符编码。(各个客户端可以单独覆盖它。)此值也可以在配置文件中设置。

PGDATA

默认数据目录位置

PGDATESTYLE

DateStyle 运行时参数的默认值。(此环境变量的使用已被弃用。)

PGPORT

默认端口号(最好在配置文件中设置)

诊断

提到 semget 或 shmget 的失败消息很可能表明你需要配置内核,以提供足够的共享内存和信号量。更多讨论请参见 Section 18.4。你可以减小 shared_buffers 来降低 PostgreSQL 的共享内存消耗,以及/或者减小 max_connections 来降低信号量消耗,从而推迟重新配置内核。

如果失败消息提示已有另一个服务器在运行,应当仔细检查,例如根据你的系统使用命令

$ ps ax | grep postgres

或

$ ps -ef | grep postgres

来检查。如果你确定没有冲突的服务器在运行,可以删除消息中提到的锁文件并重试。

指示无法绑定到端口的失败消息可能表明该端口已被某个非 PostgreSQL 进程占用。如果你终止了 postgres 并立即用同一端口重启它,也可能会遇到这个错误;在这种情况下,你只需等待几秒钟,待操作系统关闭该端口后再重试。最后,如果你指定的端口号被你的操作系统视为保留端口号,也可能会遇到这个错误。例如,许多 Unix 版本把 1024 以下的端口号视为“受信任的”端口号,只允许 Unix 超级用户访问它们。

注记

实用工具命令 pg_ctl 可用于安全而省心地启动和关闭 postgres 服务器。

在任何可能的情况下,都不要使用 SIGKILL 杀死主 postgres 服务器。这样做会阻止 postgres 在终止之前释放它所持有的系统资源(例如共享内存和信号量)。这可能会给重新启动 postgres 带来问题。

要正常终止 postgres 服务器,可以使用 SIGTERM、SIGINT 或 SIGQUIT 信号。第一种会等待所有客户端终止后才退出,第二种会强制断开所有客户端,第三种则会立即退出而不执行正常的关闭过程,导致重启时进行一次恢复运行。

SIGHUP 信号会重新加载服务器配置文件。也可以向单个服务器进程发送 SIGHUP,但这样做通常并不明智。

要取消一个正在运行的查询,请向正在执行该命令的进程发送 SIGINT 信号。要干净地终止一个后端进程,请向该进程发送 SIGTERM 信号。另请参见 pg_cancel_backend 和 pg_terminate_backend(在 Section 9.28.2 中介绍),它们是这两种操作可通过 SQL 调用的等价形式。

postgres 服务器使用 SIGQUIT 通知下级服务器进程终止而不做正常的清理。用户不应使用这个信号。向服务器进程发送 SIGKILL 也是不明智的 — 主 postgres 进程会把它解释为一次崩溃,并作为其标准崩溃恢复过程的一部分,强制所有兄弟进程退出。

缺陷

-- 选项在 FreeBSD 或 OpenBSD 上无法使用。请改用 -c。这是受影响操作系统的缺陷;如果该问题没有被修复,PostgreSQL 的未来版本将提供一种变通方法。

单用户模式

要启动单用户模式的服务器,可以使用类似下面的命令:

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

请通过 -D 给出正确的数据库目录路径,或者确保设置了环境变量 PGDATA。另外请指定你想要在其中工作的那个具体数据库的名称。

通常,单用户模式服务器把换行符当作命令输入终止符;它不会像 psql 那样智能地处理分号。要让一条命令跨多行继续,你必须在除最后一个换行符之外的每个换行符之前键入一个反斜杠。反斜杠和相邻的换行符都会从输入命令中被去除。注意,即使是在字符串字面值或注释中也会发生这种情况。

但是如果你使用 -j 命令行开关,单个换行符就不会终止命令输入;取而代之的是,分号-换行-换行这样的序列才会终止命令输入。也就是说,键入一个分号后紧接着一个完全空白的行。在这种模式下,反斜杠-换行不会被特殊处理。同样,如果这种序列出现在字符串字面值或注释中,也不会被特殊处理。

在任一种输入模式下,如果你键入的分号并不正好位于命令输入终止符之前,也不是它的一部分,它就会被当作命令分隔符。当你真正键入命令输入终止符时,你输入的多条语句将作为一个单一事务被执行。

要退出会话,请键入 EOF(通常是 Control+D)。如果自上一个命令输入终止符以来你已经输入了一些文本,那么 EOF 会被当作一个命令输入终止符,需要再输入一个 EOF 才能退出。

注意,单用户模式服务器不提供复杂的行编辑功能(例如没有命令历史)。单用户模式也不执行任何后台处理,例如自动检查点或复制。

示例

要用默认值在后台启动 postgres,请键入:

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

要在指定的端口(例如 1234)上启动 postgres:

$ postgres -p 1234

要使用 psql 连接到此服务器,请用 -p 选项指定该端口:

$ psql -p 1234

或者设置环境变量 PGPORT:

$ export PGPORT=1234
$ psql

命名的运行时参数可以用以下两种风格设置:

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

无论 work_mem 在 postgresql.conf 中可能有什么设置,两种形式都会覆盖它。注意,参数名中的下划线在命令行上既可以写成下划线,也可以写成连字符。除了短期实验之外,更好的做法可能是编辑 postgresql.conf 中的设置,而不是依靠命令行开关来设置参数。

另请参阅

initdb, pg_ctl