TeleDB提供了一些特性用于把复杂的 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
这种形式的安排为每个配置文件变体给定了一个唯一的名称。当多个服务器把它们的配置全部存储在一个位置(例如在一个版本控制仓库中)时,这可以帮助消除歧义(在版本控制下存储数据库配置文件是另一个值得考虑的好方法)。
TeleDB通常将配置文件拆分为 postgresql.conf和postgresql.conf.user文件,postgresql.conf文件中配置通用的,实例初始化运行必要的参数;postgresql.conf.user中配置由实例初始化化时模版提供的通用配置参数,postgresql.conf.user文件中参数设置优先级更高,当两个配置文件中有相同参数设置时,postgresql.conf中的设置将被postgresql.conf.user覆盖;在控制台页面修改的参数,将记录在postgresql.conf.user中。
不建议使用ALTER SYSTEM来修改参数,该方式修改的参数值会被记录在postgresql.auto.conf中,该配置文件参数加载优先级高于postgresql.conf.user和postgresql.conf,将覆盖这两个配置文件中的参数,会导致通过控制台页面修改参数无法生效的问题。