Использование pg_options

Замечание: При содействии Massimo Dal Zotto

Необязательный файл data/pg_options содержит опции выполнения, используемые сервером для управления трассировкой сообщений и другие настраиваемые параметры сервера. Файл перечитывается сервером при приеме сигнала SIGHUP, что дает возможность изменять опции выполнения на лету без перезапуска Postgres. Опции, указанные в этом файле, могут быть флагами отладки, используемые пакетом трассировки (backend/utils/misc/trace.c) или числовыми параметрами, которые могут использоваться сервером для управления его работой.

Все опции pg_options при запуске сервера установлены в ноль. Новые или измененные опции будут читаться всеми новыми серверами при их запуске. Чтобы сделать действительными любые изменения для всех запущенных серверов, нужно послать SIGHUP в postmaster. Сигнал будет автоматически послан всем серверам. Также мы можем включить изменения только для определенных серверов, посылая им сигнал SIGHUP напрямую.

pg_options также можно указать в ключе -T Postgres:

postgres options -T "verbose=2,query,hostlookup-"
    

Функции, используемые для печати ошибок и сообщений отладки теперь могут использовать удобства syslog(2). Сообщения, печатающиеся в stdout или stderr, предваряются временной отметкой и pid сервера:

#timestamp          #pid    #message
980127.17:52:14.173 [29271] StartTransactionCommand
980127.17:52:14.174 [29271] ProcessUtility: drop table t;
980127.17:52:14.186 [29271] SIIncNumEntries: table is 70% full
980127.17:52:14.186 [29286] Async_NotifyHandler
980127.17:52:14.186 [29286] Waking up sleeping backend process
980127.19:52:14.292 [29286] Async_NotifyFrontEnd
980127.19:52:14.413 [29286] Async_NotifyFrontEnd done
980127.19:52:14.466 [29286] Async_NotifyHandler done
    

Этот формат улучшает читабельность logs и позволяет людям точно понять какой сервер что делал и в какое время. Это также облегчает написание простых сценариев awk или perl, которые проверяют log для обнаружения ошибок базы данных и проблем, или для вычисления временной статистики по транзакциям.

Сообщения, выводящиеся в syslog, используют log возможность LOG_LOCAL0. Использование syslog можно контролировать с помощью syslog pg_option. К сожалению, многие функции вызывают напрямую printf() для печати своих сообщений в stdout или stderr и этот вывод не может быть перенаправлен в syslog или иметь временных отметок. Рекомендуется, чтобы все вызовы printf замещались макросами PRINTF и вывод в stderr использовал бы EPRINTF, для того чтобы мы могли контролировать весь вывод в стандартном виде.

Формат файла pg_options следующий:

# comment
option=integer_value  # set value for option
option                # set option = 1
option+               # set option = 1
option-               # set option = 0
    
Заметьте, что ключевым словом также может быть аббревиатура названия опции, определённой в backend/utils/misc/trace.c.

Пример 7-1. Файл pg_options

Например мой файл pg_options содержит следующие значения:

verbose=2
query
hostlookup
showportnumber
      

Распознаваемые опции

В настоящий момент определены следующие опции:

all

Флаг глобальной трассировки. Допустимые значения:

0

Сообщения трассировки разрешаются индивидуально

1

Разрешены все сообщения трассировки

-1

Запрещены все сообщения трассировки

verbose

Флаг подробностей. Допустимые значения:

0

Нет сообщений. По умолчанию.

1

Печатать информационные сообщения.

2

Печатать более информативные сообщения.

query

Флаг трассировки запроса. Допустимые значения:

0

Не печатать запрос.

1

Печатать сжатый запрос в одну строку.

4

Печатать полный запрос.

plan

Печатать план запроса.

parse

Печатать после разбора.

rewritten

Печатать переписанный запрос.

parserstats

Печатать статистику разборщика.

plannerstats

Печатать статистику планировщика.

executorstats

Печатать статистику исполнителя.

shortlocks

В настоящий момент не используется, но необходима для использования в будущем.

locks

Трассировка блокировок.

userlocks

Трассировка блокировок пользователя.

spinlocks

Трассировка spin блокировок.

notify

Трассировка уведомляющих функций.

malloc

В настоящий момент не используется.

palloc

В настоящий момент не используется.

lock_debug_oidmin

Минимальный oid для трассировки блокировок.

lock_debug_relid

Если oid не равно нулю, то трассировка блокировок.

lock_read_priority

В настоящий момент не используется.

deadlock_timeout

Таймер проверки взаимных блокировок.

syslog

Флаг syslog. Допустимые значения:

0

Сообщения в stdout/stderr.

1

Сообщения в stdout/stderr и syslog.

2

Сообщения только в syslog.

hostlookup

Разрешить поиск имени хоста в ps_status.

showportnumber

Разрешить отображение номера порта в ps_status.

notifyunlock

Разблокировка pg_listener после уведомления.

notifyhack

Удалять дубликаты кортежей из pg_listener.