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 时启用了断言,此选项才可用;如果是这样,默认值为开。
-Bnbuffers设置供服务器进程使用的共享缓冲区数量。该参数的默认值由initdb自动选择。指定此选项等效于设置shared_buffers配置参数。
-cname=value设置一个命名的运行时参数。PostgreSQL支持的配置参数见第 18 章。大多数其他命令行选项实际上都是这种参数赋值的简写形式。
-c可以出现多次以设置多个参数。-ddebug-level设置调试级别。该值设得越高,写入服务器日志的调试输出就越多。取值范围是 1 到 5。还可以针对某个特定会话传入
-d 0,从而阻止父postgres进程的服务器日志级别传播到该会话。-Ddatadir指定数据目录或配置文件的文件系统位置。详见第 18.2 节。
-e将默认日期风格设置为“European”,即输入日期字段采用
DMY顺序。这也会在某些日期输出格式中使日期显示为日在月前。更多信息见第 8.5 节。-F禁用
fsync调用以提高性能,但在系统崩溃时会有数据损坏的风险。指定此选项等效于禁用fsync配置参数。使用前请先阅读详细文档!-hhostname指定
postgres用来侦听来自客户端应用的 TCP/IP 连接的 IP 主机名或地址。该值也可以是逗号分隔的地址列表,或者用*指定侦听所有可用接口。空值表示不侦听任何 IP 地址,在这种情况下只能使用 Unix 域套接字连接到服务器。默认只侦听 localhost。指定此选项等效于设置listen_addresses配置参数。-i允许远程客户端通过 TCP/IP(Internet 域)连接。没有此选项时,只接受本地连接。该选项等效于在
postgresql.conf中,或通过-h将listen_addresses设置为*。该选项已被弃用,因为它无法访问listen_addresses的全部功能。通常最好直接设置
listen_addresses。-kdirectory指定
postgres监听来自客户端应用连接的 Unix 域套接字的目录。默认通常是/tmp,但可以在构建时更改。-l启用使用SSL的安全连接。若要使用此选项,PostgreSQL必须在编译时启用 SSL支持。关于使用SSL的更多信息,请参阅第 17.8 节。
-Nmax-connections设置该服务器将接受的最大客户端连接数。该参数的默认值由initdb自动选择。指定此选项等效于设置max_connections配置参数。
-oextra-options在
extra-options中指定的命令行形式选项,会传给由这个postgres进程启动的所有服务器进程。如果选项字符串中包含空格,整个字符串必须加引号。此选项已过时;服务器进程的所有命令行选项都可以直接在
postgres命令行上指定。-pport指定
postgres用来侦听客户端应用连接的 TCP/IP 端口或本地 Unix 域套接字文件扩展名。默认值取自PGPORT环境变量;如果PGPORT未设置,则默认值就是在编译期间确定的值(通常为 5432)。如果你指定了非默认端口,那么所有客户端应用都必须通过命令行选项或PGPORT指定相同的端口。-s在每条命令结束时打印时间信息和其他统计信息。这对基准测试或者调整缓冲区数量很有用。
-Swork-mem指定内部排序和散列操作在转而使用临时磁盘文件之前可使用的内存量。有关
work_mem配置参数的说明,请参阅第 18.4.1 节。--name=value设置一个命名的运行时参数;这是
-c的较短形式。--describe-config该选项会以制表符分隔的
COPY格式导出服务器内部配置变量、说明以及默认值。它主要是为管理工具设计的。
半内部选项
这里描述的选项主要用于调试,并且在某些情况下可协助恢复严重损坏的数据库。在生产数据库环境中没有理由使用它们。这里列出这些选项,仅供PostgreSQL 系统开发者使用。此外,这些选项在未来版本中可能会更改或被移除,且不另行通知。
-f{ s | i | m | n | h }禁止使用特定的扫描和连接方法:
s和i分别禁用顺序扫描和索引扫描,而n、m和h分别禁用嵌套循环、归并和哈希连接。顺序扫描和嵌套循环连接都无法被完全禁用;
-fs和-fn选项只是在优化器有其他选择时,尽量不使用这些计划类型。-n此选项用于调试导致服务器进程异常终止的问题。在这种情况下,通常的策略是通知所有其他服务器进程必须终止,然后重新初始化共享内存和信号量。这是因为出错的服务器进程可能在终止前破坏了某些共享状态。此选项指定
postgres不重新初始化共享数据结构。经验丰富的系统程序员随后可以使用调试器检查共享内存和信号量的状态。-O允许修改系统表的结构。该选项由
initdb使用。-P读取系统表时忽略系统索引,但在修改表时仍然更新这些索引。这在从损坏的系统索引中恢复时很有用。
-tpa[rser] | pl[anner] | e[xecutor]打印与各个主要系统模块相关的每个查询的时间统计信息。该选项不能与
-s选项一起使用。-T此选项用于调试导致服务器进程异常终止的问题。在这种情况下,通常的策略是通知所有其他服务器进程必须终止,然后重新初始化共享内存和信号量。这是因为出错的服务器进程可能在终止前破坏了某些共享状态。此选项指定
postgres通过发送SIGSTOP信号暂停所有其他服务器进程,但不使它们终止。这允许系统程序员手工收集所有服务器进程的核心转储。-vprotocol指定特定会话要使用的前端/后端协议版本号。该选项仅供内部使用。
-Wseconds新服务器进程在完成认证过程后,会延迟这么多秒。这是为了给调试器附着到该服务器进程提供机会。
单用户模式的选项
以下选项仅适用于单用户模式。
--single选择单用户模式。这必须是命令行上的第一个参数。
database指定要访问的数据库名称。这必须是命令行上的最后一个参数。如果省略,则默认为用户名。
-E回显所有命令。
-j禁用换行符作为语句分隔符。
-rfilename将所有服务器日志输出发送到
filename。在正常的多用户模式下,该选项会被忽略,所有进程都使用stderr。
环境
PGCLIENTENCODING客户端使用的默认字符编码。(客户端可以单独覆盖它。)该值也可以在配置文件中设置。
PGDATA默认数据目录位置
PGDATESTYLEDateStyle运行时参数的默认值。(该环境变量的用法已被弃用。)
PGPORT默认端口(最好在配置文件中设置)
TZ服务器时区。
诊断
提到semget或
shmget的失败消息,很可能表明你需要配置内核,以提供足够的共享内存和信号量。更多讨论见第 17.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 信号。
postgres 服务器使用 SIGTERM 通知下级服务器进程正常退出,使用 SIGQUIT 在不做正常清理的情况下终止。这些信号不应由用户使用。向一个服务器进程发送SIGKILL同样是不明智的—主postgres进程会把这解释为一次崩溃,并作为其标准崩溃恢复过程的一部分,强制所有兄弟进程退出。
缺陷
--选项在FreeBSD或OpenBSD上不起作用。请改用-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
这条命令将启动postgres,通过端口 1234 通信。为了使用psql连接到这个服务器,你需要这样运行它:
$psql -p 1234
或者设置环境变量PGPORT:
$export PGPORT=1234$psql
命名的运行时参数可以采用以下任一种形式设置:
$postgres -c work_mem=1234$postgres --work-mem=1234
两种形式都会覆盖
postgresql.conf中可能存在的
work_mem设置。请注意,参数名中的下划线在命令行中既可以写成下划线,也可以写成连字符。除了短期实验之外,与其依赖命令行开关来设置参数,通常更好的做法是直接编辑
postgresql.conf中的设置。