PostgreSQL 13.1 中文入门教程 PostgreSQL postgres

2024-02-25 开发教程 PostgreSQL 13.1 中文入门教程 匿名 2

postgres — PostgreSQL数据库服务器

大纲

postgres[选项...]

描述

postgres是PostgreSQL数据库服务器。一个客户端应用为了能访问一个数据库,它会(通过一个网络或者本地)连接到一个运行着的postgres实例。该postgres实例接着会开始一个独立的服务器进程来处理该连接。

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

默认情况下,postgres会在前台启动并将日志消息打印到标准错误流。但在实际应用中,postgres应当作为一个后台进程启动,而且多数是在系统启动时自动启动。

postgres还能在单用户模式中被调用。这种模式的主要用途是在启动过程中由initdb使用。有时候它也被用于调试或者灾难性恢复。注意,运行一个单用户模式服务器并不真地适合调试服务器,因为不会发生实际的进程间通信和锁定。当从 shell 中调用单用户模式时,用户可以输入查询并且结果会被以一种更适合开发者阅读(不适合普通用户)的形式打印在屏幕上。在单用户模式中,会话用户将被设置为 ID 为 1 的用户,并且这个用户会被隐式地赋予超级用户权限。该用户不必实际存在,因此单用户模式运行可以被用来对某些意外损坏的系统目录进行手工恢复。

选项

postgres接受下列命令行参数。关于这些选项的详细讨论请参考第 19 章。你也可以通过设置一个配置文件来减少键入大部分这些选项。有些(安全)选项还可以从连接的客户端以一种与应用相关只应用于会话的方法设置。例如,如果设置了PGOPTIONS环境变量,那么基于 libpq的客户端将都把那个字符串传递给服务器,它将被服务器解释成postgres命令行选项。

通用选项

-B nbuffers

设置被服务器进程使用的共享内存缓冲区数量。这个参数的默认值是initdb自动选择的。指定这个选项等效于设置shared_buffers配置参数。

-c name=value

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

-C name

打印命名运行时参数的值,并且退出(详见上面的-c选项)。这可以被用在一个运行服务器上,并且从postgresql.conf中返回值,这些值可能被在这次调用中的任何参数修改过。它并不反映集簇启动时提供的参数。

这个选项用于与一个服务器实例交互的其他程序来查询配置参数值,例如pg_ctl。面向用户的应用应该使用SHOW或者 pg_settings视图。

-d debug-level

设置调试级别。数值设置得越高,写到服务器日志的调试输出就越多。取值范围是从 1 到 5。还可以针对某个特定会话使用-d 0来阻止父postgres进程的服务器日志级别被传播到这个会话。

-D datadir

指定数据库配置文件的文件系统位置。详见第 19.2 节。

-e

把默认日期风格设置为“European”,也就是输入日期域的顺序是DMY。这也导致在一些日期输出格式中把日打印在月之前。详见第 8.5 节。

-F

禁用fsync调用以提高性能,但是要冒系统崩溃时数据损坏的风险。指定这个选项等效于禁用fsync配置参数。在使用之前阅读详细文档!

-h hostname

指定postgres监听来自客户端应用 TCP/IP 连接的 IP 主机名或地址。该值也可以是一个用逗号分隔的地址列表,或者*表示监听所有可用的地址。一个空值表示不监听任何 IP 地址,在这种情况下可以使用 Unix 域套接字连接到服务器。缺省只监听localhost。声明这个选项等效于设置listen_addresses配置参数。默认只监听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的更多信息,请参考第 18.9 节。

-N max-connections

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

-o extra-options

extra-options中指定的命令行风格的参数会被传递给所有由这个postgres进程派生的服务进程。

extra-options中的空格被视作 参数分隔符,除非用反斜线(\)转义。要表示一个字面意 义上的反斜线,可以写成\\。通过多次使用-o也可以指定多个参数。

这个选项的使用已经被废弃。用于服务器进程的所有命令行选项可以在postgres命令行上直接指定。

-p port

指定postgres用于监听客户端应用连接的 TCP/IP 端口或本地 Unix 域套接字文件扩展。默认为PGPORT环境变量的值。如果PGPORT没有设置,那么默认值是编译期间设立的值(通常是 5432)。如果你指定了一个非默认端口,那么所有客户端应用都必须用命令行选项或者PGPORT指定同一个端口。

-s

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

-Swork-mem

指定在使用临时磁盘文件之前排序和散列表使用的基本内存量。 请参阅 第 19.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 }

禁止某种扫描和连接方法的使用:si分别禁用顺序和索引扫描, obt分别禁用只用索引扫描、位图索引扫描以及 TID 扫描,而nmh则分别禁用嵌套循环、归并和哈希连接。

顺序扫描和嵌套循环连接都不可能完全被禁用。-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中。 只有在作为一个命令行选项提供时,这个选项才会兑现。

环境

PGCLIENTENCODING

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

PGDATA

默认的数据目录位置。

PGDATESTYLE

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

PGPORT

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

诊断

一个提到了semgetshmget的错误消息可能意味着你需要配置内核来提供足够的共享内存和信号量。更多讨论请见第 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服务器,可以使用SIGTERMSIGINT或者SIGQUIT信号。第一个在退出前将等待所有客户端终止,第二个将强行断开所有客户端的连接,第三个会不做正确的关闭立即退出并且会导致重启时的恢复。

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

要取消一个正在运行的查询,可以向运行该查询的进程发送SIGINT信号。要干净地终止一个后端进程,可向它发送SIGTERM。在 SQL 中可调用的与这两种动作等效的命令可参考第 9.27.2 节中的 pg_cancel_backendpg_terminate_backend

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 &

要用指定端口启动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