Все имена параметров нечувствительны к регистру. Каждый параметр принимает значение одного из пяти типов: логический (boolean), строковый (string), целый (integer), с плавающей точкой (floating point) или перечислимый (enum). Тип определяет синтаксис установки параметра:
Логический тип (Boolean):
Значения могут быть указаны как
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 (секунды), мин (минуты),
ч (часы) и д (сутки).
Если дробное значение указано с единицей измерения, оно будет округлено
до значения, кратного следующей меньшей единице измерения, если таковая имеется.
Например, 30.1 GB будет преобразовано
в 30822 MB а не в 32319628902 B.
Если параметр имеет целочисленный тип, окончательное округление до целого числа
выполняется после любого преобразования единиц измерения.
Перечислимый тип (Enumerated):
Параметры перечислимого типа записываются так же, как и строковые
параметры, но они могут принимать только одно значение из ограниченного набора
вариантов. Допустимые значения для такого параметра можно узнать из столбца
pg_settings.enumvals.
Значения параметров перечислимого типа нечувствительны к регистру.
Наиболее фундаментальным способом задания этих параметров является редактирование файла
postgresql.conf,
который обычно располагается в каталоге данных. Стандартная копия файла устанавливается при инициализации каталога кластера баз данных. Пример содержания данного файла:
# Это комментарий log_connections = yes log_destination = 'syslog' search_path = '"$user", public' shared_buffers = 128MB
В каждой строке определяется один параметр. Знак равенства между именем и значением параметра не является обязательным. Пробельные символы не учитываются (за исключением строковых значений в кавычках), пустые строки игнорируются. Символы решетки (#) обозначают остаток строки как комментарий. Значения параметров, не являющиеся простыми идентификаторами или числами, должны быть заключены в одиночные кавычки. Для включения одиночной кавычки в значение параметра следует использовать либо две кавычки (предпочтительный вариант), либо комбинацию обратной косой черты с кавычкой. Если файл содержит несколько записей для одного и того же параметра, все они, кроме последней, игнорируются.
Параметры, установленные таким способом, задают значения по умолчанию для всего кластера. В активных сессиях будут использоваться именно эти значения, если они не будут переопределены. В следующих разделах описываются способы, с помощью которых администратор или пользователь может переопределить данные значения по умолчанию.
Конфигурационный файл перечитывается каждый раз, когда основной процесс сервера получает SIGHUP сигнал; данный сигнал проще всего отправить путем выполнения команды pg_ctl reload из командной строки или вызова SQL-функции pg_reload_conf(). Основной процесс сервера также передает этот сигнал всем запущенным серверным процессам, чтобы существующие сессии также применили новые значения параметров (это произойдет после завершения текущей клиентской команды). Кроме того, допускается отправка сигнала непосредственно отдельному процессу сервера. Некоторые параметры
могут быть установлены только при запуске сервера; любые изменения их записей в конфигурационном файле будут игнорироваться до перезапуска сервера. Некорректные значения параметров в конфигурационном файле также игнорируются (с записью в журнал) в процессе SIGHUP обработки.
В дополнение к postgresql.conf,
в Digital Q.DataBase каталог данных содержит файл
postgresql.auto.conf,
имеющий тот же формат, что и postgresql.conf но
предназначенный для автоматического, а не ручного редактирования. В данном файле хранятся
настройки, заданные с помощью команды ALTER SYSTEM .
Данный файл считывается одновременно с файлом postgresql.conf ,
и его параметры вступают в силу аналогичным образом. Настройки
в postgresql.auto.conf переопределяют значения
в postgresql.conf.
Внешние инструменты также могут
изменять postgresql.auto.conf. Не рекомендуется выполнять данную операцию во время работы сервера, за исключением случаев, когда allow_alter_system устанавливается в значение off, поскольку параллельный ALTER SYSTEM команда может перезаписать
такие изменения. Такие инструменты могут просто добавлять новые настройки в конец файла
либо удалять дублирующиеся параметры и/или комментарии
(как это делает ALTER SYSTEM will).
Системное представление
pg_file_settings
может быть полезно для предварительного тестирования изменений в конфигурационных файлах или для диагностики проблем, если SIGHUP сигнал не привел к желаемому результату.
Digital Q.DataBase предоставляет три SQL-команды
для задания значений конфигурации по умолчанию.
Уже упомянутая ALTER SYSTEM команда
предоставляет доступный через SQL способ изменения глобальных значений по умолчанию; она функционально эквивалентна редактированию postgresql.conf.
Кроме того, существуют две команды, позволяющие устанавливать значения по умолчанию
на уровне отдельных баз данных или ролей:
Команда ALTER DATABASE позволяет переопределять глобальные
настройки на уровне отдельной базы данных.
Команда ALTER ROLE команда позволяет переопределять как глобальные настройки, так и
параметры конкретной базы данных пользовательскими значениями.
Значения, заданные с помощью ALTER DATABASE и ALTER ROLE
применяются только при инициации нового сеанса работы с базой данных. Они переопределяют значения, полученные из конфигурационных файлов или командной строки сервера, и становятся значениями по умолчанию для оставшейся части сеанса. Обратите внимание, что некоторые параметры нельзя изменить после запуска сервера, поэтому их невозможно задать с помощью этих (или перечисленных ниже) команд.
После подключения клиента к базе данных Digital Q.DataBase предоставляет две дополнительные SQL-команды (и эквивалентные функции) для взаимодействия с локальными параметрами конфигурации сеанса:
Команда SHOW позволяет просматривать текущее значение любого параметра. Соответствующей SQL-функцией является
current_setting(setting_name text)
(см. Раздел 2.6.28.1).
Команда SET команда позволяет изменять
текущее значение тех параметров, которые могут быть установлены локально в рамках
сеанса; это не оказывает влияния на другие сеансы.
Многие параметры могут быть установлены таким способом любым пользователем, но некоторые могут
быть заданы только суперпользователями и пользователями, которым были
предоставлены SET привилегии для данного параметра.
Соответствующая SQL-функция —
set_config(setting_name, new_value, is_local)
(см. Раздел 2.6.28.1).
Кроме того, системное представление pg_settings может использоваться для просмотра и изменения локальных значений сеанса:
Выполнение запросов к данному представлению аналогично использованию команды SHOW ALL но
предоставляет более подробные сведения. Данный способ также более гибок, поскольку он позволяет
задавать условия фильтрации или выполнять соединение с другими отношениями.
Использование команды UPDATE в данном представлении, в частности,
обновление значения в setting эквивалентно
выполнению SET команд. Например, эквивалентом команды
SET configuration_parameter TO DEFAULT;
является:
UPDATE pg_settings SET setting = reset_val WHERE name = 'configuration_parameter';
Помимо установки глобальных значений по умолчанию или назначения переопределений на уровне базы данных или роли, параметры можно передавать в Digital Q.DataBase через средства командной оболочки. Как сервер, так и libpq клиентская библиотека принимают значения параметров через командную оболочку.
При запуске сервера значения параметров могут быть
переданы в программу postgres команда через
-c имя=значение параметр командной строки или его эквивалент
--имя=значение вариант. Например,
postgres -c log_connections=yes --log-destination='syslog'
Параметры, заданные данным способом, переопределяют значения, установленные через
postgresql.conf или ALTER SYSTEM,
поэтому их невозможно изменить глобально без перезапуска сервера.
При запуске клиентского сеанса через libpq,
значения параметров могут быть
определены с помощью PGOPTIONS переменной окружения. Настройки, установленные данным способом, являются значениями по умолчанию в течение всего сеанса, но не влияют на другие сеансы. По историческим причинам формат PGOPTIONS аналогичен используемому
при запуске команды postgres
; в частности, необходимо указывать параметр -cили префикс
--перед именем параметра. Например,
env PGOPTIONS="-c geqo=off --statement-timeout=5min" psql
Другие клиентские приложения и библиотеки могут предоставлять собственные механизмы (через командную оболочку или иным способом), позволяющие пользователю изменять параметры сеанса без прямого использования SQL-команд.
Digital Q.DataBase предоставляет несколько функций для декомпозиции сложных postgresql.conf файлов на подфайлы.
Данные функции особенно полезны при управлении несколькими серверами
с похожими, но не идентичными конфигурациями.
В дополнение к значениям отдельных параметров, postgresql.conf файл может содержать директивы
include, которые определяют другой файл для чтения и обработки так, как если бы
он был вставлен в конфигурационный файл в данной точке. Данная
функция позволяет разделить конфигурационный файл на физически
обособленные части. Директивы include имеют следующий вид:
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; например, один файл для всех серверов с 8 ГБ ОЗУ, а другой — для серверов с 16 ГБ. И, наконец, 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
Подобная организация обеспечивает уникальное имя для каждого варианта конфигурационного файла. Это позволяет исключить неоднозначность в случаях, когда конфигурации нескольких серверов хранятся в одном месте, например, в репозитории системы управления версиями. (Хранение конфигурационных файлов базы данных в системе управления версиями является еще одной рекомендуемой практикой.)