18.1. 设置参数

所有参数名都是大小写不敏感的。每个参数都可以接受五种类型之一: 布尔、整数、浮点数、字符串,枚举。布尔值可以是(都是大小写无关) onofftruefalseyesno10或这些东西的任意清晰无歧义的前缀。

一些设置指定内存或时间值,其隐含的单位可能是:kB(千字节)、块(通常是 8KB)、 毫秒、秒、分钟等等。隐含单位可以通过引用pg_settings.unit. 获取。为了避免混淆,可以在指定数值的同时指定单位。可用内存单位: kB(千字节),MB(兆字节)和 GB(吉字节);可用时间单位:ms(毫秒), s(秒),min(分钟), h(小时), andd(天)。 内存单位中的"千"等于 1024 ,而不是 1000。

以与字符串参数相同的方式设置"enum"类型的参数,但被限制到一个有限的一组值。 pg_settings.enumvals中有可用值,枚举参数值与大小写无关。

设置这些参数的一个方法是编辑postgresql.conf文件, 它通常在数据目录里(当数据库集的目录初始化的时候,一个缺省的拷贝将会被安装在那)。 比如,下面是一个该文件的例子:

# 这是一个注释
log_connections = yes
log_destination = 'syslog'
search_path = '"$user", public'
shared_buffers = 128MB

像你看到的那样,选项是每条一行。选项名和值之间的等号是可选的。 空白和空行被忽略。井号(#)引入注释。 非简单标识符或者数字必须用单引号包围。如果需要在参数值里嵌入单引号, 要么写两个单引号(推荐方法),要么用反斜扛包围

除了设置参数以外,postgresql.conf文件中还可以使用 include directives在其自身所在位置插入其他文件的内容。 包含指令的语法如下:

include 'filename'

如果文件名不是绝对路径那么将被当作相对于包含指令所属文件的所在目录。 包含可以被嵌套。

主服务器进程每次收到SIGHUP信号(最简单的发送方法就是使用 pg_ctl reload)后都会重新读取这个配置文件。同时主服务器进程 也将这个信号广播给所有正在运行的子服务器进程,这样现有会话也能得到新值。 另外,你可以只向一个服务器进程直接发送信号。有些参数只能在服务器启动的 时候设置;对这些条目的修改将被忽略,直到下次服务器重启。

第二种设置这些配置参数的方法是把它们作为命令行参数传递给 postgres,比如:

postgres -c log_connections=yes -c log_destination='syslog'

命令行选项覆盖postgresql.conf中的选项。 编辑postgresql.conf在运行时改变其数值, 因此,虽然命令行方法很方便,但会付出灵活性的代价。

有时候,给某一个特定会话一个命令行参数也是很有用的。可以在客户端使用 环境变量PGOPTIONS来实现这个目的(可以用于任何基于 libpq的客户端应用,不光是psql):

env PGOPTIONS='-c geqo=off' psql

请注意,这个变量对那些需要在服务器启动后固定的选项或者必须在 postgresql.conf里声明的选项是无效的。

并且,我们可以给一个用户或者一个数据库赋予一套选项设置。在一个会话 开始的时候,装载所涉及到的用户和数据库的缺省设置。命令 ALTER USERALTER DATABASE 分别用于配置这些设置。针对每个数据库的设置将覆盖任何从 postgres命令行或者配置文件收到的设置,然后接着 又被针对每个用户的设置覆盖;最后又会都被针对每个会话的设置覆盖。

一些选项可以在独立的 SQLSQL会话中修改,方法是使用 SET命令,比如:

SET ENABLE_SEQSCAN TO OFF;

如果允许用SET设置,这种针对每个数据库的设置将覆盖任何来自 其它方面的设置。有些参数不能通过SET改变:比如, 如果这些选项不重启动PostgreSQL就无法合理控制其行为。 同样,有些参数只能由超级用户通过SETALTER修改, 而普通用户不能修改。

SHOW命令允许检查所有参数的当前值。

我们也可以用虚表pg_settings (在Section 45.55)里描述)来显示和更新当前会话的运行 时参数。它等效于SHOWSET,但是用起来更方便, 因为它可以和其它表连接起来使用,或者用任意用户需要的选择条件来查询。