Настройка параметров

Имена и значения параметров

Имена всех параметров нечувствительны к регистру. Каждый параметр принимает значение одного из пяти типов: логический, строка, целое число, число с плавающей запятой или перечисление. От типа зависит синтаксис, применяемый для установки этого параметра:

  • Логический: Значения могут вводиться как on, off, true, false, yes, no, 1, 0 (все без учета регистра) или любым однозначным префиксом одного из них.

  • Строка: Обычно значение заключается в апострофы, при этом внутренние апострофы самого значения дублируются. Однако если значение является простым числом или идентификатором, апострофы обычно можно опустить. (Значения, совпадающие с каким-либо ключевым словом SQL, в некоторых контекстах все же требуют заключения в апострофы.)

  • Число (целое или с плавающей запятой): Числовые параметры можно указывать в обычных форматах, принятых для целого числа и числа с плавающей запятой; если параметр имеет целочисленный тип, дробные значения округляются до ближайшего целого числа. Кроме того, целочисленные параметры дополнительно принимают шестнадцатеричные (с префиксом 0x) и восьмеричные (с префиксом 0) значения, но эти форматы не могут быть дробными. Разделители разрядов использовать нельзя. Кавычки требуются только для шестнадцатеричного значения.

  • Число с единицей измерения: Некоторые числовые параметры имеют неявную единицу измерения, поскольку описывают количество памяти или времени. Этой единицей измерения могут быть байты, килобайты, блоки (обычно восемь килобайт), миллисекунды, секунды или минуты. При указании только числового значения для одного из таких параметров будет использована единица измерения, установленная для него по умолчанию, которую можно узнать из pg_settings.unit. Для удобства параметры можно задать, явно указав единицу измерения, например '120 ms' для значения времени, которая будет преобразована в фактическую единицу измерения параметра. Обратите внимание, что для применения этой функции значение следует записывать в виде строки (в апострофах). Название единицы измерения чувствительно к регистру, а между ним и числовым значением можно ставить пробел.

    • Допустимые единицы памяти: B (байты), kB (килобайты), MB (мегабайты), GB (гигабайты) и TB (терабайты). Множитель для единиц памяти равен 1024, а не 1000.

    • Допустимые единицы времени: us (микросекунды), ms (миллисекунды), s (секунды), min (минуты), h (часы) и d (дни).

    Если с единицей измерения задается дробное значение, оно будет округлено до кратного следующей меньшей единицы, если таковая имеется. Например, 30.1 GB будут преобразованы в 30822 MB, а не в 32319628902 B. Если параметр имеет целочисленный тип, после любого преобразования единицы измерения значение окончательно округляется до целого.

  • Перечисление: Параметры перечислимого типа задаются так же, как и строковые параметры, но имеют ограниченный набор значений. Допустимые значения для такого параметра можно найти в pg_settings.enumvals. Значения перечислимых параметров нечувствительны к регистру.


Взаимодействие с параметрами через файл конфигурации

Самый основной способ установить эти параметры — отредактировать файл qhb.conf, который обычно хранится в каталоге данных. Его копия по умолчанию устанавливается при инициализации каталога кластера базы данных. Пример того, как может выглядеть этот файл:

# Это комментарий
log_connections = yes
log_destination = 'syslog'
search_path = '"$user", public'
shared_buffers = 128MB

В каждой строке указывается один параметр. Знак равенства между именем и значением необязателен. Пробелы не играют роли (за исключением значения параметра, заключенного в апострофы), а пустые строки игнорируются. Знаки решетки (#) обозначают оставшуюся часть строки как комментарий. Значения параметров, которые не являются простыми идентификаторами или числами, должны быть заключены в апострофы. Чтобы вставить апостроф в само значение параметра, удвойте его (желательно) или добавьте перед ним обратный слэш. Если файл содержит несколько определений одного и того же параметра, то все они, кроме последнего, игнорируются.

Параметры, установленные таким образом, предоставляют значения по умолчанию для данного кластера. Эти значения будут настройками, видимыми в активных сеансах, если не будут переопределены. В следующих разделах описываются способы, которыми администратор или пользователь могут переопределить эти значения по умолчанию.

Файл конфигурации перечитывается всякий раз, когда основной процесс сервера получает сигнал SIGHUP; этот сигнал легче всего отправить, запустив qhb_ctl reload в командной строке или вызвав функцию SQL pg_reload_conf(). Основной процесс сервера передает этот сигнал всем запущенным в данный момент процессам сервера, так что существующие сеансы тоже принимают новые значения (это произойдет после того, как они завершат любую выполняемую в данный момент клиентскую команду). Как вариант, этот сигнал можно отправить напрямую одному из серверных процессов. Некоторые параметры можно установить только при запуске сервера; любые изменения их значений в файле конфигурации будут игнорироваться до перезапуска сервера. При обработке SIGHUP также игнорируются (но протоколируются в журнале) неверные значения параметров в файле конфигурации.

В дополнение к qhb.conf каталог данных QHB содержит файл qhb.auto.conf, который имеет тот же формат, что и qhb.conf, но предназначен для редактирования автоматически, а не вручную. Этот файл содержит параметры, настраиваемые командой ALTER SYSTEM. Он считывается одновременно с qhb.conf, и заданные в нем параметры действуют аналогичным образом. Параметры в qhb.auto.conf переопределяют параметры в qhb.conf.

Внешние средства также могут изменять qhb.auto.conf, но не рекомендуется делать это во время работы сервера, поскольку параллельное выполнение команды ALTER SYSTEM может перезаписать подобные изменения. Такие программы могут просто добавлять новые настройки параметров в конец файла или удалять дубликаты определений и/или комментарии (как делает ALTER SYSTEM).

Системное представление pg_file_settings может быть полезно для предварительной проверки изменений в файлах конфигурации или для диагностики проблем, если сигнал SIGHUP не дает желаемых результатов.


Взаимодействие с параметрами через SQL

QHB предоставляет три команды SQL для установки параметров конфигурации по умолчанию. Уже упомянутая команда ALTER SYSTEM предоставляет средства изменения глобальных значений по умолчанию, доступные для SQL; функционально она равнозначна редактированию qhb.conf. Кроме того, есть еще две команды, которые позволяют устанавливать значения по умолчанию на уровне базы данных или роли:

  • Команда ALTER DATABASE позволяет переопределять глобальные параметры на уровне базы данных.

  • Команда ALTER ROLE позволяет переопределять для конкретного пользователя как глобальные параметры, так и параметры на уровне базы данных.

Значения, установленные с помощью команд ALTER DATABASE и ALTER ROLE, применяются только при запуске нового сеанса базы данных. Они переопределяют значения, полученные из файлов конфигурации или командной строки сервера, и назначаются значениями по умолчанию до конца сеанса. Обратите внимание, что некоторые параметры нельзя изменить после запуска сервера, и поэтому их невозможно установить с помощью этих или перечисленных ниже команд.

После подключения клиента к базе данных он может воспользоваться двумя дополнительными командами SQL (и равнозначными им функциями), предоставляемыми QHB для взаимодействия с локальными параметрами конфигурации сеанса:

  • Команда SHOW позволяет проверить текущее значение всех параметров. Соответствующая функция SQL — current_setting(имя_параметра text) (см. подраздел Функции для параметров конфигурации).

  • Команда SET позволяет изменять текущее значение тех параметров, которые могут быть установлены локально для сеанса; это не влияет на другие сеансы. Соответствующая функция SQL — set_config(имя_параметра text, новое_значение text, локальный boolean) (см. подраздел Функции для параметров конфигурации).

Кроме того, для просмотра и изменения локальных значений сеанса можно воспользоваться системным представлением pg_settings:

  • Запрос этого представления аналогичен использованию команды SHOW ALL, но выдает более подробную информацию. Этот подход также более гибкий, так как позволяет задавать условия фильтрации или объединять результат с другими отношениями.

  • Использование UPDATE в этом представлении, в частности, обновление столбца setting, равнозначно выполнению команд SET. Например, команде

    SET configuration_parameter TO DEFAULT;
    

    равнозначен запрос:

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

Взаимодействие с параметрами через командную оболочку

Помимо установки глобальных значений по умолчанию или добавления переопределений на уровне базы данных или роли параметры QHB можно задавать с помощью средств оболочки. Через оболочку значения параметров принимают и сервер, и клиентская библиотека libpq.

  • Во время запуска сервера значения параметров можно передать команде qhb посредством параметра командной строки -c. Например:

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

    Параметры, предоставленные таким образом, переопределяют те, что были заданы в qhb.conf или командой ALTER SYSTEM, поэтому их нельзя изменить глобально без перезапуска сервера.

  • При запуске клиентского сеанса через libpq настройку параметров можно провести с помощью переменной среды PGOPTIONS. Значения, установленные таким образом, назначаются значениями по умолчанию до конца сеанса, но не влияют на другие сеансы. По историческим причинам формат PGOPTIONS похож на тот, что используется при запуске команды qhb; в частности, здесь следует указывать флаг -c. Например:

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

    Другие клиенты и библиотеки могут предоставлять собственные механизмы (через оболочку или иным образом), позволяющие пользователю изменять параметры сеанса без непосредственного выполнения команд SQL.


Управление содержимым файла конфигурации

QHB предоставляет несколько функций для разбиения сложных файлов qhb.conf на вложенные файлы. Эти функции особенно полезны при управлении несколькими серверами со связанными, но не идентичными конфигурациями.

Помимо значений отдельных параметров файл qhb.conf может содержать директивы включения, благодаря которым другой файл будет прочитан и обработан, как если бы он был вставлен в данное место файла конфигурации. Эта особенность позволяет разделить файл конфигурации на физически отдельные части. Директивы включения записываются просто:

include 'имя_файла'

Если в параметре имя_файла не задается абсолютный путь к нему, то путь рассматривается относительно каталога, содержащего включающий файл конфигурации. Включения файлов могут быть вложенными.

Существует также директива include_if_exists, которая действует так же, как include, за исключением случаев, когда указанный файл не существует или не может быть прочитан. Обычная директива include будет считать это условием возникновения ошибки, но include_if_exists просто выводит сообщение и продолжает обрабатывать включающий файл конфигурации.

Файл qhb.conf также может содержать директивы include_dir, где можно задать весь каталог файлов конфигурации, который нужно включить. Они записываются так:

include_dir 'каталог'

Если в параметре каталог не задается абсолютный путь к нему, то путь рассматривается относительно каталога, содержащего включающий файл конфигурации. В указанном каталоге будут включены только файлы, не являющиеся каталогами, с именами, заканчивающимися суффиксом .conf. Имена файлов, начинающиеся с символа «.», также игнорируется во избежание ошибок, поскольку такие файлы являются скрытыми на некоторых платформах. Множество файлов во включаемом каталоге обрабатывается в порядке их имен (в соответствии с правилами языка C/RUST, т. е. цифры идут перед буквами, а заглавные буквы — перед строчными).

Включение файлов или каталогов можно использовать для логического разделения конфигурации базы данных на части, вместо того чтобы вести один большой файл qhb.conf. Рассмотрим компанию с двумя серверами баз данных, каждый с разным объемом памяти. Скорее всего, у их конфигураций есть общие элементы, которые будут использоваться, например, для ведения журнала. Но параметры, связанные с памятью, у них будут различаться. Также у каждого сервера могут быть и специфические параметры. Один из способов справиться с этой ситуацией — разбить изменения стандартной конфигурации вашей сети на три файла. Для их включения требуется добавить в конец файла qhb.conf следующую запись:

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

Общие для всех серверов параметры будут помещаться в shared.conf. Все серверы с определенным объемом памяти могут использовать общий файл memory.conf; один файл для всех серверов с 8 ГБ ОЗУ, другой — для серверов с 16 ГБ. И, наконец, server.conf может содержать действительно специфические для каждого сервера параметры конфигурации.

Другая возможность — создать каталог с файлами конфигурации и поместить эту информацию в файлы. Например, можно указать каталог conf.d в конце qhb.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

Такая расстановка дает уникальное имя для каждого варианта файла конфигурации. Это может помочь устранить неоднозначность, когда конфигурации нескольких серверов хранятся в одном месте, например, в репозитории системы управления версиями. (Хранение файлов конфигурации базы данных в системе управления версиями — это еще одна удачная методика, которую стоит рассмотреть.)