postgres是PostgreSQL数据库服务器。 客户端应用程序为了访问数据库,将通过TCP Socket或Unix domain socket连接到一个运行中的postgres实例。 然后该postgres实例将启动(fork)一个新的、独立的服务器进程来处理这个连接。
一个postgres总是管理来自同一个数据库集群的数据。一个数据库集群是一组在同一个文件系统位置("数据区")存放数据的数据库。 一个系统上可以同时运行多个postgres实例,只要他们使用不同的数据区和不同的端口号(见下文)。 postgres启动时需要知道数据区的位置,该位置必须通过-D选项或PGDATA环境变量指定。 通常,-D或PGDATA都直接指向由initdb创建的集群目录。其他可能的文件布局在Section 18.2里面有讨论。
缺省时postgres在前台启动并将日志信息输出到标准错误。 但在实际应用中,postgres应当作为后台进程启动,而且多数是在系统启动时自动启动。
postgres还能以单用户模式运行。这种用法的主要用于initdb的初始化过程中。 有时候它也被用于调试灾难性恢复。不过,单用户模式运行的服务器并不适合于调试, 因为没有实际的进程间通讯和锁动作发生。当从shell上以单用户模式调用时, 用户可以输入查询,然后结果会在屏幕上以一种更适合开发者阅读(不适合普通用户)的格式显示出来。 在单用户模式下,将把会话用户ID设为1并赋予超级用户权限。 该用户不必实际存在,因此单用户模式运行的服务器可以用于对某些意外损坏的系统表进行手工恢复。
postgres接受下列命令行参数。关于这些选项的更详细讨论请参考Chapter 18。你也可以通过设置一个配置文件来减少敲击这些选项。 有些(安全的)选项还可以从连接过来的客户端设置,以一种应用无关的方法仅对该会话生效。 比如,如果设置了PGOPTIONS环境变量,那么基于libpq的客户端就都把那个字符串传递给服务器, 并被服务器解释成postgres命令行选项。
打开运行时断言检查,是检测编程错误的调试帮助。 只有在编译PostgreSQL时打开了它,你才能使用它。如果编译时打开了,缺省是打开。
为服务器进程分配和管理的共享内存缓冲区数量。 这个参数的缺省值是initdb自动选择的。 声明这个选项相当于设置shared_buffers配置参数。
设置一个命名的运行时参数。PostgreSQL 支持的配置参数在Chapter 187里描述。 大多数其它命令行选项实际上都是这样的参数赋值的短形式。-c可以出现多次从而设置多个参数。
设置调试级别。数值越高,写到服务器日志的调试输出越多。取值范围是1到5。 还可以针对某次单独的会话使用-d 0来防止从父postgres进程继承日志级别。
声明数据目录或者配置文件的文件系统路径。 细节详见Section 18.2。
把缺省日期风格设置为"European",也就是说用DMY规则解释日期输入, 并且在一些日期输出格式里日子在月份前面打印。参阅Section 8.5获取更多细节。
关闭fsync
调用以提高性能,但是要冒系统崩溃时数据毁坏的风险。
声明这个选项等效关闭了fsync参数。在使用之前阅读详细文档!
指定postgres侦听来自前端应用 TCP/IP 连接的IP主机名或地址。 数值也可以是一个用空格分隔的地址列表,或者*表示监听所有可用的地址。 空值表示不监听任何IP地址,而只使用Unix域套接字与客户端通信。 缺省只监听localhost。声明这个选项等效于设置listen_addresses配置参数。
这个选项允许远程客户通过TCP/IP(网际域套接字)与服务器通讯。 没有这个选项,服务器将只接受本地连接。这个选项等效于在postgresql.conf中 或者通过-h选项将listen_addresses设为*。
这个选项已经废弃了,因为它不能实现listen_addresses的所有功能。所以最好直接设置listen_addresses。
指定postgres侦听来自前端应用连接的Unix域套接字的目录。 缺省通常是/tmp,但是可以在编译的时候修改。
这个选项使用SSL进行的安全通讯。要使用这个选项, 编译PostgreSQL时你必须打开了SSL支持。有关使用SSL的信息,请参考Section 17.8。
设置该服务器将接受的最大客户端连接数木。该参数的默认值由initdb自动选择。 指定这个选项相当于设置max_connections配置参数。
在extra-options里面指定的命令行选项将被传递给所有由这个postgres派生的服务进程。 如果选项字符串包含任何空白,那么整个字符串必须用引号界定。
反对使用该选项,所有服务器进程的命令行选项都可以直接在postgres命令行上指定,不必这么麻烦。
指定postgres侦听客户端连接的TCP/IP端口或本地Unix domain socket文件的扩展。 缺省的端口号是环境变量PGPORT的值。如果PGPORT没有设置,那么缺省是PostgreSQL编译时指定 的值(通常是5432)。如果你声明了一个非缺省端口,那么所有前端应用都必须用命令行选 项或者PGPORT声明同一个端口。
在每条命令结束时打印时间信息和其它统计信息。这个开关对测试性能和调节缓冲区数量有好处。
声明内部排序和散列在求助于临时磁盘文件之前可以使用的内存数量。 参阅Section 18.4.1里描述的配置变量work_mem。
设置一个命名的运行时参数;其缩写形式是 -c.
以制表符分隔的COPY格式,导出服务器内部配置变量、描述、缺省值。 设计它主要是给管理工具使用。
这里描述的选项主要用于调试目的,在某些情况下协助恢复受损严重的数据库。 应该没有原因在生产数据库设置中使用它们。他们被列在这里进为了PostgreSQL 系统开发者使用。此外,这些选项可能在将来的版本中更改或删除而不另行通知。
禁止某种扫描和连接方法的使用:s和i分别关闭顺序和索引扫描, 而n,m,h分别关闭嵌套循环,融合(merge)和Hash连接。
顺序扫描和嵌套循环都不可能完全被关闭。-fs和-fn选项仅仅是在存在其它方法时阻碍优化器使用这些方法罢了。
该选项主要用于调试导致服务器进程异常崩溃的问题。对付这种情况的一般策略是通知所有其它服务器进程终止并重新初始化共享内存和信号灯。 这是因为一个出错的服务器进程可能在终止之前就已经对共享的东西造成了破坏。 该选项指定postgres不重新初始化共享数据结构。一个有经验的系统程序员这时就可以使用调试器检查共享内存和信号灯状态。
允许修改系统表的结构。这个参数用于initdb。
读取系统表时忽略系统索引(但在更改数据时仍然更新索引)。 这对于从索引已经损坏的系统表中回复是很有帮助的。
打印与每个主要系统模块相关的查询记时统计。它不能和-s选项一起使用。
该选项主要用于调试导致服务器进程异常崩溃的问题。 对付这种情况的一般策略是通知所有其它服务器进程终止并重新初始化共享内存和信号灯。 这是因为一个出错的服务器进程可能在终止之前就已经对共享的东西造成了破坏。 该选项指定postgres通过发送SIGSTOP信号停止其他所有服务器进程,但是并不让它们退出。 这样就允许系统程序员手动从所有服务器进程搜集内核转储。
声明这次会话使用的前/后服务器协议的版本数。该选项仅在内部使用。
一旦看见这个选项,进程就睡眠标出的秒数。这样就给开发者一些时间把调试器附着在该服务器进程上。
客户端使用的缺省字符编码。客户端可以独立地覆盖它。这个值也可以在配置文件里设置。
缺省数据目录位置。
运行时参数DateStyle的缺省值。现在反对使用该环境变量。
Default port number (preferably set in the configuration file) 缺省端口(最好在配置文件中设置)。
服务器的时区。
一个提到了semget或shmget的错误信息可能意味着你需要重新配置你的内核, 提供足够的共享内存和信号灯。更多讨论,参阅Section 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信号。
主postgres服务器进程向子进程发送SIGTERM信号让它们正常退出; 发送SIGQUIT信号立即退出且不做清理工作,用户应当尽量避免使用该信号。 同时,发送SIGKILL信号也是不明智的:主postgres进程将把这个信号当作崩溃信号, 然后会强制其他兄弟进程作为标准的崩溃回复过程退出。
启动一个单用户模式的服务器:
postgres --single -D /usr/local/pgsql/data other-optionsmy_database
用-D给服务器提供正确的数据库目录的路径, 或者确保环境变量PGDATA已经正确设置。同时还要声名你想用的特定数据库名字。
通常,独立运行的服务器把换行符当做命令输入完成字符;它还不懂分号的作用,因为那些东西是在psql里的。 要想把一行分成多行写,你必需在除最后一个换行符以外的每个换行符前面敲一个反斜杠。
但是如果使用了-j命令行选项,新行将不被当作命令结束符。此时服务器将从标准输入一直读取到EOF标志为止, 然后把把所有读到的内容当作一个完整的命令字符串看待,并且反斜杠与换行符也被当作普通字符来看待。
输入EOF(Control+D)即可退出会话。如果你已经使用了-j则必须连续使用两个EOF才行。
请注意单用户模式运行的服务器不会提供复杂的行编辑功能(比如,没有命令行历史)。
用缺省值在后台启动postgres:
$ nohup postgres >logfile 2>&1 </dev/null &
在指定的端口启动postgres:
$ postgres -p 1234
这条命令将在端口1234启动postgres。你应该这样使用psql与之连接:
$ psql -p 1234
或者设置环境变量PGPORT:
$ export PGPORT=1234 $ psql
命名的运行时参数可以用下列的风格之一设置:
$ postgres -c work_mem=1234 $ postgres --work-mem=1234
两种形式都覆盖那些现有的在postgresql.conf里面的work_mem设置。 请注意在参数名里的下划线在命令行上可以写成下划线,也可以写成连字符。 除了用于短期的实验以外,更好的习惯是编辑postgresql.conf里面的设置, 而不是倚赖命令行开关设置参数。