Конфигурация сервера

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

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

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

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

  • Логический: Значения могут вводиться как 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(setting_name text) (см. подраздел Функции настройки конфигурации).

  • Команда SET позволяет изменять текущее значение тех параметров, которые могут быть установлены локально для сеанса; это не влияет на другие сеансы. Соответствующая функция SQL — 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';

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

Помимо установки глобальных значений по умолчанию или добавления переопределений на уровне базы данных или роли, параметры 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, т. е. цифры идут перед буквами, а заглавные буквы — перед строчными).

Включение файлов или каталогов можно использовать для логического разделения конфигурации базы данных на части, вместо того чтобы вести один большой файл 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, переопределит значение, заданное в .d/01memory.conf.

Вместо этого можно использовать этот подход для описательного именования файлов:

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

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

Расположение файлов

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

data_directory (string)

Задает каталог, в котором будут храниться данные. Этот параметр можно установить только при запуске сервера.

config_file (string)

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

hba_file (string)

Задает файл конфигурации для проверки подлинности по узлу (обычно он называется qhb_hba.conf). Этот параметр можно установить только при запуске сервера.

ident_file (string)

Задает файл конфигурации для сопоставлений имен пользователей (обычно он называется qhb_ident.conf). Этот параметр можно задать только при запуске сервера.

external_pid_file (string)

Задает имя дополнительного файла с идентификатором процесса (PID), который сервер должен создать для использования программами администрирования сервера. Этот параметр можно установить только при запуске сервера.

При установке по умолчанию ни один из вышеперечисленных параметров не устанавливается явно. Вместо этого каталог данных указывается параметром командной строки -D или переменной среды PGDATA, и все файлы конфигурации находятся в каталоге данных.

Если требуется сохранить файлы конфигурации не в каталоге данных, параметр командной строки QHB -D или переменная среды PGDATA должны указывать на каталог, содержащий файлы конфигурации, а в qhb.conf (или в командной строке) должен быть задан параметр data_directory, чтобы показать, где на самом деле находится каталог данных. Обратите внимание, что data_directory переопределяет путь, заданный в -D и PGDATA как расположение каталога данных, но не расположение файлов конфигурации.

При желании можно задать имена файлов конфигурации и их пути по отдельности, используя параметры config_file, hba_file и/или ident_file. config_file можно указывать только в командной строке QHB, но остальные параметры можно задать в основном файле конфигурации. Если все три параметра и data_directory установлены явно, указывать -D или PGDATA необязательно.

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

Подключения и аутентификация

Параметры подключения

listen_addresses (string)

Задает адреса TCP/IP, по которым сервер должен принимать подключения от клиентских приложений. Значение имеет форму разделенного запятыми списка имен хостов и/или числовых IP-адресов. Специальная запись * соответствует всем доступным IP-интерфейсам. Запись 0.0.0.0 позволяет прослушивать все адреса IPv4, а :: — все адреса IPv6. Если список пуст, сервер вообще не прослушивает ни один IP-интерфейс, и в этом случае для подключения к нему можно использовать только сокеты домена Unix. Значением по умолчанию является localhost, что позволяет устанавливать только локальные «петлевые» подключения по TCP/IP. Хотя аутентификация клиента позволяет скрупулезно управлять доступом к серверу, listen_addresses определяет, через какие именно интерфейсы будут приниматься соединения, что может помочь предотвратить злонамеренные попытки подключения через незащищенные сетевые интерфейсы. Этот параметр можно задать только при запуске сервера.

port (integer)

TCP-порт, который прослушивает сервер; по умолчанию это 5432. Обратите внимание, что этот номер порта используется для всех IP-адресов, через которые сервер принимает подключения. Этот параметр можно задать только при запуске сервера.

max_connections (integer)

Определяет максимальное количество одновременных подключений к серверу базы данных. По умолчанию обычно это 100 подключений, но может быть и меньше, если настройки ядра не будут это поддерживать (что определяется в процессе initdb). Этот параметр можно задать только при запуске сервера.

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

superuser_reserved_connections (integer)

Определяет количество «слотов» подключений, которые зарезервированы для суперпользователей QHB. В большинстве случаев подключения max_connections могут быть активными одновременно. Всякий раз, когда число активных одновременных подключений больше или равно max_connections минус superuser_reserved_connections, новые подключения будут приниматься только от суперпользователей, а подключения для репликации приниматься не будут.

По умолчанию резервируется три соединения. Это значение должно быть меньше значения max_connections. Этот параметр можно задать только при запуске сервера.

unix_socket_directories (string)

Задает каталог сокетов Unix-домена, через которые сервер должен принимать подключения от клиентских приложений. Можно создать несколько сокетов, перечислив несколько каталогов, разделенных запятыми. Пробелы между записями игнорируются; если в имени каталога требуются пробелы или запятые, заключите его в кавычки. Пустое значение указывает, что сервер не принимает подключения через сокеты домена Unix, и в этом случае к нему можно подключиться только по TCP/IP. Значением по умолчанию обычно является /tmp, но его можно изменить во время сборки. Этот параметр можно задать только при запуске сервера.

В дополнение к самому файлу сокета, который называется .s.PGSQL.nnnn, где nnnn — это номер порта сервера, в каждом из каталогов unix_socket_directories будет создан обычный файл с именем .s.PGSQL.nnnn.lock. Эти файлы ни в коем случае нельзя удалять вручную.

unix_socket_group (string)

Задает группу-владельца сокетов Unix-домена. (Пользователем-владельцем сокетов всегда является пользователь, запускающий сервер). В сочетании с параметром unix_socket_permissions этот параметр можно использовать в качестве дополнительного механизма управления доступом для подключений через сокеты Unix-домена. По умолчанию это пустая строка, что делает владельцем группу по умолчанию пользователя сервера. Этот параметр можно задать только при запуске сервера.

unix_socket_permissions (integer)

Задает права доступа к сокетов Unix-домена. Для этих сокетов применяется обычный набор разрешений файловой системы Unix. Ожидается, что значение параметра будет иметь числовой вид, указанный в формате, принимаемом системными функциями chmod и umask. (Для использования обычного восьмеричного формата число должно начинаться с 0 (нуля).)

Разрешения по умолчанию — 0777, при которых подключаться к сокету могут все. Разумными альтернативами являются 0770 (доступ имеет только пользователь и группа, см. также unix_socket_group) и 0700 (доступ имеет только пользователь). (Обратите внимание, что для сокетов Unix-домена имеет значение только право на запись, поэтому нет смысла устанавливать или отзывать права на чтение или выполнение.)

Этот параметр можно задать только при запуске сервера.

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

bonjour (boolean)

Включает оповещение о существование сервера посредством Bonjour. По умолчанию выключен. Этот параметр можно задать только при запуске сервера.

bonjour_name (string)

Задает имя службы в среде Bonjour. Если для этого параметра задана пустая строка, '' (это значение по умолчанию), то в качестве имени службы используется имя компьютера. Этот параметр игнорируется, если сервер был скомпилирован без поддержки Bonjour. Этот параметр можно задать только при запуске сервера.

tcp_keepalives_idle (integer)

Задает время бездействия сети, по истечении которого операционная система должна отправлять клиенту сигнал TCP о поддержании активного состояния. Если это значение указано без единиц измерения, оно считается заданным в секундах. При значении 0 (по умолчанию) выбирается значение, принятое по умолчанию в операционной системе. Этот параметр поддерживается только в системах, поддерживающих TCP_KEEPIDLE или равнозначный ему параметр сокета; в других системах он должен быть равен нулю. В сеансах, подключенных через сокеты Unix-домена, этот параметр игнорируется и всегда считается равным нулю.

tcp_keepalives_interval (integer)

Задает время, по истечении которого следует повторно передать сигнал TCP о поддержании активного состояния, если получение предыдущего сигнала не было подтверждено клиентом. Если это значение указано без единиц измерения, оно считается заданным в секундах. При значении 0 (по умолчанию) выбирается значение, принятое по умолчанию в операционной системе. Этот параметр поддерживается только в системах, поддерживающих TCP_KEEPINTVL или равнозначный ему параметр сокета; в других системах он должен быть равен нулю. В сеансах, подключенных через сокеты домена Unix, этот параметр игнорируется и всегда считается равным нулю.

tcp_keepalives_count (integer)

Задает количество сигналов TCP о поддержании активного состояния, которые могут быть потеряны до того, как соединение сервера с клиентом будет считаться прерванным. При значении 0 (по умолчанию) выбирается значение, принятое по умолчанию в операционной системе. Этот параметр поддерживается только в системах, поддерживающих TCP_KEEPCNT или равнозначный ему параметр сокета; в других системах он должен быть равен нулю. В сеансах, подключенных через сокеты домена Unix, этот параметр игнорируется и всегда считается равным нулю.

tcp_user_timeout (integer)

Задает время, в течение которого передаваемые данные могут оставаться неподтвержденными, прежде чем TCP-соединение будет принудительно закрыто. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. При значении 0 (по умолчанию) выбирается значение, принятое по умолчанию в операционной системе. Этот параметр поддерживается только в системах, поддерживающих TCP_USER_TIMEOUT или равнозначный ему параметр сокета; в других системах он должен быть равен нулю. В сеансах, подключенных через сокеты домена Unix, этот параметр игнорируется и всегда считается равным нулю.

Аутентификация

authentication_timeout (integer)

Максимальное время, за которое должна завершиться аутентификация клиента. Если потенциальный клиент не завершил протокол аутентификации за это время, сервер закрывает соединение. Это не дает зависшим при подключении клиентам занимать соединение неограниченно долго. Если это значение указано без единиц измерения, оно считается заданным в секундах. Значение по умолчанию составляет одну минуту (1m). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

password_encryption (enum)

Если в CREATE ROLE или ALTER ROLE указан пароль, этот параметр определяет алгоритм, которым тот будет зашифрован. Значением по умолчанию является md5, то есть пароль сохраняется в виде хэша MD5 (также в качестве псевдонима для md5 допускается значение on). При значении scram-sha-256 пароль зашифруется алгоритмом SCRAM-SHA-256.

Обратите внимание, что старые клиенты могут не поддерживать механизм аутентификации SCRAM и, следовательно, не будут работать с паролями, зашифрованными алгоритмом SCRAM-SHA-256.

krb_server_keyfile (string)

Задает путь к файлу ключей Kerberos для данного сервера. Если в качестве значения задается пустая строка, то используется значение по умолчанию, зависящее от системы. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

krb_caseins_users (boolean)

Определяет, должны ли имена пользователей GSSAPI обрабатываться без учета регистра. По умолчанию установлено значение off (регистр учитывается). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

db_user_namespace (boolean)

Этот параметр позволяет относить имена пользователей к базам данных. По умолчанию установлено значение off (выключен). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

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

Если этот параметр включен, вы все равно можете создавать обычных глобальных пользователей. Для этого достаточно добавить @ при указании имени пользователя в клиенте, например joe@. Символ @ будет удален раньше, чем сервер найдет имя пользователя.

db_user_namespace вызывает расхождения в представлении имени пользователя на стороне клиента и сервера. Проверка подлинности всегда выполняется с именем на стороне сервера, поэтому методы аутентификации должны настраиваться по серверному имени пользователя, а не клиентскому. Поскольку метод аутентификации md5 использует имя пользователя в качестве соли как на стороне клиента, так и на стороне сервера, при включенном параметре db_user_namespace этот метод использовать нельзя.

SSL

ssl (boolean)

Разрешает подключения SSL. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Значение по умолчанию — off (выключен).

ssl_ca_file (string)

Задает имя файла, содержащего сертификаты центров сертификации (ЦС) для SSL- сервера. Относительные пути рассматриваются от каталога данных. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. По умолчанию этот параметр пуст, то есть файл ЦС не загружается, и проверка клиентских сертификатов не выполняется.

ssl_cert_file (string)

Задает имя файла, содержащего сертификат SSL-сервера. Относительные пути рассматриваются от каталога данных. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Значение по умолчанию — server.crt.

ssl_crl_file (string)

Задает имя файла, содержащего список отзыва сертификатов (CRL, Certificate Revocation List) для SSL-сервера. Относительные пути рассматриваются от каталога данных. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. По умолчанию этот параметр пуст, то есть файл CRL не загружается.

ssl_key_file (string)

Задает имя файла, содержащего закрытый ключ SSL-сервера. Относительные пути рассматриваются от каталога данных. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Значение по умолчанию — server.key.

ssl_ciphers (string)

Задает список наборов шифров SSL, которые разрешено использовать для SSL- соединений. Синтаксис этого параметра и список поддерживаемых значений можно найти на странице руководства по шифрам в пакете OpenSSL. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Значение по умолчанию — HIGH:MEDIUM:+3DES:!aNULL. Обычно это разумный выбор, если у вас нет особых требований к безопасности.

Объяснение значения по умолчанию:

-   *HIGH* — наборы шифров, в которых используются шифры из группы HIGH
    (например, AES, Camellia, 3DES)

-   *MEDIUM* — наборы шифров, в которых используются шифры из группы MEDIUM
    (например, RC4, SEED)

-   *+3DES* — порядок OpenSSL по умолчанию для HIGH проблематичен, потому
    что он ставит 3DES выше, чем AES128. Это неправильно, поскольку 3DES
    менее безопасен, чем AES128, и работает гораздо медленнее. Включение
    *+3DES* меняет этот порядок, размещая 3DES после всех других шифров
    групп HIGH и MEDIUM.

-   *!aNULL* — выключает наборы анонимных шифров, не требующие
    аутентификации. Такие наборы уязвимы для атак через посредника, и
    поэтому не должны использоваться.

Доступные наборы шифров и их свойства зависят от версии OpenSSL. Чтобы увидеть фактическую информацию о них для текущей установленной версии OpenSSL, используйте команду openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL'. Обратите внимание, что этот список фильтруется во время выполнения, в зависимости от типа ключа сервера.

ssl_prefer_server_ciphers (boolean)

Определяет, следует ли отдавать предпочтение шифрам SSL-сервера, а не клиента. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Значение по умолчанию — on (включен).

Обычно лучше использовать шифры сервера, так как в его конфигурации менее вероятны ошибки.

ssl_ecdh_curve (string)

Задает имя кривой для использования при обмене ключами ECDH. Эту кривую должны поддерживать все подключающиеся клиенты. Это необязательно должна быть та же кривая, с которой был получен ключ эллиптической кривой сервера. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Значение по умолчанию — prime256v1.

Имена OpenSSL для наиболее распространенных кривых: prime256v1 (NIST P-256), secp384r1 (NIST P-384), secp521r1 (NIST P-521). Полный список доступных кривых можно получить с помощью команды openssl ecparam -list_curves. Однако не все из них пригодны для TLS.

ssl_min_protocol_version (enum)

Задает минимальную версию протокола SSL/TLS, которую можно использовать. Допустимые на данный момент значения: TLSv1, TLSv1.1, TLSv1.2, TLSv1.3. Старые версии библиотеки OpenSSL поддерживают не все значения; при выборе неподдерживаемой версии возникнет ошибка. Версии протокола до TLS 1.0, а именно SSL v.2 и v.3, в любом случае не работают.

Значение по умолчанию — TLSv1, в основном для поддержки старых версий библиотеки OpenSSL. Возможно, имеет смысл установить более высокое значение, если все применяемые у вас программные компоненты могут поддерживать более новые версии протокола.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

ssl_max_protocol_version (enum)

Задает максимальную версию протокола SSL/TLS, которую можно использовать. Допустимые значения такие же, как у параметра ssl_min_protocol_version, плюс пустая строка, означающая, что допускается любая версия протокола. По умолчанию разрешена любая версия. Установка максимальной версии протокола полезна прежде всего для тестирования или в случаях, когда у некоторых компонентов возникают проблемы при работе с более новым протоколом.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

ssl_dh_params_file (string)

Задает имя файла, содержащего параметры алгоритма Диффи-Хеллмана, используемые для так называемого эфемерного семейства DH-шифров SSL. По умолчанию этот параметр пуст, то есть используются параметры DH, скомпилированные по умолчанию. Применение нестандартных параметров DH повышает защиту, если злоумышленнику удается взломать хорошо известные скомпилированные параметры DH. Собственный файл с параметрами DH можно создать с помощью команды openssl dhparam -out dhparams.pem 2048.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

ssl_passphrase_command (string)

Задает внешнюю команду, которая будет вызываться, когда потребуется получить парольную фразу для расшифровки SSL-файла, например закрытого ключа. По умолчанию этот параметр пуст, то есть используется встроенный механизм запроса.

Эта команда должна вывести парольную фразу на устройство стандартного вывода и завершиться с кодом 0. В значении параметра %p заменяется строкой приглашения. (Напишите %%, чтобы вывести литерал %). Обратите внимание, что строка приглашения, вероятно, будет содержать пробелы, поэтому потребуется заключить ее в кавычки. Если в конце имеется один перевод строки, он будет удален при выводе.

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

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

ssl_passphrase_command_supports_reload (boolean)

Этот параметр определяет, будет ли заданная параметром ssl_passphrase_command команда запроса пароль также вызываться при перезагрузке конфигурации, если для файла ключа нужна парольная фраза. Если этот параметр выключен (по умолчанию), то ssl_passphrase_command будет игнорироваться при перезагрузке, и конфигурация SSL не будет перезагружаться, если требуется парольная фраза. Этот параметр подходит для команды, которой для ввода пароля требуется терминал TTY, который может быть недоступен во время работы сервера. Включение этого параметра может быть целесообразно, если, например, пароль считывается из файла.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Потребление ресурсов

Память

shared_buffers (integer)

Задает объем памяти, который будет использовать сервер базы данных для буферов общей памяти. Значение по умолчанию обычно составляет 128 мегабайт (128MB), но может быть и меньше, если параметры ядра не будут его поддерживать (это определяется в процессе initdb). Значение этого параметра не должно быть меньше 128 килобайт. Однако для поддержания хорошей производительности обычно требуются значения гораздо выше минимальных. Если это значение указано без единиц измерения, оно считается заданным в блоках, размер которых равен BLCKSZ байтов (обычно это 8 КБ). (Значения BLCKSZ, отличные от принятых по умолчанию, изменяют минимально допустимое значение.) Этот параметр можно задать только при запуске сервера.

Если у вас есть выделенный сервер базы данных с объемом ОЗУ 1 ГБ или более, разумное начальное значение для shared_buffers составляет 25% от объема памяти в вашей системе. Существуют варианты рабочей нагрузки, при которых эффективны еще большие значения shared_buffers, но поскольку QHB также использует и кэш операционной системы, выделение для shared_buffers более 40% ОЗУ вряд ли повысит эффективность. При увеличении значения shared_buffers обычно требуется соответствующее увеличение max_wal_size, чтобы растянуть процесс записи большого объема новых или измененных данных на более длительный период времени.

В системах с объемом ОЗУ меньше 1 ГБ целесообразно установить меньший процент ОЗУ, чтобы оставить достаточно места для операционной системы.

huge_pages (enum)

Определяет, будут ли запрашиваться огромные страницы из основной области общей памяти. Допустимые значения: try (по умолчанию), on и off. Если в параметре huge_pages установлено try, сервер будет пытаться запросить огромные страницы, но в случае сбоя вернется к поведению по умолчанию. При значении on, если получить огромные страницы не удастся, сервер не запустится. При значении off огромные страницы запрашиваться не будут.

В настоящее время этот параметр поддерживается только в Linux. Во всех других системах значение try игнорируется.

Использование огромных страниц приводит к уменьшению таблиц страниц и сокращению затрат времени ЦП на управление памятью, что повышает производительность.

Обратите внимание, что этот параметр влияет только на основную область общей памяти. Операционные системы, такие как Linux, FreeBSD и Illumos, также могут автоматически использовать огромные страницы (также называемые «суперстраницами» или «большими» страницами) для обычного выделения памяти без явного запроса со стороны QHB. В Linux это называется «прозрачными огромными страницами» (ТНР, Transparent Huge Pages). Известно, что эта функция может привести к снижению производительности QHB для некоторых пользователей в некоторых версиях Linux, поэтому использовать ее в настоящее время не рекомендуется (в отличие от явного использования huge_pages).

temp_buffers (integer)

Задает максимальный объем памяти, выделяемый для временных буферов в каждом сеансе базы данных. Это существующие исключительно в рамках сеанса буферы, используемые только для доступа к временным таблицам. Если это значение указано без единиц измерения, оно считается заданным в блоках, размер которых равен BLCKSZ байтов (обычно это 8 КБ). По умолчанию используется восемь мегабайтов (8MB). (Если BLCKSZ не равен 8 КБ, значение по умолчанию масштабируется пропорционально ему). Этот параметр можно менять в отдельном сеансе, но только до первого обращения к временным таблицам; последующие попытки изменить его значение не будут влиять на этот сеанс.

Сеанс будет выделять временные буферы по мере необходимости до предела, заданного temp_buffers. При установке большого значения в сеансах, которым на самом деле не нужно много временных буферов, память расходуется только на дескриптор буфера, который занимает 64 байта, за приращение в temp_buffers. Однако если буфер действительно используется, он будет дополнительно занимать 8192 байта (или, в общем случае, BLCKSZ байтов).

max_prepared_transactions (integer)

Задает максимальное количество транзакций, которые могут одновременно находиться в «подготовленном» состоянии (см. PREPARE TRANSACTION). Установка этого параметра в ноль (по умолчанию) выключает функцию подготовленных транзакций. Этот параметр можно задать только при запуске сервера.

Если вы не планируете использовать подготовленные транзакции, следует установить этот параметр на ноль, чтобы предотвратить случайное создание подготовленных транзакций. Если же вы используете подготовленные транзакции, имеет смысл, чтобы max_prepared_transactions был не меньше, чем max_connections, чтобы можно было подготовить транзакцию в каждом сеансе.

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

work_mem (integer)

Задает максимальный объем памяти, который будет использоваться в операциях при обработке запроса (например, для сортировки или хэш-таблиц) перед записью во временные файлы на диске. Если это значение указано без единиц измерения, оно считается заданным в килобайтах. Значение по умолчанию составляет четыре мегабайта (4MB). Обратите внимание, что в сложном запросе могут параллельно выполняться несколько операций сортировки или хэширования, причем указанный в этом значении объем памяти может использоваться в каждой операции, прежде чем та начнет записывать данные во временные файлы. Кроме того, такие операции могут выполняться одновременно в нескольких запущенных сеансах. Следовательно, общая используемая память может многократно превышать значение параметра work_mem; это необходимо учитывать при выборе значения. Операции сортировки применяются для ORDER BY, DISTINCT и объединений слиянием. Хэш-таблицы применяются в хэш-соединениях, агрегировании по хэшу и обработке подзапросов IN с использованием хэша.

maintenance_work_mem (integer)

Задает максимальный объем памяти, который будет использоваться операциями обслуживания, такими как VACUUM, CREATE INDEX и ALTER TABLE ADD FOREIGN KEY. Если это значение указано без единиц измерения, оно считается заданным в килобайтах. Значение по умолчанию составляет 64 мегабайта (64MB). Поскольку в один момент времени сеансом базы данных может быть выполнена только одна из этих операций, и обычно они не выполняются параллельно, можно без опасений сделать это значение значительно выше, чем work_mem. Увеличение этого параметра может повысить производительность операций очистки и восстановления дампов базы данных.

Обратите внимание, что при запуске операции автовакуума этот объем памяти может быть выделен до autovacuum_max_workers раз, поэтому постарайтесь не делать значение по умолчанию слишком большим. Возможно, лучше будет управлять выделяемым для автовакуума объемом памяти отдельно, с помощью параметра autovacuum_work_mem.

autovacuum_work_mem (integer)

Задает максимальный объем памяти, который будет использоваться каждым рабочим процессом автовакуума. Если это значение указано без единиц измерения, оно считается заданным в килобайтах. По умолчанию используется значение -1, указывающее, что вместо этого параметра следует использовать значение maintenance_work_mem. Этот параметр не влияет на поведение команды VACUUM при запуске в других контекстах. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

max_stack_depth (integer)

Задает максимальную безопасную глубину стека исполнения сервера. Идеальным значением для этого параметра является фактический предел размера стека, установленный ядром (который задается командой ulimit -s или ее локальным эквивалентом), за вычетом запаса прочности примерно в мегабайт. Запас прочности необходим, потому что глубина стека проверяется не в каждой подпрограмме на сервере, а только в ключевых потенциально рекурсивных подпрограммах. Если это значение указано без единиц измерения, оно считается заданным в килобайтах. Значение по умолчанию составляет два мегабайта (2MB), что дает небольшой запас и вряд ли приведет к сбою. Однако этого может быть недостаточно для выполнения сложных функций. Только суперпользователи могут изменять этот параметр.

Если установить max_stack_depth выше фактического лимита ядра, то функция с неограниченной рекурсией может вызвать сбой отдельного процесса сервера. На платформах, где QHB может определить предел, установленный ядром, сервер не допустит, чтобы для этой переменной было задано небезопасное значение. Однако не все платформы предоставляют подобную информацию, поэтому при выборе значения рекомендуется соблюдать осторожность.

shared_memory_type (enum)

Определяет реализацию разделяемой памяти, которую сервер должен использовать при работе с основной областью разделяемой памяти, содержащей общие буферы QHB и другие общие данные. Возможные значения: mmap (для выделения анонимных блоков разделяемой памяти с помощью mmap) и sysv (для выделения разделяемой памяти System V с помощью shmget). Не все варианты поддерживаются на разных платформах; первый из поддерживаемых данной платформой вариантов становится для нее реализацией по умолчанию. Использовать sysv, которая нигде не выбирается по умолчанию, в принципе не рекомендуется, потому что с ней для выделения большого объема памяти обычно требуются нестандартные настройки ядра.

dynamic_shared_memory_type (enum)

Определяет реализацию динамической общей памяти, которую должен использовать сервер. Возможные значения: posix (для выделения общей памяти POSIX с помощью shm_open), sysv (для выделения общей памяти System V с помощью shmget) и mmap (для эмуляции общей памяти посредством отображения в памяти файлов, хранящихся в каталоге данных). Не все варианты поддерживаются на разных платформах; первый из поддерживаемых данной платформой вариантов становится для нее реализацией по умолчанию. Использовать mmap, которая нигде не выбирается по умолчанию, в принципе не рекомендуется, поскольку операционная система может многократно записывать измененные страницы на диск, увеличивая нагрузку на системные потоки ввода-вывода; однако это может быть полезно при отладке, когда каталог pg_dynshmem хранится на RAM-диске или когда другие реализации общей памяти недоступны.

Диск

temp_file_limit (integer)

Задает максимальный объем дискового пространства, который один процесс может использовать для временных файлов, например при сортировке и хэшировании или при сохранении удерживаемого курсора. Транзакция, пытающаяся превысить этот лимит, будет отменена. Если это значение указано без единиц измерения, оно считается заданным в килобайтах. Значение -1 (по умолчанию) означает отсутствие ограничений. Только суперпользователи могут изменять этот параметр.

Этот параметр ограничивает общий объем, занимаемый в текущий момент всеми временными файлами, используемыми данным процессом QHB. Следует отметить, что в этом ограничении не учитывается дисковое пространство, занимаемое явными временными таблицами; ограничивается только объем временных файлов, используемых за кадром при выполнении запросов.

Использование ресурсов ядра

max_files_per_process (integer)

Задает максимальное количество одновременно открытых файлов, разрешенное для каждого подпроцесса сервера. По умолчанию это тысяча файлов. Если ядро устанавливает безопасный лимит для каждого процесса, об этом параметре можно не беспокоиться. Но на некоторых платформах (особенно в большинстве систем BSD) ядро позволяет отдельным процессам открывать гораздо больше файлов, чем фактически может поддерживать система в случае, если столько же файлов одновременно открыло бы сразу несколько процессов. Если вы столкнетесь с ошибками «Too many open files» (Слишком много открытых файлов), попробуйте уменьшить значение этого параметра. Этот параметр можно задать только при запуске сервера.

Задержка очистки по стоимости

Во время выполнения команд VACUUM и ANALYZE система ведет внутренний счетчик, который фиксирует оценочную стоимость различных выполняемых операций ввода- вывода. Когда накопленная стоимость достигает предела (указанного в параметре vacuum_cost_limit), процесс, выполняющий операцию, на некоторое время перейдет в спящий режим, как указано в параметре vacuum_cost_delay. Затем он сбросит счетчик и продолжит выполнять операцию.

Цель этой функции — позволить администраторам уменьшить влияние процессов ввода/ вывода этих команд на параллельную работу базы данных. Во многих ситуациях быстрое завершение команд обслуживания, таких как VACUUM и ANALYZE, не имеет значения; однако, как правило, очень важно, чтобы эти команды не оказывали значительного влияния на способность системы выполнять другие операции с базой данных. Администраторы могут этого добиться с помощью задержки очистки по стоимости.

Эта функция по умолчанию выключена для команд VACUUM, введенных вручную. Чтобы ее включить, установите для переменной vacuum_cost_delay ненулевое значение.

vacuum_cost_delay (floating point)

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

При настройке интенсивности такой очистки подходящие значения для vacuum_cost_delay обычно довольно малы, вплоть до 1 миллисекунды и менее. Несмотря на то, что в этом параметре можно задать значения в долях миллисекунды, на старых платформах такие задержки могут быть неточными. На таких платформах увеличение интенсивности VACUUM по сравнению с уровнем, получаемым при задержке в 1 мс, потребует изменения других параметров стоимости очистки. Тем не менее, стоит сохранять столь малое значение vacuum_cost_delay, какое ваша платформа в состоянии измерить; большие задержки не будут полезны.

vacuum_cost_page_hit (integer)

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

vacuum_cost_page_miss (integer)

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

vacuum_cost_page_dirty (integer)

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

vacuum_cost_limit (integer)

Накопленная стоимость, по достижении которой процесс очистки перейдет в спящий режим. Значение по умолчанию — 200.

Примечание
Существуют определенные операции, которые устанавливают критические блокировки и поэтому должны завершаться как можно быстрее. Во время таких операций задержка очистки по стоимости не проводится, поэтому накопленная за это время стоимость может намного превышать указанный предел. Во избежание ненужных длительных задержек в таких случаях, фактическая задержка рассчитывается как vacuum_cost_delay * accumulated_balance / vacuum_cost_limit и ограничивается максимумом vacuum_cost_delay * 4.

Фоновая запись

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

bgwriter_delay (integer)

Задает задержку между раундами активности процесса фоновой записи. В каждом раунде этот процесс производит запись некоторого количества грязных буферов (это настраивается следующими параметрами). Затем он засыпает на время bgwriter_delay, после чего все повторяется. Когда в пуле нет грязных буферов, процесс засыпает на более долгий срок, независимо от значения параметра bgwriter_delay. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — 200 миллисекунд (200ms). Обратите внимание, что во многих системах эффективное разрешение задержек сна составляет 10 миллисекунд; если задать в bgwriter_delay значение, не кратное 10, на практике можно получить такой же результат, что и со следующим за ним значением, кратным 10. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

bgwriter_lru_maxpages (integer)

Максимальное количество буферов, которое процесс фоновой записи будет записывать в каждом раунде. Установка этого значения в ноль выключает фоновую запись. (Обратите внимание, что это не затрагивает контрольные точки, которые управляются отдельным выделенным вспомогательным процессом.) Значение по умолчанию — 100 буферов. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

bgwriter_lru_multiplier (floating point)

Количество грязных буферов, записанных в каждом раунде, основано на количестве новых буферов, которое понадобилось серверным процессам во время последних раундов. Для расчета предварительной потребности в буферах для следующего раунда средняя потребность за последнее время умножается на значение bgwriter_lru_multiplier. Грязные буферы будут записываются до тех пор, пока количество чистых, пригодных для повторного использования буферов не достигнет целевого значения. (Однако в каждом раунде будет записано не более bgwriter_lru_maxpages буферов.) Таким образом, значение этого параметра, равное 1.0, воплощает политику «точно в срок», при которой записывается именно то количество буферов, которое, предполагается необходимым. Увеличение этого значения обеспечивает некоторую страховку от всплесков потребностей, тогда как уменьшение преднамеренно оставляет некоторый объем записи для серверных процессов. Значение по умолчанию — 2.0. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

bgwriter_flush_after (integer)

Всякий раз, когда процесс фоновой записи записывает больше заданного объема данных, сервер пытается заставить ОС произвести запись этих данных в нижележащее хранилище. Это ограничивает количество «грязных» данных в страничном кэше ядра, снижая вероятность зависаний при выполнении fsync в конце контрольной точки или когда ОС выполняет обратную запись большими пакетами в фоновом режиме. Зачастую это приводит к значительному снижению задержки транзакций, но также бывают случаи (особенно когда объем рабочей нагрузки больше shared_buffers, но меньше страничного кэша), когда производительность может снизиться. Этот параметр может действовать не на всех платформах. Если это значение указано без единиц измерения, оно считается заданным в блоках, размер которых равен BLCKSZ байтов (обычно это 8 КБ). Допустимый диапазон: от 0 (что выключает принудительную обратную запись) до 2 MB. Значение по умолчанию равно 512kB в Linux и 0 в других ОС. (Если BLCKSZ отличен от 8 КБ, значение по умолчанию и максимальное значение масштабируются пропорционально ему.) Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

С маленькими значениями bgwriter_lru_maxpages и bgwriter_lru_multiplier снижается дополнительная нагрузка на систему ввода/вывода, вызываемая процессом фоновой записи, но повышается вероятность того, что серверным процессам придется самим производить записи, что замедлит интерактивные запросы.

Асинхронное поведение

effective_io_concurrency (integer)

Задает количество параллельных операций ввода/вывода на диске, которые, как ожидает QHB, могут выполняться одновременно. Увеличение этого значения приведет к увеличению числа операций ввода/вывода, которые QHB попытается запустить параллельно в каждом отдельном сеансе. Допустимый диапазон: от 1 до 1000; ноль выключает выполнение асинхронных запросов ввода/вывода. В настоящее время этот параметр влияет только на сканирование по битовой карте.

Для магнитных носителей хорошей начальной точкой для этого параметра является количество отдельных дисков, содержащих массив с чередованием RAID 0 или зеркальный массив RAID 1, в котором размещена база данных. (Для RAID 5 диск четности следует исключить.) Однако если база данных часто обрабатывает несколько запросов, выполняемых в параллельных сеансах, для полной загрузки дискового массива может хватить и небольших значений. Более высокое значение приведет лишь к дополнительной нагрузке на ЦП. Диски SSD и другие виды хранилища в памяти часто могут обрабатывать множество параллельных запросов, поэтому наилучшим значением могут быть сотни.

Асинхронный ввод/вывод зависит от эффективности функции posix_fadvise, которая отсутствует в некоторых операционных системах. В случае ее отсутствия установка этого параметра в любое значение, отличное от нуля, приведет к ошибке. В некоторых операционных системах (например, Solaris) эта функция имеется, но в действительности ничего не делает.

В системах, где это поддерживается, по умолчанию установлено значение 1, в остальных — 0. Это значение можно переопределить для таблиц в определенном табличном пространстве, установив одноименный параметр табличного пространства (см. ALTER TABLESPACE).

maintenance_io_concurrency (integer)

Этот параметр схож с effective_io_concurrency, но используется в операциях обслуживания, которые выполняются во многих клиентских сеансах.

В системах, где это поддерживается, по умолчанию установлено значение 1, в остальных — 0. Это значение можно переопределить для таблиц в определенном табличном пространстве, установив одноименный параметр табличного пространства (см. ALTER TABLESPACE).

max_worker_processes (integer)

Задает максимальное количество фоновых процессов, которые может поддерживать система. Этот параметр можно задать только при запуске сервера. Значение по умолчанию — 8.

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

При изменении этого значения также имеет смысл скорректировать параметры max_parallel_workers, max_parallel_maintenance_workers и max_parallel_workers_per_gather.

max_parallel_workers_per_gather (integer)

Задает максимальное количество рабочих процессов, которое может запустить один узел Gather или Gather Merge. Параллельные рабочие процессы берутся из пула процессов, созданного параметром max_worker_processes и ограниченного параметром max_parallel_workers. Обратите внимание, что запрошенное количество рабочих процессов в действительности может быть недоступно во время выполнения. Если это произойдет, план будет выполняться с меньшим количеством рабочих процессов, чем ожидалось, что может быть неэффективно. Значение по умолчанию — 2. Установка этого значения в 0 выключает параллельное выполнение запросов.

Обратите внимание, что параллельные запросы могут потреблять значительно больше ресурсов, чем непараллельные, потому что каждый рабочий процесс является совершенно отдельным процессом, который оказывает на систему примерно такое же влияние, что и дополнительный пользовательский сеанс. Это следует учитывать при выборе значения этого параметра, а также при настройке других параметров, управляющих использованием ресурсов, например work_mem. Ограничения ресурсов, такие как work_mem, применяются индивидуально к каждому рабочему процессу, что означает, что общая нагрузка для всех процессов может оказаться намного выше, чем она была бы для отдельного процесса в обычной ситуации. Например, параллельный запрос с использованием 4 рабочих процессов может задействовать в 5 раз больше времени процессора, объема памяти, пропускной способности ввода/вывода и т. д., чем запрос, который вообще не использует рабочие процессы.

max_parallel_maintenance_workers (integer)

Задает максимальное количество параллельных рабочих процессов, которое может запустить одна служебная команда. В настоящее время единственными параллельными служебными командами, которые поддерживают использование параллельных рабочих процессов, являются CREATE INDEX (и только при построении индекса B-дерева) и VACUUM без указания FULL. Параллельные рабочие процессы берутся из пула процессов, созданного параметром max_worker_processes и ограниченного параметром max_parallel_workers. Обратите внимание, что запрошенное количество рабочих процессов в действительности может быть недоступно во время выполнения. Если это произойдет, служебная операция будет выполняться с меньшим количеством рабочих процессов, чем ожидалось. Значение по умолчанию — 2. Установка этого значения в 0 выключает использование параллельных рабочих процессов служебными командами.

Обратите внимание, что параллельные служебные команды не должны потреблять значительно больше памяти, чем равнозначные непараллельные операции. Эта стратегия отличается от стратегии параллельного запроса, где ограничения ресурсов обычно применяются для каждого рабочего процесса. Для параллельных служебных команд ограничение ресурса maintenance_work_mem считается применяемым ко всей служебной команде, независимо от количества параллельных рабочих процессов. Тем не менее, параллельные служебные команды все равно могут значительно больше нагружать процессор и канал ввода/вывода.

max_parallel_workers (integer)

Задает максимальное количество рабочих процессов, которое система может поддерживать для параллельных операций. Значение по умолчанию — 8. При увеличении или уменьшении этого значения также имеет смысл скорректировать параметры max_parallel_maintenance_workers и max_parallel_workers_per_gather. Также обратите внимание, что если установить для этого параметра значение, превышающее max_worker_processes, это не будет иметь никакого эффекта, поскольку параллельные рабочие процессы берутся из пула рабочих процессов, ограничиваемого этим параметром.

backend_flush_after (integer)

Всякий раз, когда одним обслуживающим процессом записывается больше заданного объема данных, сервер пытается заставить ОС произвести запись этих данных в нижележащее хранилище. Это ограничивает количество «грязных» данных в страничном кэше ядра, снижая вероятность зависаний при выполнении fsync в конце контрольной точки или когда ОС выполняет обратную запись большими пакетами в фоновом режиме. Зачастую это приводит к значительному снижению задержки транзакций, но также бывают случаи (особенно когда объем рабочей нагрузки больше shared_buffers, но меньше страничного кэша ОС), когда производительность может снизиться. Этот параметр может действовать не на всех платформах. Если это значение указано без единиц измерения, оно считается заданным в блоках, размер которых равен BLCKSZ байтов (обычно это 8 КБ). Допустимый диапазон: от 0 (что выключает принудительную обратную запись) до 2 MB. Значение по умолчанию — 0, т. е. принудительная обратная запись отсутствует. (Если BLCKSZ отличен от 8 КБ, значение по умолчанию и максимальное значение масштабируются пропорционально ему.)

old_snapshot_threshold (integer)

Задает минимальный период времени, в течение которого можно использовать снимок состояния для запроса без риска возникновения ошибки «снимок слишком старый». Данные, потерявшие актуальность и находящиеся в этом состоянии дольше этого периода, могут быть вычищены. Это может помочь предотвратить «разбухание» снимков, которые остаются задействованными долгое время. Во избежание неверных результатов из-за очистки данных, которые в противном случае были бы видны в снимке, генерируется ошибка, если снимок старше этого предела и используется для чтения страницы, измененной с момента его создания.

Если это значение указано без единиц измерения, оно считается заданным в минутах. Значение -1 (по умолчанию) выключает эту функцию, фактически делая предельный срок снимков бесконечным. Этот параметр можно задать только при запуске сервера.

Полезные для производственной работы значения могут варьироваться от нескольких часов до нескольких дней. Малые значения (например, 0 или 1min) допускаются только потому, что иногда они могут быть полезны при тестировании. Несмотря на то, что допустимо значение до 60d (60 дней), имейте в виду, что при многих рабочих нагрузках критичное «разбухание» или зацикливание идентификаторов транзакций может происходить в гораздо меньшие сроки.

Когда эта функция включена, освобожденное пространство в конце отношения нельзя отдать операционной системе, так как при этом может быть удалена информация, необходимая для выявления условия «снимок слишком стар». Все пространство, выделенное отношению, остается связанным с ним и повторно используется только в нем, пока не будет явно освобождено (например, командой VACUUM FULL).

Этот параметр не дает гарантии, что данная ошибка будет генерироваться при всех возможных обстоятельствах. В действительности, если можно получить верные результаты, например, из курсора, который материализовал результирующий набор, ошибка не будет выдана, даже если нижележащие строки в ссылочной таблице были вычищены. Некоторые таблицы, например системные каталоги, невозможно безопасно очистить досрочно, поэтому данный параметр на них не повлияет. Для таких таблиц этот параметр не уменьшает раздувание, но и не чреват ошибкой «снимок слишком стар» при сканировании.

Журнал упреждающей записи (WAL)

Для получения дополнительной информации о настройке этих параметров см. раздел Конфигурация WAL.

Настройки

wal_level (enum)

wal_level определяет, сколько информации записывается в WAL. Значение по умолчанию — replica, при котором в журнал записывается достаточно данных для поддержки архивирования WAL и репликации, включая выполнение запросов только на чтение на резервном сервере. Значение minimal удаляет всю информацию, кроме необходимой для восстановления после сбоя или аварийного отключения. Наконец, logical добавляет информацию, необходимую для поддержки логического декодирования. Каждый последующий уровень включает информацию, регистрируемую на всех уровнях ниже его. Этот параметр можно задать только при запуске сервера.

На уровне minimal WAL-протоколирование некоторых массовых операций можно пропустить без риска потери данных, что позволяет значительно ускорить эти операции (см. раздел Выключить архивацию WAL и потоковую репликацию). Такая оптимизация возможна в следующих операциях:

  • CREATE TABLE AS
  • CREATE INDEX
  • CLUSTER
  • COPY с таблицами, которые были созданы или усечены в одной транзакции

Но минимальный журнал не содержит достаточно информации для восстановления данных из базовой резервной копии и журналов WAL, поэтому для включения архивирования WAL (archive_mode) и потоковой репликации необходимо установить уровень replica или более высокий.

На уровне logical протоколируется та же информация, что и на уровне replica, а также информация, необходимая для извлечения из WAL наборов логических изменений. Установка уровня logical увеличит объем WAL, особенно если многие таблицы сконфигурированы с параметром REPLICA IDENTITY FULL и выполняется множество команды UPDATE и DELETE.

fsync (boolean)

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

Хотя выключение fsync часто повышает производительность, это может привести к неустранимому повреждению данных в случае отключения питания или сбоя системы. Поэтому рекомендуется выключать fsync только в том случае, если вы легко можете восстановить всю базу данных из внешнего источника.

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

Для надежного восстановления при смене значения fsync с off на on необходимо принудительно перенести все измененные буферы из ядра в стабильное хранилище. Это можно сделать, когда кластер остановлен или когда режим fsync включен, запустив команду initdb --sync-only или команду sync, размонтировав файловую систему или перезагрузив сервер.

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

Параметр fsync можно задать только в файле qhb.conf или в командной строке сервера. Если вы выключите этот параметр, возможно, также имеет смысл выключить параметр full_page_writes.

synchronous_commit (enum)

Определяет, после завершения какого этапа обработки WAL сервер базы данных вернет клиенту сообщение об успешном выполнении операции. Допустимые значения: remote_apply (применено удаленно), on (включено, значение по умолчанию), remote_write (записано удаленно), local (локально) и off (выключено).

Если значение synchronous_standby_names не задано, для данного параметра имеют смысл только значения on и off; при значениях remote_apply, remote_write и local уровень синхронизации будет тот же, что и с вариантом on. Локальное поведение всех режимов, отличных от off, заключается в ожидании локального сброса WAL на диск. В режиме off из-за отсутствия ожидания возможна задержка между моментом, когда клиенту сообщается об успешном выполнении, и моментом, когда транзакция действительно гарантированно защищена от сбоя сервера. (Максимальная задержка равна тройному значению wal_writer_delay.) В отличие от fsync, значение off этого параметра не создает риска несогласованности базы данных: сбой операционной системы или базы данных может привести к потере некоторых последних предположительно зафиксированных транзакций, но состояние базы данных будет таким же, как если бы эти транзакции были прерваны обычным образом. Поэтому выключение параметра synchronous_commit может быть полезной альтернативой выключению fsync, когда производительность важнее точной уверенности в прочности транзакции. Дополнительную информацию см. в разделе Асинхронный коммит.

Если значение synchronous_standby_names не пустое, synchronous_commit также определяет, будет ли сервер при фиксировании транзакций ожидать, пока их записи WAL будут обработаны на резервном сервере (или серверах).

Если задано значение remote_apply, фиксирование не завершится, пока ответы от текущих синхронных резервных серверов не укажут, что они получили запись о фиксировании транзакции, применили эту транзакцию, так что она стала видимой для запросов на резервном сервере (или серверах), а также сохранили ее в стабильном хранилище. Это вызовет куда большую задержку фиксирования, нежели предыдущие параметры, поскольку нужно будет дождаться воспроизведения WAL. Если задано значение on, фиксирование не завершится, пока ответы от текущих синхронных резервных серверов не укажут, что они получили запись о фиксировании транзакции и сохранили ее в стабильном хранилище. Это гарантирует, что транзакция не будет потеряна, если только хранилище базы данных не будет повреждено и на основном, и на всех синхронных резервных серверах. Если задано значение remote_write, фиксирование не завершится, пока ответы от текущих синхронных резервных серверов не укажут, что они получили запись о фиксировании транзакции и сохранили ее в своих файловых системах. Этот вариант гарантирует сохранение данных даже в случае сбоя резервного сервера QHB, но не в случае сбоя на уровне его операционной системы, поскольку данные могут не достичь стабильного хранилища на этом сервере. Со значением local фиксирование завершится после локального сброса данных на диск, не дожидаясь репликации. Обычно этот вариант нежелателен при синхронной репликации, но он предоставлен для полноты.

Этот параметр можно изменить в любое время; поведение каждой конкретной транзакции определяется значением, действующим на момент ее фиксирования. Таким образом, есть возможность и смысл, чтобы некоторые транзакции фиксировались синхронно, а другие — асинхронно. Например, чтобы одна транзакция с несколькими состояниями фиксировалась асинхронно, когда по умолчанию задано противоположное значение, выполните в этой транзакции команду SET LOCAL synchronous_commit TO OFF.

Характеристики различных значений synchronous_commit приведены в таблице 1.

Таблица 1. Режимы synchronous_commit

Значение synchronous_commitСтабильная локальная фиксацияСтабильная фиксация на резервном сервере после сбоя QHBСтабильная фиксация на резервном сервере после сбоя ОССогласованность запросов на резервном сервере
remote_apply****
on***
remote_write**
local*
off

wal_sync_method (enum)

Метод, используемый для принудительного сохранения изменений WAL на диск. Если режим fsync выключен, то этот параметр не учитывается, поскольку принудительные сохранения файла WAL вообще не будут проводиться. Возможные значения этого параметра:

  • open_datasync (записать файлы WAL функцией open() с параметром O_DSYNC)

  • fdatasync (вызывать fdatasync() при каждом фиксировании)

  • fsync (вызывать fsync() при каждом фиксировании)

  • fsync_writethrough (вызывать fsync() при каждом фиксировании, форсируя вызывая сквозную запись любого дискового кэша)

  • open_sync (записать файлы WAL функцией open() с параметром O_SYNC)

Варианты open_* также применяют флаг O_DIRECT если он доступен. Не все эти методы доступны на всех платформах. По умолчанию выбирается первый метод из приведенного выше списка, который поддерживается платформой, за исключением того, что в Linux значением по умолчанию является fdatasync. Выбираемый по умолчанию вариант не обязательно идеален; для создания отказоустойчивой конфигурации или достижения оптимальной производительности может потребоваться изменить это значение или другие аспекты конфигурации вашей системы. Эти аспекты рассматриваются в разделе Прочность. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

full_page_writes (boolean)

Когда этот параметр включен, сервер QHB записывает в WAL все содержимое каждой страницы диска при первом изменении этой страницы после контрольной точки. Это необходимо, поскольку запись страницы, которая выполнялась во время сбоя операционной системы, может оказаться завершена только частично, что приводит к появлению на диске страницы, содержащей смесь старых и новых данных. Информации об изменениях на уровне строк, обычно хранящейся в WAL, будет недостаточно для полного воссоздания такой страницы при восстановлении после сбоя. Сохранение образа полной страницы гарантирует, что ее можно восстановить корректно, но ценой будет увеличение объема данных, которые должны быть записаны в WAL. (Поскольку воспроизведение WAL всегда начинается с контрольной точки, достаточно сделать это при первом изменении каждой страницы после контрольной точки. Поэтому одним из способов снижения затрат на запись полных страниц является увеличение интервалов контрольных точек.)

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

Выключение этого параметра не влияет на применение архивирования WAL для восстановления состояния на определенный момент времени (PITR) (см. раздел Непрерывное архивирование и восстановление на момент времени (PITR)).

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Значение по умолчанию — on (включено).

wal_log_hints (boolean)

Когда этот параметр имеет значение on (включен), сервер QHB записывает в WAL все содержимое каждой страницы диска при первом изменении этой страницы после контрольной точки, даже при второстепенных изменениях так называемых вспомогательных битов.

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

Этот параметр можно задать только при запуске сервера. Значение по умолчанию — off (выключен).

wal_compression (boolean)

Когда этот параметр имеет значение on (включен), сервер QHB сжимает образ полной страницы, записанный в WAL, когда включен параметр full_page_writes включен или при создании базовой резервной копии. Сжатый образ страницы будет распакован во время воспроизведения WAL. Значение по умолчанию — off (выключен). Только суперпользователи могут изменять этот параметр.

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

wal_init_zero (boolean)

Если этот параметр имеет значение on (по умолчанию), вновь создаваемые файлы WAL заполняются нулями. В некоторых файловых системах благодаря этому пространство выделяется заранее, до того, как потребуется делать записи WAL. Однако в файловых системах, работающих по принципу копирования при записи (COW, Copy-On-Write) этот метод может не давать никаких преимуществ, поэтому данный параметр позволяет пропустить ненужную в таком случае операцию. Со значением off (выключен) при создании файла WAL записывается только последний байт, чтобы файл имел желаемый размер.

wal_recycle (boolean)

Если этот параметр имеет значение on (по умолчанию), файлы WAL переименовываются и используются повторно, что избавляет от необходимости создавать новые файлы. В файловых системах с COW, возможно, будет быстрее создать новые файлы, поэтому данный параметр позволяет выключить это поведение.

wal_buffers (integer)

Объем общей памяти, используемой для данных WAL, которые еще не были записаны на диск. Значение -1 (по умолчанию) задает размер, равный 1/32 (около 3%) от shared_buffers, но не меньше 64 КБ и не больше, чем размер одного сегмента WAL, обычно 16 МБ. Это значение можно задать вручную, если выбираемое автоматически слишком велико или мало, но любое положительное значение меньше 32 КБ будет восприниматься как 32 КБ. Если это значение указано без единиц измерения, оно считается заданным в блоках WAL, размер которых равен XLOG_BLCKSZ байтов (обычно это 8 КБ). Этот параметр можно задать только при запуске сервера.

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

wal_writer_delay (integer)

Определяет, с какой периодичностью процесс записи WAL будет сбрасывать WAL на диск. После каждого сброса WAL он засыпает на время, заданное wal_writer_delay, но может пробудиться раньше, если произойдет асинхронное фиксирование транзакции. Если предыдущий сброс произошел раньше, чем закончился период, указанный в wal_writer_delay, и полученный после этого объем WAL не достиг значения wal_writer_flush_after, то WAL только передается ОС, но не сбрасывается на диск. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — 200 миллисекунд (200ms). Обратите внимание, что во многих системах эффективное разрешение таймера сна составляет 10 миллисекунд; если задать в wal_writer_delay значение, не кратное 10, на практике можно получить такой же результат, что и со следующим за ним значением, кратным 10. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

wal_writer_flush_after (integer)

Определяет, при каком объеме процесс записи WAL будет сбрасывать WAL на диск. Если предыдущий сброс произошел раньше, чем закончился период, указанный в wal_writer_delay, и полученный после этого объем WAL не достиг значения wal_writer_flush_after, то WAL только передается ОС, но не сбрасывается на диск. Если значение wal_writer_flush_after равно 0, то данные WAL всегда сбрасываются на диск немедленно. Если это значение указано без единиц измерения, оно считается заданным в блоках WAL, размер которых равен XLOG_BLCKSZ байтов (обычно это 8 КБ). Значение по умолчанию — 1 МБ. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

wal_after_error_sleep_delay (integer)

Определяет период в микросекундах, на который процесс сброса WAL останавливается после того, как произойдёт ошибка записи на диск. Большие значения этого периода (не более одной секунды) позволяют избежать чрезмерного заполнения журнала, но могут приводить к критическим задержкам работы высоконагруженных систем. Возможные значения - от 0 (отсутствие задержек) до 1000000 (1 секунда). Значение по умолчанию - 100, или 100 микросекунд. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Изменение значения потребует перезапуска сервера.

commit_delay (integer)

Параметр commit_delay добавляет паузу перед началом сброса данных WAL. Это может увеличить быстродействие при групповом фиксировании, позволяя зафиксировать большее число транзакций за один сброс WAL, если загрузка системы достаточно высока и за заданное время успевают подготовиться к фиксированию другие транзакции. Однако это также увеличивает задержку вплоть до commit_delay при каждом сбросе WAL. Поскольку в паузе нет смысла, если никакие другие транзакции не готовы к фиксированию, задержка происходит только в том случае, если на момент запуска сброса WAL активно не менее commit_siblings других транзакций. Кроме того, эти задержки не происходят при выключенном fsync. Если это значение указано без единиц измерения, оно считается заданным в микросекундах. По умолчанию значение commit_delay равно нулю (без задержки). Только суперпользователи могут изменять этот параметр.

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

commit_siblings (integer)

Минимальное число одновременных открытых транзакций, которое требуется для добавления задержки commit_delay. Чем больше это значение, тем выше вероятность того, что как минимум еще одна транзакция окажется готова к фиксированию за время задержки. По умолчанию это пять транзакций.

Контрольные точки

checkpoint_timeout (integer)

Максимальное время между автоматическими контрольными точками WAL. Если это значение указано без единиц измерения, оно считается заданным в секундах. Допустимый диапазон составляет от 30 секунд до одного дня. Значение по умолчанию — пять минут (5min). Увеличение этого параметра может привести к увеличению времени, необходимого для восстановления после сбоя. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

checkpoint_completion_target (floating point)

Задает целевое время завершения процедуры контрольной точки, как долю от общего времени между контрольными точками. Значение по умолчанию — 0.5. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

checkpoint_flush_after (integer)

Всякий раз, когда во время выполнения контрольной точки записывается больше заданного объема данных, сервер пытается заставить ОС произвести запись этих данных в нижележащее хранилище. Это ограничивает количество «грязных» данных в страничном кэше ядра, снижая вероятность зависаний при выполнении fsync в конце контрольной точки или когда ОС выполняет обратную запись большими пакетами в фоновом режиме. Зачастую это приводит к значительному снижению задержки транзакций, но также бывают случаи (особенно когда объем рабочей нагрузки больше shared_buffers, но меньше страничного кэша), когда производительность может снизиться. Этот параметр может действовать не на всех платформах. Если это значение указано без единиц измерения, оно считается заданным в блоках, размер которых равен BLCKSZ байтов (обычно это 8 КБ). Допустимый диапазон: от 0 (что выключает принудительную обратную запись) до 2 MB. Значение по умолчанию равно 256kB в Linux и 0 в других ОС. (Если BLCKSZ отличен от 8 КБ, значение по умолчанию и максимальное значение масштабируются пропорционально ему.) Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

checkpoint_warning (integer)

Записать сообщение в журнал сервера, если контрольные точки, вызванные заполнением файлов сегментов WAL, выполняются быстрее, чем через заданное время (что говорит о том, что нужно увеличить max_wal_size). Если это значение указано без единиц измерения, оно считается заданным в секундах. Значение по умолчанию — 30 секунд (30s). При нуле это предупреждение выключается. Если checkpoint_timeout меньше, чем checkpoint_warning, предупреждения генерироваться не будут. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

max_wal_size (integer)

Максимальный размер, до которого может вырасти WAL во время автоматических контрольных точек. Это мягкий предел; размер WAL может превышать max_wal_size при особых обстоятельствах, например, при большой нагрузке, сбое в archive_command или большом значении wal_keep_size. Если это значение указано без единиц измерения, оно считается заданным в мегабайтах. Значение по умолчанию — 1 ГБ. Увеличение этого параметра может привести к увеличению времени, необходимого для восстановления после сбоя. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

min_wal_size (integer)

Пока WAL занимает на диске меньше объема, заданного в этом параметре, старые файлы WAL в контрольных точках всегда перерабатываются для дальнейшего использования, а не удаляются. Это позволяет зарезервировать достаточно пространства для WAL, чтобы справиться с пиками его использования, например, при выполнении больших пакетных заданий. Если это значение указано без единиц измерения, оно считается заданным в мегабайтах. Значение по умолчанию — 80 МБ. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Архивирование

archive_mode (enum)

Когда параметр archive_mode включен, заполненные сегменты WAL отправляются в архивное хранилище с помощью команды archive_command. Помимо значения off, выключающего архивацию, есть еще два: on (включен) и always (всегда). В нормальных условиях между этими двумя режимами нет никакой разницы, но в режиме always архивирование WAL активно также во время восстановления из архива и при работе с резервным сервером. В режиме always все файлы, восстановленные из архива или переданные с потоковой репликацией, будут заархивированы (снова).

Переменные archive_mode и archive_command разделены, чтобы archive_command можно было изменять, не выходя из режима архивирования. Этот параметр можно задать только при запуске сервера. archive_mode нельзя включить, если в параметре wal_level задано значение minimal.

archive_command (string)

Это команда локальной оболочки, выполняемая для архивирования завершенного сегмента файла WAL. Любое вхождение %p в этой строке заменяется путем к файлу, который нужно заархивировать, а любое вхождение %f — только именем этого файла. (Путь задается относительно рабочего каталога сервера, т. е. каталога данных кластера.) Чтобы вставить в команду символ %, его нужно записать как %%. Важно, чтобы команда возвращала нулевой статус выхода, только если она завершается успешно. Подробную информацию см. в подразделе Настройка архивирования WAL.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Он игнорируется, если параметр archive_mode не был включен при запуске сервера. Если значение archive_command — пустая строка (по умолчанию), а archive_mode включен, архивирование WAL временно выключается, но сервер продолжает накапливать файлы сегментов WAL в ожидании, что команда будет вскоре предоставлена. Если в качестве команды archive_command задать команду, которая ничего не делает, но возвращает значение true (успешное завершение), например /bin/true, архивирование по сути выключается, но при этом разрывается цепочка файлов WAL, необходимых для восстановления архива, поэтому такой вариант следует использовать только в исключительных случаях.

archive_timeout (integer)

Команда archive_command вызывается только для завершенных сегментов WAL. Поэтому, если ваш сервер генерирует небольшой трафик WAL (или запись данных чередуется с периодами простоя), от завершения транзакции до ее безопасного сохранения в архивном хранилище может пройти довольно много времени. Для ограничения времени существования неархивированных данных, можно задать значение archive_timeout, чтобы сервер периодически переключался на новый файл сегмента WAL. Когда этот параметр больше нуля, сервер будет переключаться на новый файл сегмента, если с момента последнего переключения на новый файл прошел заданный промежуток времени и наблюдалась какая-то активность базы данных, пусть даже это была одна контрольная точка (контрольные точки пропускаются, если нет активности базы данных). Обратите внимание, что архивные файлы, которые из-за принудительного переключения закрываются досрочно, все равно будут иметь тот же размер, что и полностью заполненные. Поэтому устанавливать для archive_timeout очень маленькое значение неразумно — это приведет к переполнению архивного хранилища. Обычно имеет смысл задавать значение около минуты. Если вы хотите, чтобы данные копировались с главного сервера быстрее, следует подумать о переходе с архивирования на потоковую репликацию. Если это значение указано без единиц измерения, оно считается заданным в секундах. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Восстановление из архива

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

Под «восстановлением» понимается как использование сервера в качестве резервного, так и выполнение целевого восстановления данных. Как правило, резервный сервер используется для обеспечения высокой доступности и/или масштабируемости чтения, тогда как целевое восстановление используется в случае потери данных.

Чтобы запустить сервер в режиме резервного, создайте в каталоге данных файл с именем standby.signal. Сервер перейдет к восстановлению, но не остановится по достижении конца заархивированного WAL, а продолжит пытаться осуществить восстановление дальше, подключившись для этого к передающему серверу, используя параметры в primary_conninfo, и/или получив новые сегменты WAL с помощью команды restore_command. Для данного режима представляют интерес параметры, описанные в этом разделе и подразделе Резервные серверы. Параметры, описанные в подразделе Целевая точка восстановления, также будут действовать, но в этом режиме они, как правило, бесполезны.

Чтобы запустить сервер в режиме целевого восстановления, создайте в каталоге данных файл с именем recovery.signal. В случае одновременного создания файлов standby.signal и recovery.signal приоритет имеет режим резервного сервера. Режим целевого восстановления завершается после полного воспроизведения заархивированного WAL или при достижении recovery_target (целевой точки). В этом режиме используются параметры, описанные в этом разделе и подразделе Целевая точка восстановления.

restore_command (string)

Команда локальной оболочки, выполняемая для извлечения заархивированного сегмента набора файлов WAL. Этот параметр необходим для восстановления из архива, но необязателен для потоковой репликации. Любое вхождение %f в этой строке заменяется именем файла, извлекаемого из архива, а любое вхождение %p — путем назначения на сервере. (Путь указывается относительно текущего рабочего каталога, т. е. каталога данных кластера.) Любое вхождение %r заменяется именем файла, содержащего последнюю действительную точку перезапуска. Это самый ранний файл, который необходимо хранить, чтобы обеспечить возможность запуска восстановления, поэтому эту информацию можно использовать для усечения архива до минимального размера, необходимого для поддержки перезапуска. %r обычно используется только в конфигурациях с теплым резервированием. Чтобы вставить в команду символ %, его нужно записать как %%.

Важно, чтобы команда возвращала нулевой статус выхода, только если она завершается успешно. У команды будут запрошены имена файлов, которых нет в архиве; в этом случае она должна возвращать ненулевой статус. Пример:

restore_command = 'cp /mnt/server/archivedir/%f "%p"'

Если команда была прервана сигналом (отличным от SIGTERM, который используется как часть отключения сервера базы данных) или ошибкой со стороны оболочки (например, если команда не найдена), то процесс восстановления будет остановлен и сервер не запустится.

Этот параметр можно задать только при запуске сервера.

archive_cleanup_command (string)

Этот необязательный параметр задает команду оболочки, которая будет выполняться при каждой точке перезапуска. Назначение параметра archive_cleanup_command — предоставить механизм для очистки от старых архивных файлов WAL, которые больше не нужны резервному серверу. Любое вхождение %r заменяется именем файла, содержащего последнюю действительную точку перезапуска. Это самый ранний файл, который необходимо хранить, чтобы обеспечить возможность запуска восстановления, поэтому все более старые файлы можно безопасно удалить. Эту информацию можно использовать для усечения архива до минимального размера, необходимого для поддержки перезапуска. Модуль qhb_archivecleanup часто используется в качестве archive_cleanup_command в конфигурациях с одним резервным сервером, например:

archive_cleanup_command = 'qhb-archivecleanup /mnt/server/archivedir %r'

Однако обратите внимание, что если несколько резервных серверов восстанавливаются из одного и того же архивного каталога, следует проследить за тем, чтобы файлы WAL удалялись только после того, как ими воспользуются все серверы. archive_cleanup_command часто используется в конфигурациях с теплым резервированием. Чтобы вставить в команду символ %, его нужно записать как %%.

Если команда возвращает ненулевой статус выхода, в журнал будет записано сообщение с предупреждением. Если же команда была прервана сигналом или ошибкой со стороны оболочки (например, если команда не найдена), возникнет фатальная ошибка.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

recovery_end_command (string)

Этот параметр задает команду оболочки, которая будет выполнена только один раз в конце процесса восстановления. Этот параметр не является обязательным. Назначение параметра recovery_end_command — предоставить механизм очистки после репликации или восстановления. Любое вхождение %r заменяется именем файла, содержащего последнюю действительную точку перезапуска, аналогично параметру archive_cleanup_command.

Если команда возвращает ненулевой статус выхода, в журнал будет записано сообщение с предупреждением и запуск базы данных все равно продолжится. Если же команда была прервана сигналом или ошибкой со стороны оболочки (например, если команда не найдена), запуск базы данных будет прерван.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Целевая точка восстановления

По умолчанию восстановление производится вплоть до конца журнала WAL. Чтобы остановить процесс восстановления в более ранней точке, можно использовать один из следующих параметров: recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time или recovery_target_xid. Если в файле конфигурации указано более одного из них, возникнет ошибка. Эти параметры можно задать только при запуске сервера.

recovery_target = ’immediate’

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

Технически это строковый параметр, но в данный момент допустимым является только значение ’immediate’.

recovery_target_name (string)

Этот параметр задает именованную точку восстановления (созданную с помощью pg_create_restore_point()), до которой будет производиться восстановление.

recovery_target_time (timestamp)

Этот параметр задает метку времени, до которой будет производиться восстановление. Точная точка остановки также зависит от значения параметра recovery_target_inclusive.

Значение этого параметра задается в том же формате, что принимается типом данных timestamp with time zone, за исключением того, что в нем нельзя использовать аббревиатуру часового пояса (если только переменная timezone_abbreviations не была установлена в файле конфигурации выше). Поэтому рекомендуется задавать числовое смещение от UTC или записывать название часового пояса полностью, например Europe/Helsinki (но не EEST).

recovery_target_xid (string)

Этот параметр задает идентификатор транзакции, до которого будет производиться восстановление. Имейте в виду, что значения идентификаторов отражают последовательность именно старта транзакций, а выполняться они могут и в другом порядке. Будут восстановлены все транзакции, совершенные до указанной (и, возможно, включая ее). Точная точка остановки также зависит от значения параметра recovery_target_inclusive.

recovery_target_lsn (pg_lsn)

Этот параметр задает номер LSN позиции в журнале упреждающей записи, до которого будет производиться восстановление. Точная точка остановки также зависит от значения параметра recovery_target_inclusive. Этот параметр принимает значение системного типа данных pg_lsn.

Следующие параметры уточняют целевую точку восстановления и определяют, что будет происходить при ее достижении:

recovery_target_inclusive (boolean)

Указывает, следует ли останавливаться сразу после заданной целевой точки восстановления (on) или непосредственно перед ней (off). Применяется, когда заданы recovery_target_lsn, recovery_target_time или recovery_target_xid. Этот параметр определяет, будут ли восстановлены транзакции, у которых позиция в WAL (LSN), время фиксации или идентификатор в точности совпадают с соответствующим заданным значением. Значение по умолчанию — on.

recovery_target_timeline (string)

Указывает точную линию времени для восстановления. Значение этого параметра может задаваться числовым идентификатором временной шкалы или специальным значением. При значении current восстанавливается та линия времени, которая действовала при создании базовой резервной копии. При значении latest восстанавливается последняя линия времени, найденная в архиве, что полезно для резервного сервера. Значение по умолчанию — latest.

Обычно этот параметр требуется задавать только в сложных ситуациях повторного восстановления, когда необходимо вернуться к состоянию, которое само было достигнуто после восстановления на момент времени. Это рассматривается в подразделе Линии времени.

recovery_target_action (enum)

Указывает, какое действие должен предпринять сервер после достижения целевой точки восстановления. Вариант по умолчанию — pause, означающий, что восстановление будет приостановлено. Вариант promote означает, что процесс восстановления завершится и сервер начнет принимать подключения. Наконец, при варианте shutdown сервер остановится по достижении целевой точки восстановления.

Предполагается, что вариант pause позволит выполнить запросы к базе данных и проверить, является ли эта целевая точка восстановления наиболее желаемой. Для снятия с паузы можно воспользоваться функцией pg_wal_replay_resume() (см. таблицу Функции управления восстановлением), которая приведет к завершению восстановления. Если эта целевая точка не является желаемой, нужно выключить сервер, установить параметры на более позднюю цель и перезапустить сервер для продолжения восстановления.

Вариант shutdown полезен для получения готового экземпляра СУБД в желаемой точке воспроизведения. Данный экземпляр по-прежнему сможет воспроизводить дополнительные записи WAL (и на самом деле при следующем запуске должен будет воспроизводить записи WAL с момента последней контрольной точки).

Обратите внимание, что поскольку recovery.signal не удаляется, если в recovery_target_action задано значение shutdown, последующий запуск закончится немедленным завершением работы, если только не изменить конфигурацию или не удалить файл recovery.signal вручную.

Этот параметр не действует, если целевая точка восстановления не установлена. Если не включен режим hot_standby, вариант pause будет действовать так же, как shutdown.

Репликация

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

Передающие серверы

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

max_wal_senders (integer)

Задает максимально допустимое число одновременных подключений резервных серверов или клиентов потокового базового резервного копирования (т. е. максимальное число одновременно работающих процессов передачи WAL). Значение по умолчанию — 10. При значении 0 репликация выключается. При неожиданном отключении клиента потоковой передачи потерянный слот подключения может игнорироваться вплоть до истечения тайм-аута, поэтому значение этого параметра должно быть немного выше максимально допустимого числа ожидаемых клиентов, чтобы отключившиеся клиенты могли немедленно восстановить соединение. Этот параметр можно задать только при запуске сервера. Кроме того, чтобы к данному серверу могли подключаться резервные, уровень параметра wal_level должен быть replica или выше.

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

max_replication_slots (integer)

Задает максимальное число слотов репликации, которое сможет поддерживать сервер. Значение по умолчанию — 10. Этот параметр можно задать только при запуске сервера. Если заданное значение будет меньше, чем число существующих в настоящее время слотов репликации, сервер не запустится. Кроме того, чтобы к данному серверу могли подключаться резервные, уровень параметра wal_level должен быть replica или выше.

На стороне подписчика определяет, сколько источников репликации можно отслеживать одновременно, по сути ограничивая количество подписок на логическую репликацию, которые можно создать на сервере. Если заданное значение будет меньше, чем текущее число отслеживаемых источников репликации (показываемое в pg_replication_origin_status, а не в pg_replication_origin), сервер не запустится.

wal_keep_size (integer)

Задает минимальный объем прошлых сегментов файла журнала, который будет сохраняться в каталоге pg_wal, на случай, если резервному серверу понадобится выбрать их для потоковой репликации. Если резервный сервер, подключенный к передающему, отстает больше чем на wal_keep_size мегабайт, передающий сервер может удалить сегменты WAL, все еще нужные резервному, и в этом случае соединение репликации прервется. В результате этого впоследствии также будут прерваны зависимые соединения. (Однако резервный сервер может восстановиться, выбрав этот сегмент из архива, если осуществляется архивация WAL.)

Этот параметр задает только минимальный объем сегментов, который будет сохраняться в каталоге pg_wal; для архивации WAL или для восстановления с момента контрольной точки системе может потребоваться сохранить больше сегментов. Если wal_keep_size равен нулю (это значение по умолчанию), система не сохраняет никакие дополнительные сегменты для резервных серверов, поэтому число доступных для них старых сегментов WAL зависит от положения предыдущей контрольной точки и состояния архивации WAL. Если это значение задается без единиц измерения, оно считается заданным в мегабайтах. Задать этот параметр можно только в файле qhb.conf или в командной строке при запуске сервера.

max_slot_wal_keep_size (integer)

Задает максимальный объем файлов WAL, который может оставаться в каталоге pg_wal для слотов репликации после выполнения контрольной точки. Со значением max_slot_wal_keep_size, равным -1 (по умолчанию), для слотов репликации может сохраняться неограниченный объем файлов WAL. При неотрицательном значении, если позиция restart_lsn для слота репликации отстает от текущего LSN более чем на заданный объем, использующий этот слот ведомый сервер может лишиться возможности продолжить репликацию вследствие удаления нужных ему файлов WAL. Доступность WAL для слотов репликации показывается в представлении pg_replication_slots.

wal_sender_timeout (integer)

Задает промежуток времени, по истечении которого прерываются неактивные соединения репликации. Это помогает передающему серверу обнаружить сбой резервного сервера или разрывы сети. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — 60 секунд. При значении 0 механизм тайм-аута выключается.

Если узлы кластера распределены по нескольким географическим местоположениям, его управление можно сделать более гибким, используя разные значения в разных расположениях. Маленькие значения помогают быстрее обнаружить потерю резервного сервера, подключенного через сеть с низкими задержками, а большие позволяют точнее определить состояние удаленного резервного сервера, соединение с которым характеризуется большими задержками.

track_commit_timestamp (boolean)

Включает запись времени фиксации транзакций. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Значение по умолчанию — off (выключено).

Главный сервер

Эти параметры можно задать на главном/основном сервере, который должен передавать данные репликации на один или несколько резервных серверов. Обратите внимание, что помимо этих параметров на главном сервере должен быть надлежащим образом установлен wal_level, а также может быть включено архивирование WAL (см. подраздел Архивирование). Значения этих параметров на резервных серверах не важны, хотя их можно задать там заранее, на случай, если понадобится сделать резервный сервер главным.

synchronous_standby_names (string)

Задает список резервных серверов, которые могут поддерживать синхронную репликацию. Активных синхронных резервных серверов может быть один или несколько; транзакциям, ожидающим фиксации, будет позволено завершиться только после того, как эти резервные серверы подтвердят получение своих данных. Синхронными резервными серверами будут те, имена которых указаны в этом списке и которые в настоящее время подключены и передают данные в режиме реального времени (что показывает характеристика streaming в представлении pg_stat_replication). Указание более одного синхронного резервного сервера может обеспечить очень высокую доступность и защиту от потери данных.

Именем резервного сервера в этом контексте является значение строки application_name резервного сервера, задаваемое в его свойствах подключения. В случае осуществления физической репликации его следует задавать в строке primary_conninfo; по умолчанию это значение параметра cluster_name, если оно задано, иначе — walreceiver. Для логической репликации его можно задать в свойствах подключения подписки; по умолчанию это имя подписки. Чтобы узнать, как задать его для других потребителей потока репликации, ознакомьтесь с их документацией.

Этот параметр задает список резервных серверов, используя любую из следующих форм:

[FIRST] число_синхронных ( имя_резервного [, ...] )
ANY число_синхронных ( имя_резервного [, ...] )
имя_резервного [, ...]

где число_синхронных — это число синхронных резервных серверов, от которых транзакции должны дождаться ответов, а имя_резервного — это имя резервного сервера. FIRST и ANY указывают способ выбора синхронных резервных из перечисленных серверов.

Ключевое слово FIRST в сочетании с числом_синхронных задает синхронную репликацию согласно приоритетам, и транзакции не фиксируются, пока их записи WAL не будут реплицированы на число_синхронных синхронных резервных серверов, выбранных, исходя из их приоритетности. Например, если задать FIRST 3 (s1, s2, s3, s4), то каждая фиксация будет происходить только после получения ответов от трех наиболее приоритетных из резервных серверов s1, s2, s3 и s4. Резервные серверы, имена которых стоят в списке выше, имеют более высокий приоритет и будут рассматриваться как синхронные. Серверы, следующие в списке за ними, считаются потенциальными синхронными. Если какой-либо из текущих синхронных резервных серверов по какой-то причине отключится, он будет немедленно заменен следующим резервным сервером с наивысшим приоритетом. Ключевое слово FIRST является необязательным.

Ключевое слово ANY в сочетании с числом_синхронных задает синхронную репликацию согласно кворума, и транзакции не фиксируются, пока их записи WAL не будут реплицированы как минимум на число_синхронных перечисленных резервных серверов. Например, если задать ANY 3 (s1, s2, s3, s4), то каждая фиксация будет происходить сразу после получения ответов от как минимум трех из резервных серверов s1, s2, s3 и s4.

Ключевые слова FIRST и ANY нечувствительны к регистру. Если эти же слова используются в качестве имени резервного сервера, его имя_резервного следует заключить в кавычки.

Третья форма является устаревшей, но до сих пор поддерживается QHB. Она равнозначна первой форме с FIRST и числом_синхронных, равным 1. Например, FIRST 1 (s1, s2) и s1, s2 означают одно и то же: в качестве синхронного резервного сервера выбирается либо s1, либо s2.

Специальному элементу * соответствует имя любого резервного сервера.

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

Примечание
Каждое имя_резервного должно задаваться в форме действительного идентификатора SQL, кроме *. При необходимости его можно заключать в кавычки. Но обратите внимание, что имена_резервного сравниваются с именами приложений резервных серверов без учета регистра, независимо от того, заключены они в кавычки или нет.

Если не задать в этом параметре имена синхронных резервных серверов, то синхронная репликация не включится и фиксируемые транзакции не будут ждать репликации. Это конфигурация по умолчанию. Даже когда синхронная репликация включена, отдельные транзакции можно настроить так, чтобы они не ожидали репликации, задав для параметра synchronous_commit значение local или off.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

vacuum_defer_cleanup_age (integer)

Задает число транзакций, на которое будут откладывать очистку неиспользуемых версий строк команда VACUUM и изменения HOT. По умолчанию это число равно нулю, то есть неиспользуемые версии строк могут быть удалены сразу, как только перестанут быть видимыми для любой открытой транзакции. Можно установить ненулевое значение на основном сервере, который работает с серверами горячего резерва. Это дает больше времени для выполнения запросов на резервном сервере без возникновения конфликтов из-за ранней очистки строк. Тем не менее, поскольку это значение определяется числом записывающих транзакций, выполняющихся на основном сервере, трудно предсказать, сколько дополнительного времени получат резервные серверы. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

В качестве альтернативы использованию этого параметра следует также рассмотреть возможность настройки hot_standby_feedback на резервных серверах.

Этот параметр не предотвращает очистку неиспользуемых строк, которые достигли возраста, заданного параметром old_snapshot_threshold.

Резервные серверы

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

primary_conninfo (string)

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

В строке подключения должно задаваться имя хоста (или адрес) передающего сервера, а также номер порта, если он не совпадает с номером по умолчанию для резервного сервера. Также указывается имя пользователя, соответствующее роли с требуемыми правами на передающем сервере. Кроме того, если передающий сервер требует аутентификации по паролю, следует дополнительно задать пароль. Его можно указать в строке primary_conninfo или в отдельном файле ~/.pgpass на резервном сервере (для базы данных с именем replication). Имя базы данных в строке primary_conninfo указывать не нужно.

Этот параметр можно задать только при запуске сервера. Он действует, только если сервер работает в резервном режиме.

primary_slot_name (string)

Дополнительно задает существующий слот репликации, который будет использоваться при подключении к передающему серверу посредством потоковой репликации для управления удалением ресурсов в вышестоящем узле. Этот параметр можно задать только при запуске сервера. Он действует, только если задан параметр primary_conninfo.

promote_trigger_file (string)

Задает триггерный файл, присутствие которого завершает восстановление на резервном сервере. Даже если это значение не задано, резервный сервер все равно можно назначить главным с помощью команды qhb_ctl promote или вызова функции pg_promote. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

hot_standby (boolean)

Определяет, можно ли будет подключаться к серверу и выполнять запросы в процессе восстановления. Значение по умолчанию — on (подключения разрешены). Этот параметр можно задать только при запуске сервера. Он действует только во время восстановления архива или в режиме резервного сервера.

max_standby_archive_delay (integer)

В режиме горячего резерва этот параметр определяет, как долго резервный сервер должен ждать, прежде чем отменять свои запросы, конфликтующие с готовыми к применению записями WAL. Задержка max_standby_archive_delay применяется, когда данные WAL считываются из архива (то есть не являются текущими). Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — 30 секунд. При значении -1 клиент может ждать завершения конфликтующих запросов неограниченное время. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Обратите внимание, что max_standby_archive_delay — это не максимальное время, которое отводится на выполнение каждому запросу; скорее это максимальное общее время, за которое должны применяться данные из одного сегмента WAL. Таким образом, если один запрос привел к значительной задержке, у последующих конфликтующих запросов отсрочка будет гораздо меньше.

max_standby_streaming_delay (integer)

В режиме горячего резерва этот параметр определяет, как долго резервный сервер должен ждать, прежде чем отменять свои запросы, конфликтующие с готовыми к применению записями WAL. Задержка max_standby_streaming_delay применяется, когда данные WAL поступают при потоковой репликации. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — 30 секунд. При значении -1 клиент может ждать завершения конфликтующих запросов неограниченное время. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Обратите внимание, что max_standby_streaming_delay — это не максимальное время, которое отводится на выполнение каждому запросу; скорее это максимальное общее время, за которое должны применяться данные из одного сегмента WAL после получения от главного сервера. Таким образом, если один запрос привел к значительной задержке, у последующих конфликтующих запросов будет гораздо меньше времени, пока резервный сервер снова не догонит главный.

wal_receiver_status_interval (integer)

Задает минимальную частоту, с которой процесс, принимающий WAL на резервном сервере, будет отправлять информацию о ходе выполнения репликации на главный или вышестоящий резервный сервер, где эту информацию можно будет увидеть в представлении pg_stat_replication. В сообщении резервного сервера будут передаваться сведения о последней позиции, которую он записал в журнал предзаписи, о последней позиции, которую он сохранил на диск, и о последней позиции, которую он применил. Значение этого параметра — максимальный интервал между отчетами. Сообщения отправляются при каждом изменении позиции записи или сохранения или, по крайней мере, с частотой, указанной в этом параметре. Таким образом, последняя переданная позиция может немного отставать от фактической. Если это значение указано без единиц измерения, оно считается заданным в секундах. Значение по умолчанию — 10 секунд. При нулевом значении передача сообщений о ходе выполнения репликации полностью выключается. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

hot_standby_feedback (boolean)

Определяет, будет ли сервер горячего резерва передавать главному или вышестоящему резервному серверу отчет о запросах, выполняющихся на нем в данный момент. Этот параметр позволяет исключить необходимость отмены запросов, вызванную очисткой записей, но при некоторых рабочих нагрузках может вызвать раздувание базы данных на главном сервере. Сообщения с отчетом о запросах будут отправляться не чаще, чем один раз за интервал, задаваемый параметром wal_receiver_status_interval. Значение по умолчанию — off (выключено). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

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

Этот параметр не переопределяет поведение old_snapshot_threshold на главном сервере; снимок на резервном сервере, возраст которого превышает порог, заданный на главном, может стать недействительным, что приведет к отмене транзакций на резервном сервере. Это связано с тем, что параметр old_snapshot_threshold предназначен для указания абсолютного ограничения времени, в течение которого могут накапливаться неиспользуемые строки, которое иначе было бы нарушено из-за конфигурации резервного сервера.

wal_receiver_timeout (integer)

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

wal_retrieve_retry_interval (integer)

Определяет, как долго резервный сервер должен ждать поступления данных WAL из любых источников (потоковая репликация, локальный pg_wal или архив WAL), прежде чем снова попытаться получить данные WAL. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — 5 секунд. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

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

recovery_min_apply_delay (integer)

По умолчанию резервный сервер восстанавливает записи WAL с передающего сервера в максимально сжатые сроки. Может быть полезно задавать задержку при копировании этих данных, получая тем самым возможность исправить ошибки, связанные с потерей данных. Этот параметр позволяет отложить восстановление на указанное количество времени. Например, если установить для этого параметра значение 5min, резервный сервер будет воспроизводить фиксацию каждой транзакции не раньше, чем через 5 минут (согласно его системным часам) после времени фиксации, сообщенного главным сервером. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — ноль, то есть задержка не добавляется.

Бывает так, что задержка репликации между серверами превышает значение этого параметра, и в этом случае дополнительная задержка не добавляется. Обратите внимание, что задержка рассчитывается как разница между отметкой времени, записанной в WAL на главном сервере, и текущим временем на резервном сервере. Задержки передачи из-за запаздывания в сети или каскадной репликации могут значительно сократить фактическое время ожидания. Если системные часы на главном и резервном серверах не синхронизированы, это может привести к применению записей ранее ожидаемого; но это не столь важно, потому что полезные значения этого параметра намного выше обычной разницы во времени между серверами.

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

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

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

Предупреждение!

Этот параметр влияет на синхронную репликацию, когда для synchronous_commit задано значение remote_apply; каждой COMMIT придется ожидать применения.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Подписчики

Эти параметры управляют поведением подписчика логической репликации. На публикующем сервере их значения не играют роли.

Обратите внимание, что параметры конфигурации wal_receiver_timeout, wal_receiver_status_interval и wal_retrieve_retry_interval влияют на рабочие процессы логической репликации.

max_logical_replication_workers (int)

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

Рабочие процессы логической репликации берутся из пула, заданного параметром max_worker_processes.

Значение по умолчанию — 4. Этот параметр можно задать только при запуске сервера.

max_sync_workers_per_subscription (integer)

Максимально допустимое число рабочих процессов, выполняющих синхронизацию, на одну подписку. Этот параметр управляет степенью параллелизма копии исходных данных во время инициализации подписки или при добавлении новых таблиц.

В настоящее время одну таблицу может обрабатывать только один рабочий процесс синхронизации.

Рабочие процессы синхронизации берутся из пула, заданного параметром max_logical_replication_workers*.

Значение по умолчанию — 2. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Планирование запросов

Конфигурация метода планирования

Эти параметры конфигурации предоставляют грубый метод воздействия на планы запросов, выбранные оптимизатором запросов. Если выбранный оптимизатором стандартный план конкретного запроса, оказался не оптимален, в качестве временного решения можно использовать один из этих параметров конфигурации, чтобы заставить оптимизатор выбрать другой план. К более оптимальным способам улучшения качества выбираемых оптимизатором планов относятся корректировка констант стоимости для планировщика (см. подраздел Константы стоимости для планировщика), выполнение ANALYZE вручную, увеличение значения параметра конфигурации default_statistics_target, а также увеличение объема статистики, собираемой для отдельных столбцов, с помощью команды ALTER TABLE SET STATISTICS.

enable_bitmapscan (boolean)

Включает или выключает использование планировщиком запросов планов сканирования по битовой карте. Значение по умолчанию — on (включено).

enable_gathermerge (boolean)

Включает или выключает использование планировщиком запросов планов слияния посредством сбора. Значение по умолчанию — on (включено).

enable_hashagg (boolean)

Включает или выключает использование планировщиком запросов планов агрегирования по хэшу. Значение по умолчанию — on (включено).

enable_hashjoin (boolean)

Включает или выключает использование планировщиком запросов планов соединения по хэшу. Значение по умолчанию — on (включено).

enable_indexscan (boolean)

Включает или выключает использование планировщиком запросов планов сканирования по индексу. Значение по умолчанию — on (включено).

enable_indexonlyscan (boolean)

Включает или выключает использование планировщиком запросов планов сканирования только по индексу (см. раздел Сканирование только по индексу и покрывающие индексы). Значение по умолчанию — on (включено).

enable_material (boolean)

Включает или выключает использование планировщиком запросов материализации. Полностью убрать материализацию невозможно, но выключение этого параметра не позволит планировщику вставлять узлы материализации, за исключением случаев, когда это требуется для правильности. Значение по умолчанию — on (включено).

enable_mergejoin (boolean)

Включает или выключает использование планировщиком запросов планов соединения слиянием. Значение по умолчанию — on (включено).

enable_nestloop (boolean)

Включает или выключает использование планировщиком запросов планов соединения с вложенными циклами. Полностью убрать соединения с вложенными циклами невозможно, но выключение этого параметра не позволит планировщику использовать этот метод, если доступны другие. Значение по умолчанию — on (включено).

enable_parallel_append (boolean)

Включает или выключает использование планировщиком запросов планов с распараллеливанием добавления данных. Значение по умолчанию — on (включено).

enable_parallel_hash (boolean)

Включает или выключает использование в планировщике запросов планов соединения по хэшу с распараллеливанием хэширования. Не действует, если не включены планы соединения по хэшу. Значение по умолчанию — on (включено).

enable_partition_pruning (boolean)

Включает или выключает в планировщике запросов возможность исключать партиции партиционированной таблиц из планов запросов. Также контролирует способность планировщика генерировать планы запросов, позволяющие исполнителю пропускать (игнорировать) партиции во время выполнения запроса. Значение по умолчанию — on (включено). Подробную информацию см. в подразделе Сокращение партиций.

enable_partitionwise_join (boolean)

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

enable_partitionwise_aggregate (boolean)

Включает или выключает использование планировщиком запросов группировки или агрегирования с учетом партиционирования, что позволяет выполнять группировку или агрегирование в партиционированных таблицах, по отдельности для каждой партиции. Если предложение GROUP BY не включает ключи разбиения, на уровне партиций может быть выполнено только частичное агрегирование, а позже должна быть выполнена итоговая обработка. Поскольку для планирования группировки или агрегирования с учетом партиционирования может понадобиться гораздо больше процессорного времени и памяти, по умолчанию этот параметр выключен (off).

enable_seqscan (boolean)

Включает или выключает использование планировщиком запросов планов последовательного сканирования. Полностью убрать последовательное сканирование невозможно, но выключение этого параметра не позволит планировщику использовать этот метод, если доступны другие. Значение по умолчанию — on (включено).

enable_sort (boolean)

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

enable_tidscan (boolean)

Включает или выключает использование планировщиком запросов планов сканирования TID. Значение по умолчанию — on (включено).

Константы стоимости для планировщика

Переменные стоимости, описанные в этом разделе, измеряются в произвольном масштабе. Важны только их относительные значения, поэтому умножение или деление всех переменных на один коэффициент не приведет к изменению выбора планировщика. По умолчанию эти переменные стоимости определяются исходя из стоимости последовательных выборок страниц; то есть seq_page_cost обычно задается равной 1.0 а другие переменные стоимости определяются относительно нее. При желании можно использовать другой масштаб, например, фактическое время выполнения запросов в миллисекундах на конкретной машине.

Примечание
К сожалению, нет четко определенного метода определения идеальных значений для переменных стоимости. Лучше всего рассматривать их как средние показатели для всего набора запросов, которые получит конкретная СУБД. Это означает, что менять их на основании всего нескольких экспериментов очень рискованно.

seq_page_cost (floating point)

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

random_page_cost (floating point)

Задает для планировщика стоимость непоследовательной выборки одной страницы с диска. Значение по умолчанию — 4.0. Это значение можно переопределить для таблиц и индексов в определенном табличном пространстве, установив одноименный параметр табличного пространства (см. ALTER TABLESPACE).

Уменьшение этого значения относительно seq_page_cost приведет к тому, что система предпочтет сканирование по индексу; при его увеличении сканирование по индексу станет выглядеть более затратным. Также оба эти значения можно увеличивать или уменьшать одновременно, тем самым изменяя стоимость операций ввода/вывода на диск относительно стоимости процессорных операций, которая определяется следующими параметрами.

Произвольный доступ к механическому дисковому хранилищу обычно гораздо дороже (более чем в 4 раза), чем последовательный. Однако по умолчанию используется более низкое значение (4.0), поскольку предполагается, что большая часть данных при произвольных обращениях к диску, например при чтении индекса, окажется в кэше. Значение по умолчанию можно рассматривать как моделирование ситуации, когда произвольный доступ в 40 раз медленнее последовательного, и при этом ожидается, что 90% операций произвольного чтения будут кэшироваться.

Если вы считаете, что для вашей рабочей нагрузки 90% является неверным допущением, вы можете увеличить параметр random_page_cost, чтобы он лучше отражал реальную стоимость произвольного чтения из хранилища. Соответственно, если ваши данные могут полностью поместиться в кэше, например, когда объем базы данных меньше общего объема памяти сервера, целесообразно будет уменьшить значение random_page_cost. Хранилище, у которого стоимость произвольного чтения низкая относительно последовательного, например, у твердотельных накопителей, также лучше будет смоделировать с более низким значением random_page_cost, например, 1.1.

Примечание
Хотя система позволит вам установить random_page_cost меньше, чем seq_page_cost, это лишено физического смысла. Однако сделать их равными имеет смысл, если база данных полностью кэшируется в ОЗУ, поскольку в этом случае непоследовательное обращение к страницам не вызовет дополнительных издержек. Кроме того, в сильно кэшированной базе данных оба этих параметра необходимо снизить относительно параметров ЦП, поскольку стоимость извлечения страницы, уже находящейся в ОЗУ, намного меньше, чем обычно.

cpu_tuple_cost (floating point)

Задает для планировщика стоимость обработки каждой строки при выполнении запроса. Значение по умолчанию — 0.01.

cpu_index_tuple_cost (floating point)

Задает для планировщика стоимость обработки каждой записи индекса при сканировании индекса. Значение по умолчанию — 0.005.

cpu_operator_cost (floating point)

Задает для планировщика стоимость обработки каждой команды или функции, выполняемых при запросе. Значение по умолчанию — 0.0025.

parallel_setup_cost (floating point)

Задает для планировщика стоимость запуска параллельных рабочих процессов. Значение по умолчанию — 1000.

parallel_tuple_cost (floating point)

Задает для планировщика стоимость переноса одного кортежа из параллельного рабочего процесса в другой процесс. Значение по умолчанию — 0.1.

min_parallel_table_scan_size (integer)

Задает минимальный объем данных таблицы, подлежащий сканированию, при котором можно применить параллельное сканирование. При параллельном последовательном сканировании объем сканируемых данных таблицы всегда равен объему таблицы, но при использовании индексов этот объем обычно бывает меньше. Если это значение указано без единиц измерения, оно считается заданным в блоках, размер которых равен BLCKSZ байтов (обычно это 8 КБ). Значение по умолчанию — 8 мегабайт (8MB).

min_parallel_index_scan_size (integer)

Задает минимальный объем данных индекса, подлежащий сканированию, при котором можно применить параллельное сканирование. Обратите внимание, что параллельное сканирование индекса обычно не затрагивает весь индекс; это число страниц, которое, по мнению планировщика, будет действительно затронуто при сканировании. Если это значение указано без единиц измерения, оно считается заданным в блоках, размер которых равен BLCKSZ байтов (обычно это 8 КБ). Значение по умолчанию — 512 килобайт (512kB).

effective_cache_size (integer)

Определяет предположение планировщика об эффективном размере дискового кэша, доступном для одного запроса. Это предположение учитывается при оценке стоимости использования индекса; чем выше это значение, тем больше вероятность того, что будет применено сканирование по индексу, чем ниже, тем больше вероятность того, что будет применено последовательное сканирование. При установке этого параметра следует учитывать как объем общих буферов QHB, так и процент дискового кэша ядра, который будут занимать файлы данных QHB, хотя некоторые данные могут находиться и там, и там. Также примите во внимание ожидаемое количество параллельных запросов к разным таблицам, так как им придется совместно использовать доступное пространство. Этот параметр не влияет на размер общей памяти, выделяемой QHB, и не задает размер резервируемого дискового кэша ядра; он используется только для ориентировочной оценки. Кроме того, система не предполагает, что данные могут оставаться в дисковом кэше между запросами. Если это значение указано без единиц измерения, оно считается заданным в блоках, размер которых равен BLCKSZ байтов (обычно это 8 КБ). Значение по умолчанию — 4 гигабайта (4GB). (Если BLCKSZ не равен 8 КБ, значение по умолчанию масштабируется пропорционально ему).

jit_above_cost (floating point)

Задает предел стоимости запроса, при превышении которого активируется JIT-компиляция, если она включена. Применение JIT занимает время при планировании, но может ускорить выполнение запроса. При значении -1 JIT-компиляция выключается. Значение по умолчанию —

jit_inline_above_cost (floating point)

Задает предел стоимости запроса, при превышении которого в процессе JIT-компиляции возможно встраивание функций и операторов. Встраивание увеличивает время планирования, но может ускорить выполнение. Присваивать этому параметру значение меньше, чем jit_above_cost, не имеет смысла. При значении -1 встраивание выключается. Значение по умолчанию — 500000.

jit_optimize_above_cost (floating point)

Задает предел стоимости запроса, при превышении которого в процессе JIT-компиляции будут применяться дорогостоящие оптимизации. Такие оптимизации увеличивают время планирования, но могут ускорить выполнение. Присваивать этому параметру значение меньше, чем jit_above_cost, не имеет смысла, а значение больше, чем jit_inline_above_cost, вряд ли даст положительный эффект. При значении -1 дорогостоящие оптимизации выключаются. Значение по умолчанию —

Генетический оптимизатор запросов

Генетический оптимизатор запросов (Genetic Query Optimizer, GEQO) — это алгоритм, который выполняет планирование запросов с помощью эвристического поиска. Это сокращает время планирования сложных запросов (тех, в которых соединяется множество отношений) за счет создания планов, иногда уступающих по качеству планам, выявляемым обычным алгоритмом полного перебора.

geqo (boolean)

Включает или выключает генетическую оптимизацию запросов. По умолчанию она включена. В производственной среде ее лучше не выключать; более детальное управление GEQO дает переменная geqo_threshold.

geqo_threshold (integer)

Задает минимальное число элементов во FROM, при котором для планирования запросов будет использоваться генетический оптимизатор запросов. (Обратите внимание, что конструкция FULL OUTER JOIN считается одним элементом FROM). Значение по умолчанию — 12. Для более простых запросов, как правило, лучше использовать обычный планировщик, выполняющий полный перебор, но для запросов со многими таблицами полный перебор занимает слишком много времени, зачастую больше, чем тратится на выполнение неоптимального плана. Таким образом, ограничение размера запроса является удобным способом управления GEQO.

geqo_effort (integer)

Управляет балансом между временем планирования и качеством плана запроса в GEQO. Эта переменная должна задаваться целым числом в диапазоне от 1 до 10. Значение по умолчанию — пять. Значения выше этого увеличивают время, затрачиваемое на планирование запросов, но при этом повышают вероятность выбора эффективного плана запросов.

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

geqo_pool_size (integer)

Управляет размером пула, используемого GEQO, то есть числом особей в генетической популяции. Это число должно быть не меньше двух, а полезные значения обычно лежат в диапазоне от 100 до 1000. Если оно равно нулю (значение по умолчанию), то подходящее число выбирается, исходя из значения geqo_effort и количества таблиц в запросе.

geqo_generations (integer)

Управляет количеством поколений, используемых GEQO, то есть числом итераций этого алгоритма. Это число должно быть не меньше одного, а полезные значения лежат в том же диапазоне, что и размер пула. Если оно равно нулю (значение по умолчанию), то подходящее число выбирается, исходя из значения geqo_pool_size.

geqo_selection_bias (floating point)

Управляет смещением выбора, используемым GEQO. Смещение выбора — это избирательное давление в популяции. Допустимые значения лежат в диапазоне от 1.50 до 2.00 (это значение по умолчанию).

geqo_seed (floating point)

Управляет начальным значением генератора случайных чисел, используемого GEQO для выбора случайных путей в пространстве поиска порядка соединений. Значение может варьироваться от нуля (по умолчанию) до единицы. Изменение значения меняет набор анализируемых путей соединения и может привести к тому, что будет найден либо более, либо менее оптимальный путь.

Другие параметры планировщика

default_statistics_target (integer)

Задает целевой показатель статистики по умолчанию для столбцов таблицы, у которых командой ALTER TABLE SET STATISTICS не заданы целевые значения. Большие значения увеличивают время, необходимое для выполнения ANALYZE, но при этом могут улучшить качество оценок планировщика. Значение по умолчанию — 100. Дополнительную информацию об использовании статистики планировщиком запросов QHB см. в разделе Статистика, используемая планировщиком.

constraint_exclusion (enum)

Управляет использованием в планировщике запросов ограничений таблицы для оптимизации запросов. Допустимые значения constraint_exclusion: on (включено) — проверять ограничения для всех таблиц, off (выключено) — никогда не проверять ограничения и partition (партиции) — проверять ограничения только для дочерних таблиц и подзапросов UNION ALL. По умолчанию установлен вариант partition. Он часто применяется с традиционными деревьями наследования для улучшения производительности.

Когда данный параметр разрешает это для конкретной таблицы, планировщик сравнивает условия запроса с ограничениями CHECK этой таблицы и не сканирует ее, если условия противоречат ограничениям. Например:

CREATE TABLE parent(key integer, ...);
CREATE TABLE child1000(check (key between 1000 and 1999)) INHERITS(parent);
CREATE TABLE child2000(check (key between 2000 and 2999)) INHERITS(parent);
...
SELECT * FROM parent WHERE key = 2400;

При включенном исключении по ограничению команда SELECTвообще не будет сканировать таблицу child1000, тем самым улучшая производительность.

В настоящее время исключение по ограничению включено по умолчанию только для сценариев, часто используемых для реализации разбиения таблиц через деревья наследования. Включение его для всех таблиц приведет к дополнительным издержкам на планирование, довольно заметным при простых запросах и чаще всего не дающим никакого выигрыша. Если у вас нет таблиц, партиционированных через традиционное наследование, имеет смысл полностью выключить это ограничение. (Обратите внимание, что похожая возможность для партиционированных таблиц управляется отдельным параметром enable_partition_pruning.)

Дополнительную информацию об использовании исключения по ограничению для реализации разбиения см. в подразделе Партиционирование и исключение по ограничению.

cursor_tuple_fraction (floating point)

Задает для планировщика оценку процента строк, которые будут получены через курсор. Значение по умолчанию — 0.1 (10%). При уменьшении значения этого параметра планировщик будет склонен использовать для курсоров планы «быстрого запуска», которые будут быстро извлекать первые несколько строк, хотя для извлечения всех строк потребуется много времени. При увеличении значения акцент сместится в сторону оптимизации общего расчетного времени запроса. При максимальном значении, равном 1,0 (100%), работа с курсорами планируется так же, как и обычные запросы, с учетом только общего расчетного времени, а не скорости доставки первых строк.

from_collapse_limit (integer)

Задает максимальное число элементов в итоговом списке FROM, до которого планировщик будет объединять подзапросы с запросами верхнего уровня. При меньших значениях сокращается время планирования, но планы запросов могут стать менее эффективными. Значение по умолчанию — восемь. Дополнительную информацию см. в разделе Управление планировщиком с помощью явных предложений JOIN.

Если сделать это значение равным geqo_threshold или больше, то может включиться планировщик GEQO и в результате будут получены неоптимальные планы. См. подраздел Генетический оптимизатор запросов.

jit (boolean)

Определяет, может ли QHB задействовать JIT-компиляцию, если та поддерживается. Значение по умолчанию — on (включено).

join_collapse_limit (integer)

Задает максимальное число элементов в списке FROM, до достижения которого планировщик будет переписывать в него явные конструкции JOIN (кроме FULL JOIN). При меньших значениях сокращается время планирования, но планы запросов могут стать менее эффективными.

По умолчанию значение этой переменной равно значению from_collapse_limit, что приемлемо в большинстве случаев. При значении, равном 1, порядок явных предложений JOIN меняться не будет. Таким образом, явно заданный в запросе порядок соединений определит фактический порядок, в котором будут соединяться отношения. Поскольку планировщик запросов не всегда выбирает оптимальный порядок соединений, опытные пользователи могут временно задать для этой переменной значение 1, а затем явно указать желаемый порядок соединения. Дополнительную информацию см. в разделе Управление планировщиком с помощью явных предложений JOIN.

Если сделать это значение равным geqo_threshold или больше, то может включиться планировщик GEQO и в результате будут получены неоптимальные планы. См. подраздел Генетический оптимизатор запросов.

parallel_leader_participation (boolean)

Позволяет ведущему процессу выполнять план запроса в узлах ниже Gather и Gather Merge, не дожидаясь рабочих процессов. Значение по умолчанию — on (включено). Значение off (выключено) снижает вероятность блокировки рабочих процессов в случае, если ведущий процесс будет читать кортежи недостаточно быстро, но требует, чтобы ведущий процесс дожидался запуска рабочих процессов, прежде чем выдавать первые кортежи. Степень увеличения или снижения производительности в результате действий ведущего процесса зависит от вида плана, числа рабочих процессов и продолжительности запроса.

force_parallel_mode (enum)

Позволяет использовать параллельные запросы в целях тестирования, даже когда от этого не ожидается никакого увеличения производительности. Допустимые значения параметра force_parallel_mode: off (использовать параллельный режим, только когда ожидается увеличение производительности), on (принудительно распараллеливать все запросы, для которых это считается безопасным) и regress (как on, но с дополнительными изменениями поведения, описанными ниже).

Говоря точнее, при значении on узел Gather добавляется на самый верх любого плана запроса, для которого это безопасно, так что это запрос выполняется внутри параллельного рабочего процесса. Даже если параллельный рабочий процесс недоступен или его нельзя использовать, такие операции, как, запуск субтранзакции, которые были бы запрещены в контексте параллельного запроса, будут запрещены, если только планировщик не решит, что это приведет к ошибке запроса. Если при включении этого параметра возникают ошибки или выдаются неожиданные результаты, вероятно, некоторые функции, используемые в этом запросе, следует пометить как PARALLEL UNSAFE (или, возможно, PARALLEL RESTRICTED).

Значение regress действует так же, как и on, но с некоторыми дополнительными особенностями, предназначенными для облегчения автоматического регрессионного тестирования. Обычно сообщения от параллельных рабочих процессов включают в себя строку контекста, указывающую на это, но значение regress подавляет эту строку, так что выходные данные получаются такими же, как при непараллельном выполнении. Кроме того, узлы Gather, добавляемые в планы с помощью этого параметра, скрыты в выводе EXPLAIN, поэтому выходные данные соответствуют тем, что были бы получены при значении off (выключено).

plan_cache_mode (enum)

Подготовленные операторы (явно подготовленные или неявно сгенерированные, например, в PL/pgSQL) могут выполняться с использованием специализированных или общих планов. Специализированные планы создаются заново для каждого выполнения с определенным набором значений параметров, в то время как общие планы не зависят от значений параметров и могут использоваться повторно. Таким образом, общий план экономит время планирования, но может быть неэффективным, если идеальный план во многом зависит от значений параметров. Выбор между этими параметрами обычно производится автоматически, но его можно переопределить с помощью параметра plan_cache_mode. Допустимые значения: auto (по умолчанию), force_custom_plan (принудительно использовать специализированные планы) и force_generic_plan (принудительно использовать общие планы). Этот параметр учитывается при выполнении кэшированного плана, а не при его подготовке. Дополнительную информацию см. в описании команды PREPARE.

Регистрация ошибок и протоколирование

Куда протоколировать

log_destination (string)

QHB поддерживает несколько методов протоколирования сообщений сервера, включая stderr, csvlog и syslog. Значение этого параметра указывается в виде списка желаемых расположений журнала, разделенных запятыми. По умолчанию сообщения сервера протоколируются только в stderr. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Если в log_destination включено значение csvlog, то записи журнала выводятся в формате CSV (значения, разделенные запятыми), что удобно для загрузки журналов в программы. Подробную информацию см. в подразделе Использование вывода журнала в формате CSV. Для генерации вывода журнала в формате CSV должен быть включен logging_collector.

Если включено указание stderr или csvlog, то создается файл current_logfiles для записи местоположения файла (или файлов) журнала, который в данный момент используется сборщиком сообщений для соответствующего назначения. Это обеспечивает удобный способ поиска журналов, используемых в данный момент экземпляром сервера. Вот пример содержимого такого файла:

stderr log/qhb.log
csvlog log/qhb.csv

current_logfiles воссоздается, когда при прокрутке создается новый файл журнала и когда повторно загружается log_destination. Он удаляется, когда в log_destination не задается ни stderr, ни csvlog и когда сборщик сообщений выключен.

Примечание
В большинстве систем Unix потребуется изменить конфигурацию демона syslog, чтобы использовать вариант syslog для log_destination. QHB может протоколировать с помощью syslog-программ (facility) с LOCAL0 по LOCAL7 (см. syslog_facility), но на большинстве платформ конфигурация syslog по умолчанию не учитывает сообщения такого типа. Чтобы это работало, понадобится добавить в конфигурацию демона syslog что-то вроде этого: local0.* /var/log/qhb.

logging_collector (boolean)

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

Примечание
Можно обойтись без сборщика сообщений и просто протоколировать в stderr; сообщения журнала будут отправляться туда, куда направлен поток серверного stderr. Однако этот метод подходит только для небольших объемов протоколирования, поскольку не предоставляет удобного способа ротации файлов журналов. Кроме того, на некоторых платформах выключение сборщика сообщений может привести к потере или искажению выходных данных журнала, так как несколько процессов, одновременно пишущих в один файл журнала, могут перезаписывать сообщения друг друга.

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

log_directory (string)

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

log_filename (string)

При включенном logging_collector этот параметр задает имена создаваемых файлов журнала. Значение рассматривается как шаблон функции strftime, поэтому в нем можно использовать спецификаторы % для включения в имена файлов даты и времени. (Обратите внимание, что при наличии зависящих от часового пояса спецификаторов % вычисления будут выполняться в поясе, заданном в log_timezone). Поддерживаемые спецификаторы % аналогичны тем, что перечислены в описании strftime спецификации Open Group. Обратите внимание, что системная функция strftime напрямую не используется, поэтому нестандартные, специфичные для платформы расширения не работают. Значение по умолчанию — qhb-%Y-%m-%d_%H%M%S.log.

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

Если в log_destination включен вывод в формате CSV, то к имени файла журнала с меткой времени будет добавлено расширение .csv. (Если log_filename оканчивается на .log, то это расширение заменяется на .csv.)

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

log_file_mode (integer)

В системах Unix при включенном logging_collector этот параметр задает права доступа к файлам журнала. Значение параметра должно быть числовым, введенным в формате, принимаемом системными командами chmod и umask. (Для обычного восьмеричного формата число должно начинаться с 0 (ноль).)

Право доступа по умолчанию — 0600, т. е. читать или писать в файлы журнала может только владелец сервера. Другое часто используемое полезное значение — 0640, позволяющее читать файлы членам группы владельца. Однако обратите внимание, что для установки такого значения нужно перенести каталог для хранения файлов журнала (log_directory) за пределы каталога данных кластера. В любом случае неразумно открывать для всех доступ на чтение файлов журналов, поскольку они могут содержать конфиденциальные данные.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

log_rotation_age (integer)

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

log_rotation_size (integer)

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

log_truncate_on_rotation (boolean)

При включенном logging_collector этот параметр заставит QHB усекать (перезаписывать) существующие файлы журнала с одинаковым именем, а не дописывать в них. Однако усечение будет происходить только при открытии нового файла вследствие ротации по времени, а не при запуске сервера или ротации по размеру. При выключенном параметре в любом случае будет происходить добавление записей в уже существующий файл. Например, использование этого параметра в сочетании с log_filename равным qhb-%H.log приведет к генерации 24-часовых файлов журнала, которые будут циклически перезаписываться. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Пример: для хранения файлов журнала в течение 7 дней, по одному файлу на каждый день с именами вида server_log.Mon, server_log.Tue и т. д., и автоматической перезаписью файлов журнала прошлой недели на эту неделю, нужно установить log_filename в server_log.%a, log_truncate_on_rotation в on и log_rotation_age в 1440.

Пример: для хранения файлов журнала в течение 24 часов, по одному файлу на каждый час, но также с возможностью переключения файла раньше этого срока при превышении размера 1 ГБ, нужно установить log_filename в server_log.%H%M, log_truncate_on_rotation в on, log_rotation_age в 60 и log_rotation_size в 1000000. Добавление %M в log_filename позволит при ротации по размеру указать имя файла, отличное от исходного имени файла данного часа.

syslog_facility (enum)

При включенном протоколировании в syslog этот параметр определяет значение «facility» (syslog-программы), которая будет использоваться. Допустимые значения: LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7; значение по умолчанию — LOCAL0. Подробную информацию см. в документации на системный демон syslog. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

syslog_ident (string)

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

syslog_sequence_numbers (boolean)

При включенном протоколировании в syslog и включении этого параметра (по умолчанию), все сообщения будут предваряться последовательно возрастающими номерами (например, [2]). Это позволяет обойти подавление повторов «--- последнее сообщение повторилось N раз ---», которое по умолчанию осуществляется во многих реализациях syslog. В более современных реализациях syslog подавление повторных сообщений можно настроить (например, в rsyslog есть директива $RepeatedMsgReduction), так что это может оказаться необязательно. Кроме того, если вам действительно нужно, чтобы повторы подавлялись, этот параметр можно выключить.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

syslog_split_messages (boolean)

При включенном протоколировании в syslog этот параметр определяет способ передачи сообщений. Если этот параметр включен (по умолчанию), сообщения разделяются на строки, а длинные строки разбиваются так, чтобы уложиться в 1024 байта, что является типичным ограничением размера для традиционных реализаций syslog. Когда он выключен, сообщения сервера QHB передаются в службу syslog как есть, и она должна сама корректно справляться с потенциально громоздкими сообщениями.

Если в итоге syslog протоколирует в текстовый файл, результат в любом случае будет одинаковым, и лучше оставить этот параметр включенным, поскольку большинство реализаций syslog либо не могут обрабатывать большие сообщения, либо требуют для этого специальной настройки. Но если в итоге syslog записывает данные в какую-то другую среду, возможно, будет необходимо или более полезно сохранять логическую целостность сообщений.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

event_source (string)

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

Когда протоколировать

log_min_messages (enum)

Управляет уровнем сообщений, записываемых в журнал сервера. Допустимые значения: DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO, NOTICE, WARNING, ERROR, LOG, FATAL и PANIC. Каждый из перечисленных уровней включает в себя все уровни, идущие после него. Чем дальше в этом списке уровень сообщения, тем меньше сообщений отправляется в журнал. Значение по умолчанию — WARNING. Обратите внимание, что здесь у LOG другая позиция, нежели в параметре client_min_messages. Только суперпользователи могут изменять этот параметр.

log_min_error_statement (enum)

Управляет тем, какие команды SQL, вызвавшие ошибку, записываются в журнал сервера. Текущая команда SQL вносится в запись журнала, если сообщение имеет указанный уровень важности

или выше. Допустимые значения: DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO, NOTICE, WARNING, ERROR, LOG, FATAL и PANIC. По умолчанию установлено ERROR, то есть в журнал будут записываться команды, завершившиеся сообщением с уровнем важности ERROR, LOG, FATAL и PANIC. Чтобы действительно выключить запись команд с ошибками, установите для этого параметра значение PANIC. Только суперпользователи могут изменять этот параметр.

log_min_duration_statement (integer)

Инициирует запись в журнал продолжительность выполнения каждой завершенной команды, если та работала в течение указанного времени или дольше. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. При нулевом значении записывается продолжительность выполнения всех команд. Значение -1 (по умолчанию) выключает запись продолжительности выполнения команд. Например, если установить значение 250ms, в журнал будут записаны все команды SQL, выполняющиеся 250 миллисекунд и дольше или более. С помощью этого параметра можно отслеживать неоптимизированные запросы в приложениях. Только суперпользователи могут изменять этот параметр.

Для клиентов, использующих расширенный протокол запросов, будет записываться продолжительность каждой фазы (разбор, связывание и выполнение).

Примечание
При использовании этого параметра совместно с log_statement текст команд, которые записываются вследствие использования log_statement, не будет дублироваться в сообщении о продолжительности выполнения. Если вы не пользуетесь syslog, рекомендуется включить в log_line_prefix идентификатор процесса или сеанса, чтобы с их помощью можно было связать текст команды с сообщением о продолжительности выполнения, которое появится позже.

log_transaction_sample_rate (real)

Задает долю транзакций, команды из которых будут записываться в журнал помимо команд, записываемых по другим причинам. Этот параметр действует на все новые транзакции, независимо от продолжительности выполнения ее команд. Значение по умолчанию — 0, то есть команды из транзакций дополнительно не записываются. При значении 1 записываются все команды из всех транзакций. Параметр log_transaction_sample_rate полезен для отслеживания выборки транзакции. Только суперпользователи могут изменять этот параметр.

Примечание
Как и все параметры, управляющие протоколированием команд, этот параметр может значительно увеличить издержки.

В Таблице 2 поясняются уровни важности сообщений, используемые в QHB. Также здесь показано, как эти уровни переводятся в системные при отправке выходных данных журнала в syslog.

Таблица 2. Уровни важности сообщений

ВажностьИспользованиеsyslog
DEBUG1..DEBUG5Предоставляет более подробную информацию для разработчиков. Чем больше номер, тем подробнее.DEBUG
INFOПредоставляет неявно запрошенную пользователем информацию, например, вывод команды VACUUM VERBOSE.INFO
NOTICEПредоставляет информацию, которая может быть полезна пользователям, например, уведомление об усечении длинных идентификаторов.NOTICE
WARNINGПредоставляет предупреждения о возможных проблемах, например, COMMIT вне блока транзакций.NOTICE
ERRORСообщает об ошибке, из-за которой прервана текущая команда.WARNING
LOGСообщает информацию, интересующую администраторов, например, выполнение контрольных точек.INFO
FATALСообщает об ошибке, из-за которой прерван текущий сеанс.ERR
PANICСообщает об ошибке, из-за которой прерваны все сеансы базы данных.CRIT

Что протоколировать

application_name (string)

Параметр application_name может быть любой строкой длиной не более NAMEDATALEN символов (64 символа при стандартной сборке). Обычно устанавливается приложением при подключении к серверу. Значение (имя) будет отображено в представлении pg_stat_activity и включено в записи журнала при использовании формата CSV. Также его можно добавить в записи журнала в обычных форматах посредством параметра log_line_prefix. Значение application_name может содержать только печатные символы ASCII. Прочие символы будут заменены на вопросительные знаки (?).

debug_print_parse (boolean)

debug_print_rewritten (boolean)

debug_print_plan (boolean)

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

debug_pretty_print (boolean)

Этот параметр включает выравнивание сообщений, созданных debug_print_parse, debug_print_rewritten или debug_print_plan. В результате сообщения становятся более удобочитаемыми, но гораздо более длинными, чем при «компактном» формате, используемом, когда debug_pretty_print выключен. По умолчанию включен.

log_checkpoints (boolean)

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

log_connections (boolean)

Включает протоколирование всех попыток подключения к серверу, а также успешного завершения аутентификации клиента. Только суперпользователи могут изменять этот параметр, причем только в начале сеанса. Значение по умолчанию — off (выключен).

Примечание
Некоторые программы-клиенты, например psql, осуществляют две попытки подключения, при первой попытке определяя, требуется ли пароль, поэтому дублирование сообщения «connection received» не обязательно указывает на наличие проблемы.

log_disconnections (boolean)

Включает протоколирование всех завершений сеанса. В журнал выводится примерно та же информация, что и с log_connections, плюс продолжительность сеанса. Только суперпользователи могут изменять этот параметр, причем только в начале сеанса. Значение по умолчанию — off (выключен).

log_duration (boolean)

Включает протоколирование продолжительности всех выполненных команд. Значение по умолчанию — off (выключен). Только суперпользователи могут изменять этот параметр.

Для клиентов, использующих расширенный протокол запросов, будет записываться продолжительность каждой фазы (разбор, связывание и выполнение).

Примечание
Разница между включением log_duration и установкой нулевого значения для log_min_duration_statement заключается в том, что при превышении значения log_min_duration_statement протоколируется текст запроса, а при включении этого параметра — нет. Таким образом, если log_duration установлен в on (включен) и у log_min_duration_statement положительное значение, протоколируется продолжительность для всех команд, но текст запроса добавляется только для команд с продолжительностью, превышающей пороговое значение. Такое поведение может быть полезным при сборе статистики в условиях высокой нагрузки.

log_error_verbosity (enum)

Управляет количеством подробной информации, записываемой в журнал сервера для каждого протоколируемого сообщения. Допустимые значения: TERSE, DEFAULT и VERBOSE, каждое из которых добавляет дополнительные поля к отображаемым сообщениям. TERSE исключает из сообщений об ошибке поля DETAIL, HINT, QUERY и CONTEXT. VERBOSE включает в сообщение код ошибки SQLSTATE, а также имя файла с исходным кодом, имя функции и номер строки, которая вызвала ошибку. Только суперпользователи могут изменять этот параметр.

log_hostname (boolean)

По умолчанию в сообщениях журнала подключений отображается только IP-адрес подключившегося хоста. При включении этого параметра дополнительно будет протоколироваться и имя хоста. Обратите внимание, что, в зависимости от настройки разрешения имен вашего хоста, это может привести к значительному снижению производительности. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

log_line_prefix (string)

Это строка в стиле функции printf, которая выводится в начале каждой строки журнала. С символов % начинаются «управляющие последовательности», которые заменяются информацией о состоянии, как описано ниже. Нераспознанные последовательности игнорируются. Остальные символы напрямую копируются в строку журнала. Некоторые управляющие последовательности распознаются только сеансовыми процессами и будут игнорироваться фоновыми процессами, например основным процессом сервера. Информацию о состоянии можно выровнять влево или вправо, указав число после % и перед этой строкой. При отрицательном значении информация о состоянии будет дополнена пробелами справа до минимально допустимой ширины, а при положительном — слева. Заполнение может быть полезно для облегчения восприятия человеком файлов журнала. Этот параметр можно установить только в файле qhb.conf или в командной строке сервера. По умолчанию установлено значение ’%m [%p] ’, при котором протоколируется метка времени и идентификатор процесса.

ПоследовательностьДействиеТолько для сеансового процесса
%aИмя приложенияда
%uИмя пользователяда
%dИмя базы данныхда
%rИмя удаленного хоста или IP-адрес, а также номер удаленного портада
%hИмя удаленного хоста или IP-адресда
%pИдентификатор процессанет
%tМетка времени без миллисекунднет
%mМетка времени с миллисекундаминет
%nОтметка времени с миллисекундами (в виде времени Unix)нет
%iТег команды: тип текущей команды сеансада
%eКод ошибки SQLSTATEнет
%cИдентификатор сеанса: см. ниженет
%lНомер строки журнала для каждого сеанса или процесса, начиная с 1нет
%sМетка времени начала процессанет
%vВиртуальный идентификатор транзакции (backendID/localXID)нет
%xИдентификатор транзакции (0, если не присвоен)нет
%qНе выводит никаких данных, но указывает несеансовым процессам остановиться в этой точке строки; игнорируется сеансовыми процессаминет
%%Выводит символ %нет

Тип обслуживающего процесса соответствует столбцу backend_type в представлении pg_stat_activity, но в журнале могут присутствовать и другие типы, которые не показываются в этом представлении.

Последовательность %c выводит квазиуникальный идентификатор сеанса, состоящий из двух 4-байтных шестнадцатеричных чисел (без начальных нулей), разделенных точкой. Числа — это время начала процесса и идентификатор процесса, поэтому %c также можно использовать как способ экономии места для вывода этих значений. Например, чтобы сгенерировать идентификатор сеанса из pg_stat_activity, используйте этот запрос:

SELECT to_hex(trunc(EXTRACT(EPOCH FROM backend_start))::integer) || '.' ||
     to_hex(pid)
FROM pg_stat_activity;

Совет
При установке непустого значение для log_line_prefix лучше сделать его последним символом пробел, чтобы визуально отделить от остальной части строки журнала. Также можно использовать знаки пунктуации.

Совет
Syslog создает собственную метку времени и информацию об идентификаторе процесса, так что, вероятно, нет смысла использовать эти управляющие последовательности при протоколировании в syslog.

Совет
Последовательность %q полезна при включении информации, доступной только в контексте сеанса (обслуживающего процесса), например имени пользователя или базы данных. Например: log_line_prefix = '%m [%p] %q%u@%d/%a '

log_lock_waits (boolean)

Определяет, должно ли создаваться сообщение журнала, когда сеанс ожидает получения блокировки дольше, чем задано в deadlock_timeout. Это помогает определить, не является ли ожидание блокировок причиной низкой производительности. Значение по умолчанию — off (выключен). Только суперпользователи могут изменять этот параметр.

log_statement (enum)

Управляет тем, какие команды SQL протоколируются в журнал. Допустимые значения: none (выключен), ddl, mod и all (все команды). ddl протоколирует все команды определения данных, такие как CREATE, ALTER и DROP. mod протоколирует все команды ddl, а также команды, изменяющие данные, такие как INSERT, UPDATE, DELETE, TRUNCATE и COPY FROM. PREPARE, EXECUTE и EXPLAIN ANALYZE также протоколируются, если содержащие их команды имеют соответствующий тип. Для клиентов, использующих расширенный протокол запросов, запись в журнал происходит на фазе выполнения и содержит значения параметров связывания (с дублированием всех имеющихся апострофов).

Значение по умолчанию — none. Только суперпользователи могут изменять этот параметр.

Примечание
Команды, содержащие простые синтаксические ошибки, не протоколируются даже при log_statement = all, поскольку сообщение журнала создается только после выполнения стандартного разбора для определения типа команды. В случае расширенного протокола запросов этот параметр также не записывает команды, завершившиеся неуспехом до фазы выполнения (т. е. во время разбора или планирования запроса). Для записи таких команд установите параметр log_min_error_statement в значение ERROR (или ниже).

log_replication_commands (boolean)

Включает протоколирование всех команд репликации журнал сервера. Значение по умолчанию — off (выключено). Только суперпользователи могут изменять этот параметр.

log_temp_files (integer)

Управляет протоколированием имен и размеров временных файлов. Временные файлы могут создаваться для сортировки, хэширования и временного хранения результатов запросов. Если этот параметр включен, запись журнала создается для каждого временного файла при его удалении. При нулевом значении записывается информация обо всех временных файлах, а при положительных — только о тех, размер которых не меньше заданной величины. Если это значение указано без единиц измерения, оно считается заданным в килобайтах. Значение по умолчанию — -1, т. е. запись выключена. Только суперпользователи могут изменять этот параметр.

log_timezone (string)

Задает часовой пояс, используемый для меток времени при записи в журнал сервера. В отличие от TimeZone, это значение одинаково для всех баз данных кластер, поэтому в сообщениях от всех сеансов метки времени будут согласованы. Встроенное значение по умолчанию — GMT, но обычно оно переопределяется в qhb.conf; initdb установит там значение, соответствующее системному окружению. Дополнительную информацию см. в подразделе Часовые пояса. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Использование вывода журнала в формате CSV

Добавление csvlog в список log_destination обеспечивает удобный способ импорта файлов журнала в таблицу базы данных. Этот параметр генерирует строки журнала в формате значений, разделенных запятыми (формат CSV), со следующими столбцами: метка времени с миллисекундами; имя пользователя; имя базы данных; идентификатор процесса; хост клиента:номер порта; идентификатор сеанса; номер строки для каждого сеанса; тег команды; время начала сеанса; виртуальный идентификатор транзакции; обычный идентификатор транзакции; уровень важности ошибки; код ошибки SQLSTATE; сообщение об ошибке; подробности к сообщению об ошибке; подсказка; внутренний запрос, который привел к ошибке (если есть); номер символа внутреннего запроса, где произошла ошибка; контекст ошибки; пользовательский запрос, который привел к ошибке (если есть и включен log_min_error_statement); номер символа в пользовательском запросе, где произошла ошибка; расположение ошибки в исходном коде QHB (если у log_error_verbosity задано verbose) и имя приложения. Вот пример определения таблицы для хранения вывода журнала в формате CSV:

CREATE TABLE postgres_log
(
  log_time timestamp(3) with time zone,
  user_name text,
  database_name text,
  process_id integer,
  connection_from text,
  session_id text,
  session_line_num bigint,
  command_tag text,
  session_start_time timestamp with time zone,
  virtual_transaction_id text,
  transaction_id bigint,
  error_severity text,
  sql_state_code text,
  message text,
  detail text,
  hint text,
  internal_query text,
  internal_query_pos integer,
  context text,
  query text,
  query_pos integer,
  location text,
  application_name text,
  PRIMARY KEY (session_id, session_line_num)
);

Для импорта файл журнала в такую таблицу используйте команду COPY FROM:

COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;

Для упрощения импорта файлов журналов в формате CSV необходимо сделать следующее:

  1. Установите для log_filename и log_rotation_age значения, обеспечивающие согласованную и предсказуемую схему именования файлов журнала. Это позволит предсказать, каким будет имя файла, и узнать, когда конкретный файл журнала будет завершен и, следовательно, готов к импорту.

  2. Установите для log_rotation_size значение 0, чтобы выключить поразмерную ротацию файлов, поскольку это затрудняет прогнозирование имени файла журнала.

  3. Установите для log_truncate_on_rotation значение on, чтобы старые данные журнала не смешивались с новыми в одном файле.

  4. Приведенное выше определение таблицы содержит спецификацию первичного ключа. Это полезно для защиты от случайного повторного импорта информации. Команда COPY фиксирует все импортируемые данные за один раз, поэтому любая ошибка приведет к сбою всего импорта. Если сначала импортировать неполный файл журнала, а затем снова импортировать его после заполнения, нарушение первичного ключа приведет к сбою импорта. Поэтому, прежде чем импортировать, дождитесь завершения записи и закрытия журнала. Эта процедура также защитит от случайного импорта неполной (частично написанной) строки, что также приведет к сбою команды COPY.

Заголовок процесса

Эти параметры определяют, как изменяются заголовки процессов сервера. Заголовки процессов обычно просматриваются с помощью таких программ, как ps. Дополнительную информацию см. в разделе Стандартные инструменты Unix.

cluster_name (string)

Задает имя, которое идентифицирует этот кластер базы данных (экземпляр сервера) для различных целей. Имя кластера появляется в заголовке у всех процессов сервера в этом кластере. Кроме того, это имя является именем приложения по умолчанию при подключении резервного сервера (см. synchronous_standby_names).

Это имя может быть любой строкой длиной не более NAMEDATALEN символов (64 символа в стандартной сборке). В значении cluster_name можно использовать только печатные символы ASCII. Все остальные символы будут заменены на вопросительные знаки (?). Если для этого параметра задана пустая строка '' (по умолчанию), то никакое имя не отображается. Этот параметр можно задать только при запуске сервера.

update_process_title (boolean)

Позволяет изменять заголовок процесса каждый раз, когда сервер получает новую команду SQL. На большинстве платформ этот параметр по умолчанию включен. Только суперпользователи могут изменять этот параметр.

Статистика во время выполнения

Сборщик статистики запросов и индексов

Эти параметры управляют функциями сбора статистики на уровне сервера. Когда сбор статистики включен, доступ к собранным данным можно получить через семейство системных представлений pg._stat и pg._statio. Дополнительную информацию см. в главе Мониторинг активности базы данных.

track_activities (boolean)

Включает сбор информации о текущих командах, выполняемых во всех сеансах, а также время начала выполнения этих команд. По умолчанию этот параметр включен. Обратите внимание, что даже при включенном параметре эта информация видна не всем пользователям, а только суперпользователям и пользователю-владельцу сеанса, о котором сообщается, поэтому это не должно представлять угрозу безопасности. Только суперпользователи могут изменять этот параметр.

track_activity_query_size (integer)

Задает объем памяти, зарезервированный для хранения текста текущих команд, выполняемых во всех активных сеансах, для поля pg_stat_activity.query. Если это значение указано без единиц измерения, оно считается заданным в байтах. Значение по умолчанию — 1024 байта. Этот параметр можно задать только при запуске сервера.

track_counts (boolean)

Включает сбор статистики активности базы данных. По умолчанию этот параметр включен, поскольку собранная информация требуется процессу «Автовакуум». Только суперпользователи могут изменять этот параметр.

track_io_timing (boolean)

Включает замер времени операций ввода-вывода базы данных. По умолчанию этот параметр выключен, поскольку он будет периодически запрашивать у операционной системы текущее время, что может привести к значительному замедлению работы на некоторых платформах. Для измерения затрат времени в вашей системе можно воспользоваться утилитой pg_test_timing. Информация о времени ввода/вывода отображается в представлении pg_stat_database, в выводе EXPLAIN при использовании параметра BUFFERS и в представлении pg_stat_statements. Только суперпользователи могут изменять этот параметр.

track_functions (enum)

Включает подсчет вызовов функций и времени их выполнения. При значении pl подсчет будет вестись только для функций процедурного языка, при all — также для функций на языках SQL и C/RUST. Значение по умолчанию — none, т. е. сбор статистики по функциям выключен. Только суперпользователи могут изменять этот параметр.

Примечание
Функции на языке SQL, которые достаточно просты для «встраивания» в вызывающий запрос, отслеживаться не будут, независимо от этого параметра.

stats_temp_directory (string)

Задает каталог для хранения временных данных статистики. Это может быть путь относительно каталога данных или абсолютный путь. Значение по умолчанию — pg_stat_tmp. Если разместить каталог в файловой системе в ОЗУ, это снизит аппаратные требования к вводу-выводу и может привести к повышению производительности. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Мониторинг статистики

compute_query_id (enum)

Включает вычисление идентификатора запроса в ядре. Идентификаторы запроса могут отображаться в представлении pg_stat_activity при использовании команды EXPLAIN или записываться в журнал, если были сконфигурированы посредством параметра log_line_prefix. Также идентификаторы запросов должны вычисляться для расширения pg_stat_statements. Обратите внимание, что если метод вычисления идентификатора запроса в ядре является неприемлемым, в качестве альтернативы можно использовать внешний модуль. В таком случае вычисление в ядре должно быть всегда выключено. Допустимые значения: off (всегда выключено), on (всегда включено) и auto, которое позволяет модулям, например pg_stat_statements, включать это вычисление автоматически Значение по умолчанию — auto.

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

log_statement_stats (boolean)

log_parser_stats (boolean)

log_planner_stats (boolean)

log_executor_stats (boolean)

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

Автоматическая очистка

Эти параметры управляют поведением функции автоочистки. Дополнительную информацию см. в подразделе Процесс «Автовакуум». Обратите внимание, что многие из этих параметров могут быть переопределены на уровне таблицы; см. подраздел Параметры хранения.

autovacuum (boolean)

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

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

log_autovacuum_min_duration (integer)

Задает время выполнения действий автоочистки, при превышении которого данные об этом протоколируются в журнал. При нулевом значении записываются все действия автоочистки. При значении -1 (по умолчанию) запись действий автоочистки выключается. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Например, если задать значение 250ms, будут записываться все операции автоматической очистки и анализа, которые выполняются 250 мс или дольше. Кроме того, если для этого параметра установлено любое значение, отличное от -1, в журнал будет записано сообщение при пропуске действия автоочистки из-за конфликтующей блокировки или параллельного удаления отношения. Включение этого параметра может быть полезным для отслеживания активности автоочистки. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Тем не менее, его значение можно переопределить для отдельных таблиц, изменив их параметры хранения.

autovacuum_max_workers (integer)

Задает максимальное количество процессов автоочистки (кроме, собственно, ее запуска), которые могут выполняться одновременно. По умолчанию это количество равно трем. Этот параметр можно задать только при запуске сервера.

autovacuum_naptime (integer)

Задает минимальную задержку между запусками автоочистки в любой отдельно взятой базе данных. В каждом раунде процесс «Автовакуум» проверяет базу данных и при необходимости выдает команды VACUUM и ANALYZE для таблиц в этой базе. Если это значение указано без единиц измерения, оно считается заданным в секундах. Значение по умолчанию — одна минута (1min). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

autovacuum_vacuum_threshold (integer)

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

autovacuum_vacuum_insert_threshold (integer)

Задает количество добавленных кортежей, требующееся для запуска команды VACUUM в отдельно взятой таблице. Значение по умолчанию — 100 кортежей. При значении -1 запуск команды VACUUM не будет зависеть от количества добавленных кортежей. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Тем не менее, его значение можно переопределить для отдельных таблиц, изменив их параметры хранения.

autovacuum_analyze_threshold (integer)

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

autovacuum_vacuum_scale_factor (floating point)

Задает долю от размера таблицы, добавляемую к autovacuum_vacuum_threshold при принятии решения о запуске команды VACUUM. Значение по умолчанию — 0.2 (20% от размера таблицы). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Тем не менее, его значение можно переопределить для отдельных таблиц, изменив их параметры хранения.

autovacuum_vacuum_insert_scale_factor (floating point)

Задает долю от размера таблицы, добавляемую к autovacuum_vacuum_insert_threshold при принятии решения о запуске команды VACUUM. Значение по умолчанию — 0.2 (20% от размера таблицы). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Тем не менее, его значение можно переопределить для отдельных таблиц, изменив их параметры хранения.

autovacuum_analyze_scale_factor (floating point)

Задает долю от размера таблицы, добавляемую к autovacuum_analyze_threshold при принятии решения о запуске команды ANALYZE. Значение по умолчанию — 0.1 (10% от размера таблицы). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Тем не менее, его значение можно переопределить для отдельных таблиц, изменив их параметры хранения.

autovacuum_freeze_max_age (integer)

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

Очистка также позволяет удалять старые файлы из подкаталога pg_xact, поэтому значение по умолчанию относительно невелико — 200 миллионов транзакций. Этот параметр можно задать только при запуске сервера. Тем не менее, его значение можно уменьшить для отдельных таблиц, изменив их параметры хранения. Дополнительную информацию см. в подразделе Предотвращение ошибок зацикливания идентификатора транзакции.

autovacuum_multixact_freeze_max_age (integer)

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

Очистка мультитранзакций также позволяет удалять старые файлы из подкаталогов pg_multixact/members и pg_multixact/offsets, поэтому значение по умолчанию относительно невелико — 400 миллионов мультитранзакций. Этот параметр можно задать только при запуске сервера. Тем не менее, его можно уменьшить для отдельных таблиц, изменив их параметры хранения. Дополнительную информацию см. в подразделе Мультитранзакции и зацикливание.

autovacuum_vacuum_cost_delay (floating point)

Задает задержку при превышении предела стоимости, которая будет использоваться при автоматических операциях VACUUM. При значении -1 будет применена обычная задержка vacuum_cost_delay. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — 2 миллисекунды. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Тем не менее, его значение можно переопределить для отдельных таблиц, изменив их параметры хранения.

autovacuum_vacuum_cost_limit (integer)

Указывает предельное значение стоимости, которое будет использоваться при автоматических операциях VACUUM. При значении -1 (по умолчанию), будет применена обычная задержка vacuum_cost_limit. Обратите внимание, что если запущенных рабочих процессов автоочистки больше одного, это значение пропорционально распределяется между ними, так что суммарный предел стоимости для всех рабочих процессов не превышает значения этой переменной. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Тем не менее, его значение можно переопределить для отдельных таблиц, изменив их параметры хранения.

Параметры клиентских соединений по умолчанию

Поведение команд

client_min_messages (enum)

Управляет уровнем сообщений, отправляемых клиенту. Допустимые значения: DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, LOG, NOTICE, WARNING и ERROR. Каждый из перечисленных уровней включает в себя все уровни, идущие после него. Чем дальше в этом списке уровень сообщения, тем меньше сообщений отправляется клиенту. Значение по умолчанию — NOTICE. Обратите внимание, что здесь у LOG другая позиция, нежели в параметре log_min_messages.

Сообщения уровня INFO отправляются клиенту всегда.

search_path (string)

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

Значением search_path должен быть список имен схем, разделенных запятыми. Любое имя, которое не соответствует существующей схеме или принадлежит схеме, для которой у пользователя нет права USAGE, игнорируется.

Если список содержит специальное имя $user, то вместо него подставляется схема с именем, возвращаемым функцией CURRENT_USER, если такая схема существует и у пользователя есть для нее право USAGE. (В противном случае имя $user игнорируется).

Схема системных каталогов, pg_catalog, просматривается всегда, независимо от того, упоминается она в пути или нет. Если ее имя указано в пути, она будет просматриваться в заданном порядке. Если pg_catalog в пути отсутствует, она будет просматриваться перед всеми остальными элементами пути.

Аналогично всегда просматривается схема временных таблиц текущего сеанса, pg_temp_nnn, если она существует. Ее можно явно указать в пути поиска с помощью псевдонима pg_temp. Если эта схема в пути отсутствует, она будет просматриваться первой (даже до pg_catalog). Однако во временной схеме производится только поиск отношений (таблиц, представлений, последовательностей и т. д.) и типов данных, но не функций или операторов.

Когда объекты создаются без указания конкретной целевой схемы, они помещаются в первую подходящую схему, указанную в search_path. Если путь поиска пуст, выдается ошибка.

Значение по умолчанию для этого параметра — "$user", public. При таком значении поддерживается совместное использование базы данных (когда пользователи не имеют личных схем и все используют схему public), использование личных схем и комбинации обоих вариантов. Другие результаты можно получить, изменяя значение пути поиска по умолчанию, либо глобально, либо отдельно для каждого пользователя.

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

Текущее действующее значение пути поиска можно проверить с помощью функции SQL current_schemas (см. раздел Системные информационные функции и операторы). Результат будет несколько отличаться от значения в search_path, поскольку current_schemas показывает, как были преобразованы элементы, находящиеся в search_path.

row_security (boolean)

Эта переменная определяет, будет ли выдаваться ошибка при применении политики защиты строк. При значении on (включено) политики применяются в обычном режиме. При значении off (выключено) запросы, ограниченные хотя бы одной политикой, будут выдавать ошибку. Значение по умолчанию — on. Задавать значение off имеет смысл, когда ограниченная видимость строки может привести к некорректным результатам; например, qhb_dump задает это значение по умолчанию. Эта переменная не влияет на роли, которые обходят все политики защиты строк, а именно, на суперпользователей и роли с атрибутом BYPASSRLS.

Дополнительную информацию о политиках защиты строк см. в описании команды CREATE POLICY.

default_table_access_method (string)

Этот параметр задает метод доступа к таблице по умолчанию, который используется при создании таблиц или материализованных представлений, если тот не указан явно в команде CREATE, либо при выполнении команды SELECT ... INTO, которая не позволяет явно задать метод доступа. Значение по умолчанию — heap.

default_tablespace (string)

Эта переменная задает табличное пространство по умолчанию, в котором будут создаваться объекты (таблицы и индексы), когда в команде CREATE табличное пространство не указано явно.

Ее значением является либо имя табличного пространства, либо пустая строка, подразумевающая использование табличного пространства по умолчанию для текущей базы данных. Если это значение не соответствует имени какого-либо существующего табличного пространства, QHB автоматически будет использовать табличное пространство по умолчанию для текущей базы данных. Если указано не табличное пространство по умолчанию, у пользователя должно быть право CREATE для него, иначе попытки создания объектов не увенчаются успехом.

Эта переменная не используется для временных таблиц; вместо этого для них используется temp_tablespaces.

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

Дополнительную информацию о табличных пространствах см. в разделе Табличные пространства.

default_toast_compression (enum)

Эта переменная задает метод сжатия TOAST по умолчанию для значений сжимаемых столбцов. (Это можно переопределить для отдельных столбцов, установив параметр столбца COMPRESSION в CREATE TABLE или ALTER TABLE.) Поддерживаемые методы сжатия: pglz и lz4 (если QHB была скомпилирована с параметром --with-lz4). Значение по умолчанию — pglz.

temp_tablespaces (string)

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

Ее значением является список имен табличных пространств. Когда в этом списке содержится более одного имени, QHB выбирает оттуда случайный элемент каждый раз при создании временного объекта; однако последующие создаваемые внутри транзакции временные объекты помещаются в табличные пространства, выбираемые из списка последовательно. Если выбранный элемент списка представляет собой пустую строку, QHB автоматически будет использовать табличное пространство по умолчанию для текущей базы данных.

Когда temp_tablespaces задается интерактивно, указание несуществующего табличного пространства является ошибкой, равно как и указание табличного пространства, для которого у пользователя нет права CREATE. Однако при использовании значения, заданного ранее несуществующие табличные пространства и табличные пространства, для которых у пользователя нет права CREATE, игнорируются. В частности, это правило применяется в отношении значения, заданного в qhb.conf.

Значение по умолчанию — пустая строка, поэтому все временные объекты создаются в табличном пространстве по умолчанию текущей базы данных.

См. также default_tablespace .

check_function_bodies (boolean)

Обычно этот параметр включен. Если задать значение off (выключен), выключается проверка строки с телом функции во время выполнения команды CREATE FUNCTION. Выключение проверки позволяет избежать побочных эффектов процесса проверки и избежать ложных срабатываний из-за таких проблем, как ссылки вперед. Этому параметру нужно присваивать значение off перед загрузкой функций от имени других пользователей; qhb_dump делает это автоматически.

default_transaction_isolation (enum)

Для каждой транзакции в SQL устанавливается один из следующих уровней изоляции: «read uncommitted», «read committed», «repeatable read» или «serializable». Этот параметр определяет уровень изоляции, который будет устанавливаться по умолчанию для новых транзакций. Значение по умолчанию — «read committed».

Дополнительную информацию см. в главе Параллельный контроль и описании команды SET TRANSACTION.

default_transaction_read_only (boolean)

Транзакция SQL в режиме «только чтение» не может изменять временные таблицы. Этот параметр определяет, будут ли новые транзакции иметь по умолчанию статус «только чтение». Значение по умолчанию — off (разрешено чтение/запись).

Дополнительную информацию см. в описании команды SET TRANSACTION.

default_transaction_deferrable (boolean)

Откладываемая транзакция SQL в режиме «только чтение», выполняющаяся на уровне изоляции serializable, может быть задержана, прежде чем ей будет разрешено возобновить работу. Однако как только она начнет выполняться, для обеспечения сериализуемости не потребуется никаких дополнительных затрат, поэтому у кода сериализации не будет причин прерывать ее из-за параллельных изменений, поэтому эта особенность подходит для длительных транзакций в режиме «только чтение».

Этот параметр определяет, будут ли новые транзакции по умолчанию откладываемыми. В настоящее время он не влияет на транзакции в режиме «чтение/запись» или с уровнем изоляции ниже serializable. Значение по умолчанию — off (выключен).

Дополнительную информацию см. в описании команды SET TRANSACTION.

transaction_isolation (enum)

Данный параметр отражает уровень изоляции текущей транзакции. В начале каждой транзакции ему присваивается текущее значение default_transaction_isolation. Последующая попытка изменить значение этого параметра равнозначна команде SET TRANSACTION.

transaction_read_only (boolean)

Данный параметр отражает статус режима «только чтение» для текущей транзакции. В начале каждой транзакции ему присваивается текущее значение default_transaction_read_only. Последующая попытка изменить значение этого параметра равнозначна команде SET TRANSACTION.

transaction_deferrable (boolean)

Данный параметр отражает статус «откладываемости» для текущей транзакции. В начале каждой транзакции ему присваивается текущее значение default_transaction_deferrable. Последующая попытка изменить значение этого параметра равнозначна команде SET TRANSACTION.

session_replication_role (enum)

Управляет срабатыванием связанных с репликацией триггеров и правил в текущем сеансе. Установка этой переменной требует наличия прав суперпользователя и приводит к сбросу всех ранее кэшированных планов запросов. Ее допустимые значения: origin (по умолчанию), replica и local.

Предполагается, что системы логической репликации будут устанавливать для этого параметра значение replica, применяя реплицированные изменения. В результате триггеры и правила (у которых не менялась конфигурация по умолчанию) не будут срабатывать в репликах. Дополнительную информацию см. в описании предложений ENABLE TRIGGER и ENABLE RULE команды ALTER TABLE.

Внутри QHB значения origin и local воспринимаются как равнозначные. Сторонние системы репликации могут использовать эти два значения для своих внутренних целей, например, обозначая с помощью local сеанс, изменения в котором не должны реплицироваться.

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

statement_timeout (integer)

Любая команда, выполняющаяся дольше заданного в этом параметре времени, прерывается. Если в log_min_error_statement установлено значение ERROR или ниже, команда, прервавшаяся по времени, также будет записана в журнал. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. При нулевом значении (по умолчанию) это прерывание по времени выключается.

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

Задавать значение statement_timeout в qhb.conf не рекомендуется, поскольку это повлияет на все сеансы.

lock_timeout (integer)

Любая команда, ожидающая дольше заданного в этом параметре времени при получении блокировки таблицы, индекса, строки или другого объекта базы данных, прерывается. Это ограничение по времени применяется к каждой попытке получения блокировки по отдельности. Ограничение применяется как к явным запросам блокировки (например, к LOCK TABLE или SELECT FOR UPDATE без NOWAIT), так и к блокировкам, получаемым неявно. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. При нулевом значении (по умолчанию) это прерывание по времени выключается.

В отличие от statement_timeout, это прерывание по времени может происходить только при ожидании блокировок. Обратите внимание, что при ненулевом значении statement_timeout бессмысленно устанавливать для lock_timeout такое же или большее значение, поскольку прерывание по времени для команды всегда срабатывает первым. Если в log_min_error_statement установлено значение ERROR или ниже, команда, прервавшаяся по времени, будет записана в журнал.

Задавать значение lock_timeout в qhb.conf не рекомендуется, поскольку это повлияет на все сеансы.

idle_in_transaction_session_timeout (integer)

Любой сеанс с открытой транзакцией, которая простаивала дольше заданного в этом параметре времени, завершается. Это позволяет снять любые блокировки, удерживаемые этим сеансом, и повторно использовать слот подключения. Кроме того, это позволяет очистить кортежи, видимые только для этой транзакции. Более подробную информацию см. в разделе Регулярная очистка.

Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. При нулевом значении (по умолчанию) это завершение по времени выключается.

vacuum_freeze_table_age (integer)

Если поле pg_class.relfrozenxid таблицы достигает возраста, заданного в этом параметре, VACUUM будет выполнять агрессивное сканирование. Агрессивное сканирование отличается от обычного выполнения VACUUM тем, что проводится на каждой странице, которая может содержать незамороженные XID или MXID, а не только на тех, которые могут содержать мертвые кортежи. Значение по умолчанию — 150 миллионов транзакций. Хотя пользователи могут задать любое значение в диапазоне от нуля до двух миллиардов, VACUUM будет молча ограничивать действующее значение до предела, равного 95% от autovacuum_freeze_max_age, чтобы периодически запускаемая вручную команда VACUUM имела шанс выполниться до того, как для таблицы будет запущена автоочистка для предотвращения зацикливания. Дополнительную информацию см. в подразделе Предотвращение ошибок зацикливания идентификатора транзакции.

vacuum_freeze_min_age (integer)

Задает возрастную границу (в транзакциях), которая должна использоваться в команде VACUUM при принятии решения о заморозке версий строк в процессе сканирования таблицы. Значение по умолчанию — 50 миллионов транзакций. Хотя пользователи могут задать любое значение в диапазоне от нуля до одного миллиарда, VACUUM будет молча ограничивать действующее значение до предела, равного половине значения autovacuum_freeze_max_age, чтобы перерывы между принудительными автоочистками не были неоправданно короткими. Дополнительную информацию см. в подразделе Предотвращение ошибок зацикливания идентификатора транзакции.

vacuum_multixact_freeze_table_age (integer)

Если поле pg_class.relminmxid таблицы достигает возраста, заданного в этом параметре, VACUUM будет выполнять агрессивное сканирование. Агрессивное сканирование отличается от обычного выполнения VACUUM тем, что проводится на каждой странице, которая может содержать незамороженные XID или MXID, а не только на тех, которые могут содержать мертвые кортежи. Значение по умолчанию — 150 миллионов транзакций. Хотя пользователи могут задать любое значение в диапазоне от нуля до двух миллиардов, VACUUM будет молча ограничивать действующее значение до предела, равного 95% от autovacuum_multixact_freeze_max_age, чтобы периодически запускаемая вручную команда VACUUM имела шанс выполниться до того, как для таблицы будет запущена автоочистка для предотвращения зацикливания. Дополнительную информацию см. в подразделе Мультитранзакции и зацикливание.

vacuum_multixact_freeze_min_age (integer)

Задает возрастную границу (в мультитранзакциях), которая должна использоваться в команде VACUUM при принятии решения о замене идентификатора мультитранзакции более новым идентификатором транзакции или мультитранзакции в процессе сканирования таблицы. Значение по умолчанию — 5 миллионов мультитранзакций. Хотя пользователи могут задать любое значение в диапазоне от нуля до одного миллиарда, VACUUM будет молча ограничивать действующее значение до предела, равного половине значения autovacuum_multixact_freeze_max_age, чтобы перерывы между принудительными автоочистками не были неоправданно короткими. Дополнительную информацию см. в подразделе Мультитранзакции и зацикливание.

vacuum_cleanup_index_scale_factor (floating point)

Задает процент от общего числа кортежей кучи, подсчитанных при предыдущем сборе статистики, который можно вставить без необходимости сканирования индекса на этапе очистки при выполнении команды VACUUM. В настоящее время этот параметр применяется только к индексам B-деревьям.

Если из кучи не было удалено ни одного кортежа, индексы B-деревья все равно будут сканироваться на этапе очистки VACUUM, когда выполняется хотя бы одно из следующих условий: статистика индексов устарела или индекс содержит удаленные страницы, которые при очистке могут быть переработаны для повторного использования. Статистика индексов считается устаревшей, если число вновь вставленных кортежей превышает процент vacuum_cleanup_index_scale_factor от общего числа кортежей в куче, обнаруженных при предыдущем сборе статистики. Общее число кортежей кучи хранится в мета-странице индекса. Обратите внимание, что эти данные попадут в нее только после того, как VACUUM не выявит ни одного мертвого кортежа, поэтому сканирование индекса B-дерева на этапе очистки может быть пропущено, только если мертвые кортежи не будут обнаружены на втором и последующих циклах VACUUM.

Для этого параметра можно задавать значение от 0 до 10000000000. Когда в vacuum_cleanup_index_scale_factor установлено значение 0, сканирование индекса во время очистки VACUUM не пропускается никогда. Значение по умолчанию — 0.1.

bytea_output (enum)

Устанавливает формат вывода для значений типа bytea. Допустимые значения: hex (по умолчанию) и escape (традиционный формат QHB). Дополнительную информацию см. в разделе Двоичные типы данных. На входе данные типа bytea всегда воспринимаются в обоих форматах, независимо от этого параметра.

xmlbinary (enum)

Устанавливает способ кодирования двоичных значений в XML. Это применимо, например, когда значения типа bytea конвертируются в XML с помощью функций xmlelement или xmlforest. Допустимые значения, определенные в стандарте XML-схем: base64 и hex. Значение по умолчанию — base64. Дополнительную информацию о функциях для работы с XML, см. в разделе Функции XML.

Фактический выбор здесь в основном дело вкуса, ограничения могут накладываться только клиентскими приложениями. Оба метода поддерживают все возможные значения, хотя в шестнадцатеричной кодировке результат будет несколько объемнее, чем в кодировке base64.

xmloption (enum)

Устанавливает подразумеваемый по умолчанию режим преобразования между значениями XML и символьными строками. Описание этого преобразования см. в разделе Тип XML. Допустимые значения: DOCUMENT и CONTENT. Значение по умолчанию — CONTENT.

Согласно стандарту SQL этот параметр задается командой

SET XML OPTION { DOCUMENT | CONTENT };

Этот синтаксис также поддерживается в QHB.

gin_pending_list_limit (integer)

Устанавливает максимальный размер очереди записей индекса GIN, который используется, когда включен режим fastupdate. Если размер очереди превышает этот предел, она очищается путем массового переноса записей в основную структуру данных индекса GIN. Если это значение указано без единиц измерения, оно считается заданным в килобайтах. Значение по умолчанию — четыре мегабайта (4MB). Этот параметр можно переопределить для отдельных индексов GIN, изменив их параметры хранения. Дополнительную информацию см. в подразделе Быстрое обновление GIN и разделе Советы и рекомендации по применению GIN.

Языковые стандарты и форматирование

DateStyle (string)

Устанавливает формат отображения значений даты и времени, а также правила интерпретации неоднозначных значений вводимых дат. По историческим причинам эта переменная содержит два независимых компонента: спецификацию выходного формата (ISO, Postgres, SQL или German) и спецификацию, касающуюся порядка год(Y)/ месяц(M)/день(D) при вводе/выводе (DMY, MDY или YMD). Эти компоненты можно задавать вместе или по отдельности. Ключевые слова Euro и European являются синонимами для DMY; ключевые слова US, NonEuro и NonEuropean являются синонимами для MDY. Дополнительную информацию см. в разделе Типы даты/времени. Встроенное значение по умолчанию — ISO, MDY, но initdb инициализирует файл конфигурации со значением, соответствующим поведению выбранной локали lc_time.

IntervalStyle (enum)

Устанавливает формат отображения для значений интервалов. В формате sql_standard интервал будет выводиться в виде, соответствующем стандарту SQL (+Y-M +D +H:MM:SS). В формате postgres (используемом по умолчанию) интервал будет выводиться в виде Y years M mons D days HH:MM:SS. В формате postgres_verbose интервал будет выводиться в виде @ Y years M mons D days H hours M mins S secs. В формате iso_8601 интервал будет выводиться в виде, соответствующем временному интервалу «формат с кодами», определенному в разделе 4.4.3.2 стандарта ISO 8601.

Параметр IntervalStyle также влияет на интерпретацию неоднозначных вводимых интервалов. Дополнительную информацию см. в подразделе Ввод интервалов.

TimeZone (string)

Устанавливает часовой пояс для отображения и интерпретации меток времени. Встроенное значение по умолчанию — GMT, но обычно оно переопределяется в qhb.conf; initdb установит в нем значение, соответствующее системному окружению. Дополнительную информацию см. в подразделе Часовые пояса.

timezone_abbreviations (string)

Устанавливает набор сокращений часовых поясов, которые будут приниматься сервером при вводе даты и времени. Значение по умолчанию — ’Default’, которое представляет собой набор сокращений, принятых в большинстве стран мира; также допускаются значения ’Australia’ и ’India’. Кроме того, для конкретной инсталляции можно определить и другие наборы.

extra_float_digits (integer)

Этот параметр корректирует количество цифр, используемых для текстового вывода чисел с плавающей запятой, включая значения типов float4, float8, а также геометрических типов.

При значении 1 (по умолчанию) или выше числа с плавающей запятой выводятся в кратчайшем точном формате; см. подраздел Типы с плавающей запятой. Фактическое количество генерируемых цифр зависит только от выводимого числа, а не от значения этого параметра. Для чисел типа float8 требуется не более 17 цифр, а для чисел типа float4 — не более 9. Этот формат является и быстрым, и точным, при правильном прочтении в точности сохраняя исходное двоичное число с плавающей запятой. В целях исторической совместимости этот параметр принимает значения до 3 включительно.

Если его значение равно нулю или отрицательно, то выводимое число округляется до заданной десятичной точности. Применяемая точность определяется как стандартное количество цифр для типа (FLT_DIG или DBL_DIG, в зависимости от ситуации), уменьшенное на значение этого параметра. (Например, при значении -1 числа типа float4 будут выводиться округленными до 5 значащих цифр, а числа типа float8 — до 14). Преобразование в этот формат происходит медленнее и не сохраняет все биты двоичного числа с плавающей запятой, но может быть более удобным для восприятия человеком. Дополнительную информацию о поведении этого параметра см. в подразделе Типы с плавающей запятой.

client_encoding (string)

Устанавливает кодировку (набор символов) на стороне клиента. По умолчанию используется кодировка базы данных. Наборы символов, поддерживаемые сервером QHB, описаны в подразделе Поддерживаемые кодировки.

lc_messages (string)

Устанавливает язык, на котором отображаются сообщения. Допустимые значения зависят от системы; дополнительную информацию см. в разделе Поддержка языковых стандартов. Если для этой переменной задана пустая строка (по умолчанию), то значение наследуется от среды выполнения сервера системно-зависимым способом.

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

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

lc_monetary (string)

Устанавливает языковой стандарт для форматирования денежных сумм, например, с использованием функций семейства to_char. Допустимые значения зависят от системы; дополнительную информацию см. в разделе Поддержка языковых стандартов. Если для этой переменной задана пустая строка (по умолчанию), то значение наследуется от среды выполнения сервера системно-зависимым способом.

lc_numeric (string)

Устанавливает языковой стандарт для форматирования чисел, например, с использованием функций семейства to_char. Допустимые значения зависят от системы; дополнительную информацию см. в разделе Поддержка языковых стандартов. Если для этой переменной задана пустая строка (по умолчанию), то значение наследуется от среды выполнения сервера системно-зависимым способом.

lc_time (string)

Устанавливает языковой стандарт для форматирования даты и времени, например, с использованием функций семейства to_char. Допустимые значения зависят от системы; дополнительную информацию см. в разделе Поддержка языковых стандартов. Если для этой переменной задана пустая строка (по умолчанию), то значение наследуется от среды выполнения сервера системно-зависимым способом.

default_text_search_config (string)

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

Встроенное значение по умолчанию — pg_catalog.simple, но initdb инициализирует файл конфигурации со значением, соответствующим выбранной локали lc_ctype, если получится определить ее конфигурацию.

Предварительная загрузка разделяемых библиотек

Для настройки предварительной загрузки на сервер разделяемых библиотек доступно несколько параметров, позволяющих подключить дополнительные функции или повысить производительность. Например, при значении ’$libdir/mylib’ в память будет загружена mylib.so (или на некоторых платформах mylib.sl) из стандартного каталога библиотек данной инсталляции. Различия между этими параметрами заключаются в том, когда они вступают в силу и какие права требуются для их изменения.

Таким образом можно предварительно загрузить библиотеки на процедурных языках QHB, обычно используя синтаксис ’$libdir/plXXX где XXX — это имя языка: pgsql, perl, tcl или python.

Только разделяемые библиотеки, предназначенные специально для использования с QHB, могут быть загружены таким образом. Каждая библиотека, поддерживаемая QHB, имеет «магический блок», который проверяется на совместимость. Поэтому загрузить таким способом библиотеки не для QHB нельзя. Для этого можно воспользоваться средствами операционной системы, например LD_PRELOAD.

В целом, чтобы узнать рекомендуемый способ загрузки конкретного модуля, следует обратиться к документации этого модуля.

local_preload_libraries (string)

Эта переменная задает одну или несколько разделяемых библиотек, которые будут предварительно загружаться при установке соединения. Она содержит разделенный запятыми список имен библиотек, где каждое имя должно восприниматься командой LOAD. Пробелы между именами игнорируются; если требуется включить в имя пробелы или запятые, заключите его в кавычки. Заданное значение этого параметра действует только в начале соединения. Последующие изменения ни на что не влияют. Если указанная в списке библиотека не найдена, попытка подключения завершится неудачно.

Этот параметр может задать любой пользователь. Из-за этого загружать можно только библиотеки, находящиеся в подкаталоге plugins стандартного каталога библиотек данной инсталляции. (Ответственность за то, чтобы там находились только «безопасные» библиотеки, несет администратор.) В local_preload_libraries этот каталог можно задать явно (например, $libdir/plugins/mylib), или просто задать имя библиотеки — mylib (оно будет воспринято как $libdir/plugins/mylib).

Цель этой функциональности — позволить пользователям, не имеющим специальных прав, загружать отладочные библиотеки или библиотеки для оценки производительности в конкретные сеансы, обходясь без явной команды LOAD. Для этой цели данный параметр обычно устанавливается в переменной среды PGOPTIONS на клиенте или с помощью команды ALTER ROLE SET.

Однако обычно этот параметр не следует использовать, если только модуль не предназначен специально для такой загрузки обычными пользователями. В качестве альтернативы рекомендуется рассмотреть session_preload_libraries (см. ниже).

session_preload_libraries (string)

Эта переменная задает одну или несколько разделяемых библиотек, которые будут предварительно загружаться при установке соединения. Она содержит разделенный запятыми список имен библиотек, где каждое имя должно восприниматься командой LOAD. Пробелы между именами игнорируются; если требуется включить в имя пробелы или запятые, заключите его в кавычки. Заданное значение этого параметра действует только в начале соединения. Последующие изменения ни на что не влияют. Если указанная в списке библиотека не найдена, попытка подключения завершится неудачно. Этот параметр могут изменить только суперпользователи.

Цель этой функциональности — позволить загружать отладочные библиотеки или библиотеки для оценки производительности в конкретные сеансы, обходясь без явной команды LOAD. Например, можно загрузить модуль auto_explain

во всех сеансах пользователя с заданным именем, установив этот параметр с помощью команды ALTER ROLE SET. Кроме того, этот параметр можно менять без перезапуска сервера (но изменения вступают в силу только при запуске нового сеанса), поэтому таким образом проще подгружать новые модули, даже если это нужно сделать для всех сеансов.

В отличие от shared_preload_libraries (см. ниже), загрузка библиотеки при запуске сеанса, а не при первом использовании не дает большого выигрыша в производительности. Однако при использовании пула соединений некоторое преимущество возникает.

shared_preload_libraries (string)

Эта переменная задает одну или несколько разделяемых библиотек, которые будут предварительно загружаться при запуске сервера. Она содержит разделенный запятыми список имен библиотек, где каждое имя должно восприниматься командой LOAD. Пробелы между именами игнорируются; если требуется включить в имя пробелы или запятые, заключите его в кавычки. Этот параметр можно задать только при запуске сервера. Если указанная в списке библиотека не будет найдена, сервер не запустится.

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

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

jit_provider (string)

Эта переменная представляет собой имя библиотеки провайдера JIT, которая будет использоваться. Значение по умолчанию — llvmjit. Этот параметр можно задать только при запуске сервера.

Если указывается несуществующая библиотека, JIT будет недоступен, но ошибки не возникнет. Это позволяет устанавливать поддержку JIT отдельно от основного пакета QHB.

Другие параметры по умолчанию

dynamic_library_path (string)

Если необходимо открыть динамически загружаемый модуль и его имя, заданное в команде CREATE FUNCTION или LOAD, не содержит имени каталога (т. е. в имени нет слэша), система будет искать требуемый файл в этом пути.

Значением dynamic_library_path должен быть список абсолютных путей к каталогам, разделенных двоеточием. Если элемент списка начинается со специальной строки $libdir, вместо нее подставляется указанный при компиляции каталог пакета библиотек QHB; сюда устанавливаются модули, предоставляемые стандартным дистрибутивом QHB. (Чтобы узнать имя этого каталога, выполните pg_config --pkglibdir.) Например:

dynamic_library_path = '/usr/local/qhb/lib:/home/my_project/lib:$libdir'

Значение по умолчанию для этого параметра — ’$libdir’. Если в качестве значения задана пустая строка, автоматический поиск по заданному пути выключается.

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

gin_fuzzy_search_limit (integer)

Мягкий верхний предел для размера набора, возвращаемого при сканировании индексов GIN. Дополнительную информацию см. в разделе Советы и рекомендации по применению GIN.

Управление блокировками

deadlock_timeout (integer)

Это время ожидания блокировки, по истечении которого будет произведена проверка состояния взаимоблокировки. Проверка на взаимоблокировку является относительно дорогой, поэтому сервер не выполняет ее каждый раз при ожидании блокировки. Мы с оптимизмом предполагаем, что взаимоблокировки не часто случаются в производственных приложениях, и просто ждем некоторое время, прежде чем проверять наличие взаимоблокировок. Увеличение значения этого параметра сокращает время, затрачиваемое на ненужные проверки взаимоблокировок, но замедляет передачу сообщений о реальных взаимоблокировках. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — одна секунда (1s), что, наиболее близко к минимальному значению, которое желательно применять на практике. На сильно загруженном сервере его можно увеличить. В идеале значение этого параметра должно превышать типичное время транзакции, чтобы повысить вероятность того, что блокировка будет снята раньше, чем ожидающая транзакция решит проверить состояние взаимоблокировки. Только суперпользователи могут изменять этот параметр.

Когда включен параметр log_lock_waits, этот параметр также определяет время ожидания, по истечении которого в журнал сервера будет записано сообщение об ожидании блокировки. Если вы пытаетесь исследовать задержки, вызванные блокировками, имеет смысл задать параметру deadlock_timeout более низкое значение, чем обычно.

max_locks_per_transaction (integer)

Общая таблица блокировок отслеживает блокировки для max_locks_per_transaction * (max_connections + max_prepared_transactions) объектов (например, таблиц); таким образом, в любой момент времени может быть заблокировано не более этого количества различных объектов. Этот параметр управляет средним количеством блокировок объектов, выделяемым для каждой транзакции; отдельные транзакции могут заблокировать больше объектов, если все блокировки помещаются в таблице. Это не количество строк, которые могут быть заблокированы; их количество не ограничено. Значение по умолчанию, 64, как показало время, является достаточным, но может возникнуть необходимость его увеличить, если запросы обращаются ко множеству различных таблиц в одной транзакции, как например, запрос к родительской таблице со множеством потомков. Этот параметр можно задать только при запуске сервера.

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

max_pred_locks_per_transaction (integer)

Общая таблица предикатных блокировок отслеживает блокировки для max_pred_locks_per_transaction * (max_connections + max_prepared_transactions) объектов (например, таблиц); таким образом, в любой момент времени может быть заблокировано не более этого количества различных объектов. Этот параметр управляет средним количеством блокировок объектов, выделяемым для каждой транзакции; отдельные транзакции могут заблокировать больше объектов, если все блокировки помещаются в таблице. Это не количество строк, которые могут быть заблокированы; их количество не ограничено. Значение по умолчанию, 64, как показала практика, вполне удовлетворительно, но может возникнуть необходимость его увеличить, если клиенты обращаются ко множеству различных таблиц в одной сериализуемой транзакции. Этот параметр можно задать только при запуске сервера.

max_pred_locks_per_relation (integer)

Этот параметр определяет, сколько страниц или кортежей одного отношения может быть предикатно заблокировано, прежде чем блокировка будет распространена на все отношение. Значения, большие или равные нулю, означают абсолютный предел, а при отрицательном значении предел будет равен значению max_pred_locks_per_transaction, деленному на модуль этого значения. По умолчанию установлено значение -2, при котором сохраняется поведение, наблюдавшееся в предыдущих версиях QHB. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

max_pred_locks_per_page (integer)

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

Совместимость с разными версиями и платформами

Предыдущие версии QHB

array_nulls (boolean)

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

Обратите внимание, что массивы, содержащие NULL, можно создавать, даже если эта переменная имеет значение off.

backslash_quote (enum)

Этот параметр определяет, можно ли будет представить знак апострофа в строковом литерале в виде \'. В стандарте SQL представлен другой, предпочитаемый способ представления знака апострофа путем его дублирования (''), но исторически QHB также принимал \'. Однако использование варианта \' создает риски безопасности, потому что в некоторых клиентских кодировках в наборе символов существуют многобайтовые символы, последний байт которых численно равнозначен коду ASCII \. Если код на стороне клиента выполнит экранирование некорректно, это может привести к атаке SQL-инъекцией. Этот риск можно предотвратить, заставив сервер отклонять запросы, в которых апостроф экранируется обратным слэшем. Допустимые значения параметра backslash_quote: on (всегда принимать \'), off (всегда отклонять) и safe_encoding (принимать только в том случае, если клиентская кодировка не допускает наличия кода ASCII \ в многобайтовых символах). Значение по умолчанию — safe_encoding.

Обратите внимание, что в строковом литерале, соответствующем стандарту, знаки \ в любом случае обозначают просто \. Этот параметр влияет только на восприятие нестандартных литералов, включая синтаксис с экранированием строки (E’...’).

escape_string_warning (boolean)

Когда этот параметр включен, выдается предупреждение, если в обычном строковом литерале (с синтаксисом ’...’) появляется обратный слэш (\), а параметр standard_conforming_strings выключен. Значение по умолчанию — on (включен).

Приложения, которые желают использовать обратный слэш в качестве управляющего символа, необходимо модифицировать для использования синтаксиса с экранированными строками (E’...’), поскольку по умолчанию теперь в обычных строках обратный слэш воспринимается как обычный символ, в соответствии со стандартом SQL. Включение этой переменной помогает найти код, нуждающийся в изменении.

lo_compat_privileges (boolean)

Если задать для этой переменной значение on (включено), то новые проверки прав выключатся в целях совместимости с предыдущими версиями QHB. Значение по умолчанию — off (выключено). Только суперпользователи могут изменять этот параметр.

Установка этой переменной выключает не все проверки безопасности, связанные с большими объектами.

operator_precedence_warning (boolean)

Когда этот параметр включен, синтаксический анализатор будет выдавать предупреждение для любой конструкции, которая могла бы изменить поведение в результате изменения приоритетов операторов в новых версиях QHB. Проверка того, не сломалось ли что-то в результате изменения приоритета, полезна для аудита приложений; но данный параметр не стоит держать включенным постоянно, поскольку предупреждения будут выдаваться и тогда, когда код совершенно корректный и соответствует стандарту SQL. Значение по умолчанию — off (выключено).

Дополнительную информацию см. в подразделе Приоритеты операторов.

quote_all_identifiers (boolean)

Этот параметр принудительно заключает в кавычки все идентификаторы, даже если это не ключевые слова (в настоящее время), при получении SQL из базы данных. Это затрагивает вывод EXPLAIN а также результаты функций типа pg_get_viewdef. См. также описание параметра --quote-all-identifiers команд qhb_dump и qhb_dumpall.

standard_conforming_strings (boolean)

Этот параметр определяет, будут ли обычные строковые литералы (’...’) воспринимать обратный слэш буквально, как указано в стандарте SQL. Значение по умолчанию — on (включено). Приложения могут проверять этот параметр, чтобы определить, как будут обрабатываться строковые литералы. Также наличие этого параметра может рассматриваться как признак того, что поддерживается синтаксис экранируемых строк (E’...’). Этот синтаксис (подраздел Строковые константы с экранированием в стиле C) следует использовать, если приложению нужно, чтобы обратные слэши воспринимались как спецсимволы.

synchronize_seqscans (boolean)

Этот параметр позволяет синхронизировать обращения при последовательном сканировании больших таблиц, чтобы эти обращения считывали один блок примерно в одно и то же время и тем самым разделяли рабочую нагрузку на ввод-вывод данных. Когда этот параметр включен, сканирование может начаться в середине таблицы, чтобы синхронизироваться с уже выполняющимся сканированием, а достигнув конца, «завернуться» к началу, чтобы обработать оставшиеся строки. Это может привести к непредсказуемым изменениям порядка строк, возвращаемых запросами, в которых нет предложения ORDER BY. При значении off (выключен) последовательное сканирование всегда начинается с начала таблицы. Значение по умолчанию — on.

Совместимость с разными платформами и клиентами

transform_null_equals (boolean)

Когда этот параметр включен, выражения вида выражение = NULL (или NULL = выражение) обрабатываются как выражение IS NULL, то есть они возвращают true (истинны), если выражение дает значение NULL, и false (ложны) в противном случае. Согласно спецификации SQL, сравнение выражение = NULL должно всегда возвращать NULL (неизвестное значение). Поэтому по умолчанию этот параметр выключен (установлен в off).

Однако отфильтрованные формы в Microsoft Access генерируют запросы, использующие выражение = NULL для проверки на значения NULL, поэтому, если вы пользуетесь этим интерфейсом для доступа к базе данных, имеет смысл включить этот параметр. Поскольку выражения вида выражение = NULL всегда возвращают значение NULL (согласно интерпретации стандарта SQL), они не очень полезны и не часто появляются в обычных приложениях, поэтому на практике от этого параметра вреда немного. Но новые пользователи часто путаются в семантике выражений, содержащих значения NULL, поэтому по умолчанию этот параметр выключен.

Обратите внимание, что этот параметр влияет только на точную форму сравнения = NULL, но не на другие операторы сравнения или другие выражения, которые в вычислительном отношении равнозначны некоторому выражению с оператором равенства (например, IN). Таким образом, этот параметр не может быть универсальным решением проблем плохого программирования.

Сопутствующую информацию см. в разделе Функции и операторы сравнения.

Обработка ошибок

exit_on_error (boolean)

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

restart_after_crash (boolean)

Если этот параметр включен (значение on, установлено по умолчанию), QHB будет автоматически перезагружаться после сбоя серверного процесса. Обычно это лучший способ обеспечить максимальную доступность базы данных. Однако в некоторых обстоятельствах, например, когда QHB активизируется кластерным ПО, такую перезагрузку лучше выключить, чтобы кластерное ПО могло получить контроль и выполнить действия, которые сочтет целесообразными.

data_sync_retry (boolean)

Если этот параметр выключен (значение off, установлено по умолчанию), QHB будет выдавать ошибку уровня PANIC в случае неудачи при попытке сохранить файлы с измененными данными в файловую систему. Это приведет к сбою сервера базы данных. Этот параметр можно задать только при запуске сервера.

В некоторых операционных системах состояние данных в кэше страниц ядра после ошибки обратной записи неизвестно. В некоторых случаях эти данные могут полностью пропасть, и становится опасно повторять попытку записи: вторая попытка может быть объявлена успешной, тогда как в действительности данные были утеряны. В подобных обстоятельствах единственный способ избежать потери данных — после любого сбоя восстанавливать их из WAL, предпочтительно перед этим выяснив основную причину сбоя и заменив неисправное оборудование.

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

Предустановленные параметры

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

block_size (integer)

Сообщает размер блока на диске. Он определяется значением BLCKSZ при сборке сервера. Значение по умолчанию — 8192 байта. От значения block_size зависят некоторые другие переменные конфигурации (например, shared_buffers). Информацию об этом можно найти в разделе Потребление ресурсов.

data_checksums (boolean)

Сообщает, включено ли в этом кластере применение контрольных сумм для проверки данных. Дополнительную информацию см. в описании data-checksums.

data_directory_mode (integer)

В системах Unix этот параметр сообщает о разрешениях для каталога данных (data_directory), определенных при запуске. Дополнительную информацию см. в описании group-access.

debug_assertions (boolean)

Сообщает, был ли QHB собран с включенными операторами подтверждения отсутствия ошибок. Это происходит, если при сборке QHB определяется макрос USE_ASSERT_CHECKING (например, посредством configure с параметром --enable-cassert). По умолчанию QHB собирается без операторов подтверждения.

integer_datetimes (boolean)

Сообщает, был ли QHB собран с поддержкой даты и времени в 64-битных целых. Значение по умолчанию — on (включено).

lc_collate (string)

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

lc_ctype (string)

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

max_function_args (integer)

Сообщает максимальное количество аргументов функции. Оно определяется значением константы FUNC_MAX_ARGS при сборке сервера. Значение по умолчанию — 100 аргументов.

max_identifier_length (integer)

Сообщает максимальную длину идентификатора. Она определяется числом на единицу меньше значения NAMEDATALEN при сборке сервера. По умолчанию значение константы NAMEDATALEN равно 64; следовательно значение max_identifier_length по умолчанию — 63 байта, но в многобайтовых кодировках число символов будет меньше.

max_index_keys (integer)

Сообщает максимальное количество ключей индекса. Оно определяется значением константы INDEX_MAX_KEYS при сборке сервера. Значение по умолчанию — 32 ключа.

segment_size (integer)

Сообщает количество блоков (страниц), которые можно сохранить в сегменте файла. Оно определяется значением константы RELSEG_SIZE при сборке сервера. Максимальный размер сегмента в байтах равен произведению segment_size и block_size; по умолчанию это 1 ГБ.

server_encoding (string)

Сообщает кодировку базы данных (набор символов). Она определяется при создании базы данных. Обычно клиенты должно интересовать только значение client_encoding.

server_version (string)

Сообщает номер версии сервера. Он определяется значением константы PG_VERSION при сборке сервера.

server_version_num (integer)

Сообщает номер версии сервера в виде целого числа. Он определяется значением константы PG_VERSION_NUM при сборке сервера.

ssl_library (string)

Сообщает имя библиотеки SSL, с которой был собран этот сервер QHB (даже если на данный момент SSL для данного экземпляра не настроен или не используется), например OpenSSL, либо выводит пустую строку, если сборка проводилась без библиотеки.

wal_block_size (integer)

Сообщает размер блока WAL на диске. Он определяется значением константы XLOG_BLCKSZ при сборке сервера. Значение по умолчанию — 8192 байта.

wal_segment_size (integer)

Сообщает размер сегментов журнала упреждающей записи. Значение по умолчанию — 16 МБ. Дополнительную информацию см. в разделе Конфигурация WAL.

Специализированные параметры

Эта функция была разработана для того, чтобы дополнительные модули (например, процедурные языки) могли добавлять параметры, обычно не известные QHB. Это позволяет настраивать модули расширения стандартными способами.

Имена специализированных параметров состоят из двух частей: имя расширения, затем, после точки, собственно имя параметра, по аналогии с полными именами в SQL. Например: plpgsql.variable_conflict.

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

Параметры для разработчиков

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

allow_system_table_mods (boolean)

Позволяет изменять структуру системных таблиц. Этот параметр используется командой initdb. Этот параметр можно задать только при запуске сервера.

ignore_system_indexes (boolean)

Включает игнорирование системных индексов при чтении системных таблиц (но при этом индексы все равно будут меняться при изменении этих таблиц). Это полезно для восстановления системы при поврежденных системных индексах. Этот параметр нельзя изменить после запуска сеанса.

post_auth_delay (integer)

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

pre_auth_delay (integer)

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

trace_notify (boolean)

Включает выведение очень подробной отладочной информации при выполнении команд LISTEN и NOTIFY. Чтобы отправлять эти выходные данные клиенту или в журнал сервера, параметр client_min_messages или log_min_messages соответственно должен иметь значение DEBUG1 или ниже.

trace_recovery_messages (enum)

Включает запись в журнал отладочной информации, связанной с восстановлением, которая иначе не протоколируется. Этот параметр позволяет пользователю переопределить обычное значение log_min_messages, но только для определенных сообщений. Он предназначен для использования при отладке режима горячего резерва. Допустимые значения: DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1 и LOG. Значение по умолчанию, LOG, никак не влияет на решения о протоколировании. С другими значениями связанные с восстановлением отладочные сообщения, имеющие заданный приоритет или выше, записываются так, как если бы имели приоритет LOG; при обычных значениях log_min_messages это подразумевает их обязательную передачу в журнал сервера. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

trace_sort (boolean)

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

trace_locks (boolean)

Если этот параметр включен, будет выводиться информация об использовании блокировок. Эта информация включает тип операции блокировки, тип самой блокировки и уникальный идентификатор заблокированного или разблокированного объекта. Также включены битовые маски для типов блокировки, уже полученных для этого объекта, а также для типов блокировки, ожидающих его. Кроме того, выводится количество полученных и ожидающих блокировок для каждого типа блокировки, а также их общее число. Далее показан пример вывода в файл журнала:

LOG:  LockAcquire: new: lock(0xb7acd844) id(24688,24696,0,0,0,1)
    grantMask(0) req(0,0,0,0,0,0,0)=0 grant(0,0,0,0,0,0,0)=0
    wait(0) type(AccessShareLock)
LOG:  GrantLock: lock(0xb7acd844) id(24688,24696,0,0,0,1)
    grantMask(2) req(1,0,0,0,0,0,0)=1 grant(1,0,0,0,0,0,0)=1
    wait(0) type(AccessShareLock)
LOG:  UnGrantLock: updated: lock(0xb7acd844) id(24688,24696,0,0,0,1)
    grantMask(0) req(0,0,0,0,0,0,0)=0 grant(0,0,0,0,0,0,0)=0
    wait(0) type(AccessShareLock)
LOG:  CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
    grantMask(0) req(0,0,0,0,0,0,0)=0 grant(0,0,0,0,0,0,0)=0
    wait(0) type(INVALID)

Подробную информацию о структуре выводимой информации можно найти в src/include/storage/lock.h

Этот параметр доступен, только если при компиляции QHB был определен макрос LOCK_DEBUG.

trace_lwlocks (boolean)

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

Этот параметр доступен, только если при компиляции QHB был определен макрос LOCK_DEBUG.

trace_userlocks (boolean)

Если этот параметр включен, будет выводиться информация об использовании пользовательских блокировок. Она выводится в той же форме, что и с trace_locks, но для рекомендательных блокировок.

Этот параметр доступен, только если при компиляции QHB был определен макрос LOCK_DEBUG.

trace_lock_oidmin (integer)

Если этот параметр установлен, блокировки для таблиц ниже заданного OID трассироваться не будут (это используется, чтобы исключить выведение информации по системным таблицам).

Этот параметр доступен, только если при компиляции QHB был определен макрос LOCK_DEBUG.

trace_lock_table (integer)

Обязательно трассировать блокировки для таблицы с заданным OID.

Этот параметр доступен, только если при компиляции QHB был определен макрос LOCK_DEBUG.

debug_deadlocks (boolean)

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

Этот параметр доступен, только если при компиляции QHB был определен макрос LOCK_DEBUG.

log_btree_build_stats (boolean)

Если этот параметр установлен, будет протоколироваться статистика использования системных ресурсов (память и ЦП) при различных операциях с B-деревом.

Этот параметр доступен, только если при компиляции QHB был определен макрос BTREE_BUILD_STATS.

wal_consistency_checking (string)

Этот параметр предназначен для проверки ошибок в процедурах воспроизведения WAL. Когда этот параметр включен, в запись WAL добавляются полностраничные изображения всех изменяемых вместе с ней буферов. Если эта запись впоследствии воспроизводится, система сначала применяет каждую запись, а затем проверяет, соответствуют ли измененные этой записью буферы сохраненным образам. В некоторых случаях (например, во вспомогательных битах) незначительные изменения допустимы и будут игнорироваться. Любые неожиданные различия приведут к фатальной ошибке, и восстановление прекратится.

Значение этого параметра по умолчанию, пустая строка, выключает эту функцию. Его значением может быть all для проверки всех записей или список имен менеджеров ресурсов через запятую для проверки только записей, поступающих от этих менеджеров. В настоящее время поддерживаются следующие менеджеры ресурсов: heap, heap2, btree, hash, gin, gist, sequence, spgist, brin и generic. Только суперпользователи могут изменять этот параметр.

wal_debug (boolean)

Если этот параметр включен, будет выводиться отладочная информация, связанная с WAL. Этот параметр доступен, только если при компиляции QHB был определен макрос WAL_DEBUG.

ignore_checksum_failure (boolean)

Этот параметр действует, только если включен data-checksums.

При обнаружении ошибки контрольной суммы во время чтения QHB обычно сообщает об ошибке, прерывая текущую транзакцию. Если для параметра ignore_checksum_failure задано значение on (включено), система игнорирует ошибку (но все равно выдает предупреждение) и продолжает обработку. Такое поведение может привести к сбою, распространению или сокрытию повреждения данных или другим серьезным проблемам. Однако оно же позволяет обойти ошибку и извлечь неповрежденные кортежи, которые все еще могут находиться в таблице, если заголовок блока адекватен. Если заголовок поврежден, будет выдана ошибка, даже если этот параметр включен. Значение по умолчанию — off (выключено), и изменить его может только суперпользователь.

zero_damaged_pages (boolean)

При обнаружении поврежденного заголовка страницы QHB обычно сообщает об ошибке, прерывая текущую транзакцию. Если для параметра zero_damaged_pages задано значение on (включено), система вместо этого выдаст предупреждение, обнулит поврежденную страницу в памяти и продолжит обработку. Такое поведение разрушит данные, а именно все строки на поврежденной странице. Однако оно же позволяет обойти ошибку и извлечь строки из любых неповрежденных страниц, которые могут находиться в таблице. Это полезно для восстановления данных, поврежденных из-за аппаратной или программной ошибки. Обычно его стоит включать, только если не осталось никакой другой надежды восстановить данные с поврежденных страниц таблицы. Обнуленные страницы не сохраняются на диск, поэтому прежде чем снова выключить этот параметр, рекомендуется пересоздать такие таблицы или индексы. Значение по умолчанию — off (выключено), и изменить его может только суперпользователь.

jit_debugging_support (boolean)

Если LLVM обладает необходимой функциональностью, регистрировать сгенерированные функции в GDB. Это облегчает отладку. Значение по умолчанию — off. Этот параметр можно задать только при запуске сервера.

jit_dump_bitcode (boolean)

Записывает сгенерированный LLVM IR-код в файловую систему, в каталог data_directory. Это полезно только для работы с внутренними компонентами реализации JIT. Значение по умолчанию — off (выключено). Этот параметр может изменить только суперпользователь.

jit_expressions (boolean)

Определяет, скомпилированы ли выражения JIT, когда JIT-компиляция активирована

. Значение по умолчанию — *on*

(включено).

jit_profiling_support (boolean)

Если LLVM обладает необходимой функциональностью, выдавать данные, необходимые perf для профилирования функций, сгенерированных JIT. Выходные файлы записываются в $HOME/.debug/jit/; удалять их при желании должен сам пользователь. Значение по умолчанию — off (выключено). Этот параметр можно задать только при запуске сервера.

jit_tuple_deforming (boolean)

Определяет, будет ли JIT-компилироваться преобразование кортежей, когда JIT-компиляция активирована. Значение по умолчанию — on (включено).

Краткие аргументы

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

Таблица 2. Ключ краткого аргумента

Краткий аргументЭквивалент
-B xshared_buffers = x
-d xlog_min_messages = DEBUGx
-edatestyle = euro
-fb, -fb, -fh, -fm, -fn, -fo, -fs, -ftenable_bitmapscan = off, enable_hashjoin = off, enable_indexscan = off, enable_mergejoin = off, enable_nestloop = off, enable_indexonlyscan = off, enable_seqscan = off, enable_tidscan = off
-Ffsync = off
-h xlisten_addresses = x
-ilisten_addresses = '*'
-k xunix_socket_directories = x
-lssl = on
-N xmax_connections = x
-Oallow_system_table_mods = on
-p xport = x
-Pignore_system_indexes = on
-slog_statement_stats = on
-S xwork_mem = x
-tpa, -tpl, -telog_parser_stats = on, log_planner_stats = on, log_executor_stats = on, log_executor_stats = on
-W xpost_auth_delay = x

Параметры модулей и расширений, специфичных для QHB

Менеджер кэша дисковых блоков TARQ

use_qhb_cache (boolean)

Логический параметр. При установке значения в true будет использоваться новая версия кэша.

qhb_cache_size (integer)

Общий размер буферного кэша (при включении use_qhb_cache=true значение shared_buffers не используется).

shared_buffers_partitions (integer)

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

Рекомендуемое значение: 128.

tarq_cache.touch_queue_ignore (integer)

Процент заполнения фрагмента кэша при котором обращения начинают приводить к операциям балансировки. Может принимать значения от 1 до 100 (целые числа). Для незаполненного или заполненного частично фрагмента балансировок не требуется.

Рекомендуемое значение: 50.

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

tarq_cache.touch_window (integer)

Время в секундах. Все обращения в течение этого периода считаются одним обращением.

Рекомендуемое значение: 3.

tarq_cache.touch_threshold (integer)

Количество обращений к буферу, по достижении которого происходит операция ребалансировки.

Рекомендуемое значение: 5.

Параметр HOLDMEM и дополнительные кэши дисковых блоков

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

use_possible_buffer (boolean)

Логический параметр. При установке значения в TRUE будет использоваться этот кэш.

qhb_possible_buffers_size (integer)

Общий размер буферного кэша.

shared_buffers_partitions (integer)

Используется общий параметр с TARQ - размер фрагментов кэша (партиций; не имеют отношения к партициям таблицы).

Обращение к каждому фрагменту происходит независимо от остальных. Слишком большой размер партиций приведет к возрастанию конкуренции за блокировки, слишком маленький может привести к задержкам, если в партиции не окажется пригодных к вытеснению блоков (все «грязные» или занятые фоновым процессом).

Рекомендуемое значение: 128.

use_qhb_onlymem_cache (boolean)

Логический параметр. При установке значения в TRUE будет использоваться этот кэш.

qhb_onlymem_cache_size (integer)

Общий размер буферного кэша.

Внешнее хранение двоичных данных Rbytea

rbytea.filesystem_storage_path (string)

Определение каталога (точки монтирования файловой системы / тома) для сохранения образов данных.

Двоичные данные будут сохраняться в данном каталоге сервера. Для каждой базы будет создаваться свой подкаталог (по oid базы), а внутри него, во множестве подкаталогов, — собственно файлы с данными.

Имена вложенных каталогов от каталога базы данных до файла будут составлять uuid типа rbytea, а расширение файла — номер транзакции, в которой данные впервые появились в системе.

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

По умолчанию, если параметр опущен или пуст, каталогом для сохранения двоичных данных назначается '<каталог базы данных>/rbytea'.

shared_preload_libraries (string)

Загрузка разделяемой библиотеки при старте QHB.

Данный параметр обеспечивает загрузку разделяемой библиотеки при старте QHB и инициализацию фонового процесса для очистки устаревших образов. В противном случае автоочистка устаревших образов производится не будет.

Необходимо добавить значение 'librbytea'.

Примечание
Если параметр shared_preload_libraries уже содержит указание на загрузку других библиотек, нужно не перезаписать его значение, а добавить через разделитель librbytea.

rbytea.worker_restart_time (integer)

Интервал запуска фонового процесса очистки.

Фоновый процесс не работает постоянно. Поскольку данные

достаточно статичны, не требуется запускать процесс очистки слишком часто. Задержка от окончания предыдущего запуска до следующего запуска задается в данном параметре. Значение указано в секундах.

По умолчанию параметр устанавливается в значение 86400 секунд (сутки).

rbytea.databases_for_vacuuming (string)

Задание баз данных для фонового процесса очистки.

Параметр указывает, какие базы данных подлежат очистке. Указываются названия баз данных через запятую. Главный процесс базы данных будет запускать столько фоновых процессов очистки, сколько баз данных перечислено в данном параметре.

По умолчанию, параметр устанавливается в значение qhb.

rbytea.filesystem_qss_mode (integer)

Включение фонового шифрования.

Если в системе доступно фоновое шифрование при записи на диск, данный параметр позволяет зашифровывать также и двоичные данные rbytea. Для шифрования параметр необходимо установить в значение 1.

При зашифровании данные дополняются (выравниваются) до границы 16-байтных блоков, поэтому функции len(rbytea) и len_full(rbytea) для одних и тех же данных могут возвращать разное значение. А функции md5store(rbytea) и sha256store(rbytea) подсчитывают контрольные суммы для зашифрованных данных, дополненных до границы 16-байтного блока.

Вопросы смены ключа шифрования должны решаться администратором базы данных.

По умолчанию этот параметр устанавливается в значение 0.

2B: Поддержка решений 1С

Конфигурационные параметры немедленного обновления статистики

online_analyze.enable (boolean)

Включение/выключение функции немедленного анализа.

По умолчанию, параметр устанавливается в значение false.

online_analyze.verbose (boolean)

Включение/выключение возможности записи в лог при сборе статистики (аналогично команде SQL ANALYZE VERBOSE).

По умолчанию, параметр устанавливается в значение false.

online_analyze.table_type (enum)

Указывает тип таблиц, для которых следует применять немедленный анализ. Возможные варианты значений: all (все), persistent (постоянные), temporary (временные), none (никакие).

По умолчанию, параметр устанавливается в значение temporary.

online_analyze.exclude_tables (string)

Указывает список таблиц, исключаемых из немедленного анализа. Например, "имя_таблицы_1, имя_таблицы_2 ..."**.

По умолчанию, параметр устанавливается в пустое значение ('').

online_analyze.include_tables (string)

Указывает список таблиц, подлежащих немедленному анализу (этот параметр перекрывает online_analyze.exclude_tables).

По умолчанию, параметр устанавливается в пустое значение ('').

Примечание
Значения этих двух параметров записываются в виде списка имен таблиц через запятую.

online_analyze.local_tracking (boolean)

Включение/выключение хранения статистики временных таблиц в локальном кэше.

По умолчанию, параметр устанавливается в значение false

online_analyze.capacity_threshold (integer)

Указывает максимальное число временных таблиц, сохраняемых в локальном кэше.

По умолчанию, параметр устанавливается в значение 100000.

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

online_analyze.scale_factor (floating point)

Указывает процент измененных строк от всей таблицы, при котором начинается немедленный анализ.

По умолчанию, параметр устанавливается в значение 0.1.

online_analyze.threshold (integer)

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

По умолчанию, параметр устанавливается в значение 50.

online_analyze.lower_limit (integer)

Указывает минимальное число строк в таблице, при котором может начаться немедленный анализ.

По умолчанию, параметр устанавливается в значение 0.

online_analyze.min_interval (integer)

Минимальный интервал времени между вызовами команды ANALYZE для конкретной таблицы (в миллисекундах).

По умолчанию, параметр устанавливается в значение 10000.

Конфигурационные параметры для управления использованием индексов

plantuner.disable_index (string)

Указывает список индексов, которые нельзя использовать.

plantuner.enable_index (string)

Указывает список индексов, которые все-таки можно использовать (этот параметр перекрывает plantuner.disable_index).

plantuner.only_index (string)

Указывает точный список индексов, которые можно использовать (этот параметр перекрывает plantuner.disable_index и plantuner.enable_index).

Примечание
Значения этих трех параметров записываются в виде списка имен индексов через запятую.

Разрешение имени индекса происходит для конкретного пользователя, даже если параметр задан на уровне сервера. Если индекс не найден по имени, например, когда индекс вообще не существует, он игнорируется.

plantuner.fix_empty_table (boolean)

Этот параметр меняет оценку планировщиком совсем пустых таблиц (только что созданных или опустошенных при помощи команды TRUNCATE). Если значение равно true, то QHB планирует в предположении, что эти таблицы так и будут оставаться пустыми. При значении false QHB по умолчанию будет считать, что таблицы содержат некоторое количество записей (обычно 20).