设置参数

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 18. 服务器配置 | 下一页

# 18.1. 设置参数

## 18.1.1. 参数名和值

所有参数名都是大小写不敏感的。每个参数都可以接受五种类型之一： 布尔、字符串、整数、浮点数或枚举。类型决定了设置参数的语法：

- 布尔：值可以是(都是大小写无关) `on`、`off`、`true`、 `false`、`yes`、`no`、 `1`、`0`或这些东西的任意清晰无歧义的前缀。

- 字符串: 通常，把值包含在单引号中，双写值中的单引号。如果值是简单的数字或标识符， 那么通常可以省略单引号。

- 数值（整数或浮点数）： 仅允许浮点数有小数点。不要使用千位分隔符。不需要加引号。

- 带单位的数字： 一些数字参数有隐式的单位，因为它们描述存储器或时间的数量。 单位可以是千字节、块（通常是8个千字节）、毫秒、秒或分钟。 这些设定的普通数值将使用该设定的缺省单位，可以在 `pg_settings`.`unit`中查看。 为了方便，可以明确的给出一个设定的单位，例如时间值`'120 ms'`， 它们将转换为任何该参数的实际单位。请注意，要使用该特性， 必须将值写作字符串（加引号）。单位名是大小写敏感的， 并且数值和单位之间可以有空格。

  - 有效的存储单位是`kB`（千字节）、 `MB` (兆字节)、`GB`（千兆字节） 和`TB`（兆兆字节）。存储单元的乘数是1024，不是1000。

  - 有效的时间单位是`ms`（毫秒）、`s`（秒）、 `min`（分钟）、`h`（小时） 和`d`（天）。

- 枚举: 枚举类型的参数和字符串参数的书写方式相同，但是限制为一个值组当中的一个值。 允许的值可以在`pg_settings`.`enumvals`中找到。 枚举参数值是不区分大小写的。

## 18.1.2. 通过配置文件交互参数

设置这些参数的根本途径是编辑`postgresql.conf`文件， 它通常在数据目录里。当数据库集群目录初始化的时候，会安装一个缺省拷贝。比如， 下面是一个该文件的例子：

    # This is a comment
    log_connections = yes
    log_destination = 'syslog'
    search_path = '"$user", public'
    shared_buffers = 128MB

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

以这种方式设置的参数为集群提供了缺省值。活动会话看到的设置将会是这些值， 除非隐藏了它们。下面的章节描述管理员或用户重写这些缺省的方式。

主服务器进程每次收到SIGHUP信号 后都会重新读取这个配置文件， 最简单的发送该信号的方法就是使用来自命令行的`pg_ctl reload` 或者调用SQL函数`pg_reload_conf()`。 同时主服务器进程也将这个信号广播给所有正在运行的服务器进程， 这样现有会话也采用新值（这将在它们完成任何当前正在执行的客户端命令后发生）。 另外，你可以只向一个服务器进程直接发送信号。 有些参数只能在服务器启动的时候设置；对这些条目的修改将被忽略， 直到下次服务器重启。配置文件中的无效参数设置在SIGHUP处理中也被忽略（但已登录）。

除了`postgresql.conf`，PostgreSQL 数据目录包含一个文件 `postgresql.auto.conf`， 它和`postgresql.conf`的格式相同，但是从来不用手动编辑。 这个文件保存通过ALTER SYSTEM命令提供的设置。 在读取`postgresql.conf`时自动读取该文件， 并且它的设置以相同的方式发生作用。`postgresql.auto.conf` 中的设置覆盖`postgresql.conf`中的设置。

## 18.1.3. 通过SQL交互参数

PostgreSQL提供了三个SQL命令创建配置缺省。 已经提过的ALTER SYSTEM命令提供SQL可访问的修改全局缺省的方法； 它在功能上相当于编辑`postgresql.conf`。另外， 还有两个命令允许在每个数据库或每个角色的基础上设置缺省：

- ALTER DATABASE命令允许在每个数据库的基础上重写全局设置。

- ALTER ROLE命令允许用用户指定的值重写全局和每个数据库的设置。

用`ALTER DATABASE`和`ALTER ROLE` 设置的值仅在开始一个新的数据库会话时应用。 它们重写从配置文件或服务器命令行中获取的值，构成其余会话的缺省。 请注意，一些设置在服务器重启后就不能改变了，并且因此不能用这些命令 （或者下面列出的命令）设置。

一旦客户端连接到数据库，PostgreSQL 提供两个额外的SQL命令（和等价的函数）与会话本地配置设置交互：

- SHOW命令允许检查所有参数的当前值。 对应的函数是`current_setting(setting_name text)`。

- SET命令允许修改可以本地设置会话的那些参数的当前值； 它对其他会话没有影响。对应的函数是 `set_config(setting_name, new_value, is_local)`。

另外，系统视图`pg_settings` 可以用来查看和修改会话本地值：

- 查询这个视图类似于使用`SHOW ALL`，但是提供的信息更详细。 它也更加灵活，因为它可以指定过滤条件或链接其他关系。

- 在这个视图上使用UPDATE，明确的更新`setting`字段， 等价于发出`SET`命令。例如：

      SET configuration_parameter TO DEFAULT;

  的等价是：

      UPDATE pg_settings SET setting = reset_val WHERE name = 'configuration_parameter';

## 18.1.4. 通过Shell交互参数

除了在数据库或用户级别设置全局缺省或重写， 还可以通过shell工具传递设置到PostgreSQL。 服务器和libpq客户端库都接受通过shell设置的参数值。

- 在服务器启动期间，可以通过`-c`命令行参数传递参数设置到 `postgres`命令。例如：

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

  以这种方式提供的设置覆盖通过`postgresql.conf`或 `ALTER SYSTEM`提供的设置，所以它们在不重启服务器的情况下是不能全局修改的。

- 当通过libpq启动客户端会话时，可以使用`PGOPTIONS` 环境变量指定参数设置。以这种方式建立的设置组成会话期间的缺省， 但是不影响其他会话。因为历史原因，`PGOPTIONS` 的格式类似于加载`postgres`命令时使用的那样； 特别的，必须指定`-c`标志。例如：

      env PGOPTIONS="-c geqo=off -c statement_timeout=5min" psql

  其他的客户端和库可能会提供它们自己的机制，通过shell或者其他方式， 允许用户不直接使用SQL命令修改会话设置。

## 18.1.5. 管理配置文件内容

PostgreSQL提供几个分离复杂`postgresql.conf` 文件为子文件的特性。这些特性在管理多个相关服务器（但不是完全相同） 的配置时特别有帮助。

除了个别的参数设置，`postgresql.conf`文件可以包含 包含指令，它们指定另一个文件的读取和处理， 就像在这个点插入了那个文件一样。这个特性允许配置文件被分成物理上单独的部分。 包含指令看起来像：

    include 'filename'

如果文件名不是绝对路径，那么它被看成包含引用配置文件目录的相对路径。 可以进行嵌套。

此外，还有一个`include_if_exists`指令，除了被引用的文件不存在或无法读取时， 它的作用和`include`指令是相同的。 规则的`include`会认为这是一个错误条件，但`include_if_exists` 只是记录一条消息，并继续处理引用的配置文件。

`postgresql.conf`文件也包含`include_dir`指令，声明了配置文件的 整个目录，它们看起来像：

     include_dir 'directory'

非绝对路径名被认为和包含引用配置文件的路径相关。在指定的路径中， 只有非目录的文件，其名带有后缀`.conf`的将被包括在内。 也忽略以`.`字符开头的文件名， 为防止自这些文件隐藏在一些平台上以来的出错。 在包含目录中的多个文件按照文件名的顺序进行处理 （根据C语言环境的规则，也就是数字在字母前面，大写字母在小写字母前面）。

包含文件或目录可用于数据库配置逻辑上独立的部分， 而不是单一的`postgresql.conf`文件。 考虑有两个数据库服务器公司， 每一个有不同的内存量。 有可能有配置都共享的元素，比如日志。 但是服务器内存相关参数两者之间不同。 也有可能是服务器特定的自定义。 管理这种情况的方法是打破了自定义配置更改为你的网站的三个文件。 你可以添加这些到你的`postgresql.conf`文件末尾，包括：

     include 'shared.conf'
     include 'memory.conf'
     include 'server.conf'

所有系统可能有同样的`shared.conf`文件。具有特定内存量的每个服务器可以共享 相同的`memory.conf`；可能有8GB内存的服务器，另一个是16GB。 最后`server.conf`可能真正有服务器特定配置文件信息。

另外一个可能是创建配置文件目录，并且将这些信息放入文件中。 比如，`conf.d`目录可能在`postgresql.conf`末尾被引用：

     include_dir 'conf.d'

那么你可以像这样在`conf.d`目录中命名文件：

     00shared.conf
     01memory.conf
     02server.conf

这个命名约定建立了一个这些文件被加载的明确顺序。这是非常重要的， 因为当服务器正在读取配置文件时，只使用参数最后的设置。 在这个例子中，`conf.d/02server.conf`的一些设置会覆盖 `conf.d/01memory.conf`中设置的值。

你可能会使用这个方法更详细的命名文件：

     00shared.conf
     01memory-8GB.conf
     02server-foo.conf

这样的安排使每个配置文件的变化具有唯一名称。 当一些服务器的配置都存储在一个地方的时候，这可以帮助消除歧义。比如版本 控制存储。（版本控制下存储数据库配置文件是另一种很好的做法。）

上一页 | 起始页 | 下一页
服务器配置 | 上一级 | 文件位置