Postgresql 中文操作指南

postgres

postgres — PostgreSQL 数据库服务器

Synopsis

postgres [ option …​]

Description

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

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

默认情况下, postgres 在前台启动,并向标准错误流打印日志消息。在实际应用程序中,应该后台进程的方式启动 postgres ,可能在启动时启动。

postgres 命令可以在单用户模式下调用。此模式的主要用途是在 initdb 引导期间。有时它被用于调试或灾难恢复;请注意,运行单用户服务器并不真正适合调试服务器,因为不会进行实际进程间通信和锁定。当从 Shell 中以单用户模式调用时,用户可以输入查询,结果将打印到屏幕,但以对开发人员比最终用户更有用的格式打印。在单用户模式中,会话用户将设置为具有 ID 1 的用户,并且会向此用户授予隐式超级用户权限。此用户实际上不必存在,因此可以用单用户模式从某些类型的意外损坏中手动恢复系统目录。

Options

postgres 接受以下命令行参数。有关各个选项的详细讨论,请参阅 Chapter 20 。你可以通过设置配置文件来免去键入大多数这些选项的麻烦。某些(安全)选项还可以从连接客户端以特定于应用程序的方式设置,以仅用于该会话。例如,如果环境变量 PGOPTIONS 已设置,那么基于 libpq 的客户端会将该字符串传递给服务器,服务器会将它解释为 postgres 命令行选项。

General Purpose

  • -B _nbuffers_

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

  • -c _name=value_

    • 设置命名运行时参数。PostgreSQL 支持的配置参数在 Chapter 20 中进行了描述。大多数其他命令行选项实际上都是这种参数分配的简短形式。 -c 可以多次出现以设置多个参数。

  • -C _name_

    • 打印命名运行时参数的值并退出。(有关详细信息,请参见上面的 -c 选项。)这将返回 postgresql.conf 中的值,并由此调用中提供的任何参数进行修改。它不反映集群启动时提供的参数。

    • 这可用于针对大多数参数在正在运行的服务器上。但是,某些运行时计算的参数(例如, shared_memory_sizeshared_memory_size_in_huge_pageswal_segment_size )需要关闭服务器。

    • 此选项适用于与服务器实例交互的其他程序,例如 pg_ctl ,以查询配置参数值。面向用户的应用程序应使用 SHOWpg_settings 视图。

  • -d _debug-level_

    • 设置调试级别。将此值设置得越高,写入服务器日志的调试输出就越多。值在 1 到 5 之间。也可以传递 -d 0 以用于特定会话,这将防止父 postgres 进程的服务器日志级别传播到此会话。

  • -D _datadir_

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

  • -e

    • 将默认日期风格设置为“欧洲风格”,即 DMY 输入日期字段的顺序。这也会导致在某些日期输出格式中先打印日期再打印月份。有关更多信息,请见 Section 8.5

  • -F

    • 为提高性能而禁用 fsync 调用,但是存在系统崩溃时数据损坏的风险。指定此选项等同于禁用 fsync 配置参数。使用之前请阅读详细文档!

  • -h _hostname_

    • 指定 postgres 侦听来自客户端应用程序的 TCP/IP 连接的 IP 主机名或地址。该值还可为地址的逗号分隔列表,或 * (用于指定在所有可用的接口上侦听)。空值为不侦听任何 IP 地址,在这种情况下只能使用 Unix 域套接字连接到服务器。默认值为仅侦听本地主机。指定此选项等同于设置 listen_addresses 配置参数。

  • -i

    • 允许远程客户端通过 TCP/IP(Internet 域)连接进行连接。没有此选项,只接受本地连接。此选项等同于在 postgresql.conf 中将 listen_addresses 设置为 * 或通过 -h 进行设置。

    • 此选项已弃用,因为它不允许访问 listen_addresses 的全部功能。通常最好直接设置 listen_addresses

  • -k _directory_

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

  • -l

    • 使用 SSL 启用安全连接。PostgreSQL 必须已与 SSL 支持一起编译,此选项才可用。有关使用 SSL 的更多信息,请参阅 Section 19.9

  • -N _max-connections_

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

  • -p _port_

    • 指定 postgres 侦听来自客户端应用程序的连接的 TCP/IP 端口或本地 Unix 域套接字文件扩展名。默认为 PGPORT 环境变量的值,或者如果 PGPORT 未设置,则默认为在编译期间建立的值(通常为 5432)。如果您指定的端口不是默认端口,那么所有客户端应用程序都必须使用命令行选项或 PGPORT 指定相同的端口。

  • -s

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

  • -S work-mem

    • 指定排序和哈希表在使用临时磁盘文件之前要使用的基本内存量。请参阅 Section 20.4.1work_mem 配置参数的说明。

  • -V_—​version_

    • 打印 postgres 版本并退出。

  • —​_name=value_

    • 设置一个已命名的运行时参数; -c 的简写形式。

  • —​describe-config

    • 此选项以制表符分隔的 COPY 格式转储服务器的内部配置变量、说明和默认值。它主要设计用于管理工具。

  • -?_—​help_

    • 显示有关 postgres 命令行参数的帮助,并退出。

Semi-Internal Options

此处描述的选项主要用于调试目的,在某些情况下可协助恢复严重损坏的数据库。在生产数据库设置中没有使用它们的理由。在此处列出它们只是供 PostgreSQL 系统开发者使用。此外,在不发出通知的情况下,这些选项在将来的发行版中可能会更改或删除。

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

    • 禁止使用特定的扫描和连接方法: si 分别禁用顺序扫描和索引扫描, obt 分别禁用仅索引扫描、位图索引扫描和 TID 扫描, nmh 分别禁用嵌套循环、合并和哈希连接。

    • 嵌套循环连接和顺序扫描均无法完全禁用;如果优化器有任何其他可供选择的方案, -fs-fn 选项将阻止优化器使用该方案类型。

  • -O

    • 允许更改系统表的结构。 initdb 使用此功能。

  • -P

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

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

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

  • -T

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

  • -v protocol

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

  • -W seconds

    • 在服务器进程执行身份验证过程后,它启动时会出现这样的延时(以秒为单位)。此设置目的是给调试器连接到服务器进程的机会。

Options for Single-User Mode

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

  • —​single

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

  • database

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

  • -E

    • 在执行之前将所有命令发送到标准输出进行回显。

  • -j

    • 使用分号后跟两个换行符,而不仅仅是换行符作为命令条目终结符。

  • -r filename

    • 将所有服务器日志输出发送到 filename 。此选项仅当作为命令行选项提供时才适用。

Environment

  • PGCLIENTENCODING

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

  • PGDATA

    • Default data directory location

  • PGDATESTYLE

    • DateStyle 运行时参数的默认值。(不建议使用此环境变量)。

  • PGPORT

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

Diagnostics

提及 semgetshmget 的失败消息可能表明您需要配置内核以提供足够的共享内存和信号量。有关更多讨论,请参见 Section 19.4 。您也许可以通过降低 shared_buffers 以减少 PostgreSQL 的共享内存消耗,和/或降低 max_connections 以减少信号量消耗,来延迟重新配置内核。

如果建议另一个服务器已经在运行的故障消息,则应仔细检查,例如使用以下命令:

$ ps ax | grep postgres

$ ps -ef | grep postgres

这取决于你的系统。如果你确定没有任何冲突的服务器正在运行,则可以删除该消息中提到的锁文件并重试。

指示无法绑定到端口的错误消息可能表示该端口已被某些非 PostgreSQL 进程使用。如果终止 postgres 并立即使用相同的端口重新启动它,你也会收到此错误;在这种情况下,你只需等待几秒钟直到操作系统关闭端口再重试即可。最后,如果你指定操作系统认为是保留的端口号,也会收到此错误。例如,许多版本的 Unix 认为端口号低于 1024 是“可信”的,并且只允许 Unix 超级用户访问它们。

Notes

实用程序命令 pg_ctl 可用于安全方便地启动和关闭 postgres 服务器。

如果可能, do not 使用 SIGKILL 来关闭主 postgres 服务器。这样做将阻止 postgres 在终止前释放它所保持的系统资源(例如,共享内存和信号量)。这可能会导致启动新的 postgres 运行时出现问题。

要正常终止 postgres 服务器,可以使用信号 SIGTERMSIGINTSIGQUIT 。第一个信号将在所有客户端终止前等待,第二个信号将强制断开所有客户端,第三个信号将立即退出而不进行适当的关闭,从而在重新启动期间导致恢复运行。

SIGHUP 信号将重新加载服务器配置文件。也可以将 SIGHUP 发送到单独的服务器进程,但这通常是不明智的。

要取消正在运行的查询,请向运行该命令的进程发送 SIGINT 信号。要干净地终止后端进程,请向该进程发送 SIGTERM 。另请参见 Section 9.27.2 中的 pg_cancel_backendpg_terminate_backend ,它们是这两种操作的 SQL 可调用等效项。

postgres 服务器使用 SIGQUIT 来指示从属服务器进程在未进行正常清理的情况下终止。此信号 should not 可由用户使用。向服务器进程发送 SIGKILL 也是不明智的——主 postgres 进程会将此解释为崩溃,并将强制所有兄弟进程作为其标准崩溃恢复程序的一部分退出。

Bugs

—​ 选项在 FreeBSD 或 OpenBSD 上不起作用。请改用 -c 。这是受影响操作系统的错误;如果此错误未得到修复,PostgreSQL 的未来版本将提供变通方法。

Single-User Mode

要启动单用户模式服务器,请使用以下命令:

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

使用 -D 提供数据库目录的正确路径,或确保已设置环境变量 PGDATA 。还要指定你想要使用的特定数据库的名称。

通常,单用户模式服务器将换行符视为命令输入终止符;与 psql 中一样,这里没有有关分号的智能信息。要跨多行继续命令,你必须在每个换行符之前(最后一行的除外)键入反斜杠。反斜杠和相邻的换行符都从输入命令中删除。请注意,即使在字符串文本或注释中,也会发生这种情况。

但是,如果你使用 -j 命令行开关,则单个换行符不会终止命令输入;而是分号-换行符-换行符序列终止。也就是说,立即键入一个分号,后跟一个完全空的行。在此模式中,不会对反斜杠-换行符进行特殊处理。同样,也没有有关此类序列出现在字符串字面或注释中的智能信息。

在任何输入模式中,如果你键入的分号不在命令输入终止符之前或不是其一部分,则它被视为命令分隔符。当你键入命令输入终止符时,你输入的多个语句将作为单个事务执行。

要退出会话,请键入 EOF ( Control + D ,通常为)。如果你在最后一个命令输入终止符后输入了任何文本,则 EOF 将被视为命令输入终止符,并且需要另一个 EOF 才能退出。

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

Examples

要在后台使用默认值启动 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.confwork_mem 所做的任何设置。请注意,参数名称中的下划线可在命令行中写成下划线或破折号。除了短期实验,可能最好在 postgresql.conf 中编辑设置,而不是依赖于命令行开关设置参数。

See Also