9.28. Функции для системного администрирования #

Функции, описанные в этом разделе, предназначены для контроля и управления сервером Postgres Pro.

9.28.1. Функции для управления конфигурацией #

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

Таблица 9.93. Функции для управления конфигурацией

Функция

Описание

Пример(ы)

current_setting ( setting_name text [, missing_ok boolean] ) → text

Выдаёт текущее значение параметра setting_name. Если такого параметра нет, current_setting выдаёт ошибку, если только дополнительно не передан параметр missing_ok со значением true (в этом случае выдаётся NULL). Эта функция соответствует SQL-команде SHOW.

current_setting('datestyle')ISO, MDY

set_config ( setting_name text, new_value text, is_local boolean ) → text

Устанавливает для параметра setting_name значение new_value и возвращает это значение. Если параметр is_local равен true, новое значение будет действовать только в рамках текущей транзакции. Чтобы это значение действовало на протяжении текущего сеанса, присвойте этому параметру false. Эта функция соответствует SQL-команде SET.

set_config('log_statement_stats', 'off', false)off

pg_backend_set_config ( pid int, config text, wait int default 0 ) → boolean

Устанавливает в обслуживающем процессе с заданным идентификатором один или несколько параметров, указываемых в строке config. Все эти параметры должны записываться в соответствии с правилами postgresql.conf в отдельных строках, в формате имя=значение. Функция pg_backend_set_config воздействует только на параметры времени выполнения. При вызове она изменяет текущую конфигурацию до завершения сеанса или до следующего вызова pg_backend_set_config. Вносимые ей изменения вступают в силу с началом следующей транзакции.

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

pg_backend_get_config_value ( pid int4, param_name text, [missing_ok boolean default false], [wait int4 default 1] ) → boolean

Выдаёт текущее значение параметра param_name обслуживающего процесса с заданным PID. Если такого параметра нет, функция pg_backend_get_config_value выдаёт ошибку, если только дополнительно не передан параметр missing_ok со значением true (в этом случае выдаётся NULL).

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

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

pg_backend_load_library ( pid int, name text, wait int default 0 ) → boolean

Загружает библиотеку с указанным именем в процесс с заданным идентификатором. За один вызов функции можно загрузить только одну библиотеку. При запуске без привилегий суперпользователя функция pg_backend_load_library позволяет загружать только те библиотеки, которые расположены в $libdir/plugins. Если вам нужно загрузить библиотеку из другого места, запустите эту функцию от имени суперпользователя.

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


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

В случаях сбоя при изменении конфигурации функцией pg_backend_set_config или при загрузке библиотеки функцией pg_backend_load_library в целевом процессе происходит ошибка, и текущая команда в этом процессе прерывается.

Рассмотрим следующие примеры:

SELECT pg_backend_set_config(pg_backend_pid(), 'statement_timeout=10000');
 pg_backend_set_config
-----------------------
 t
(1 row)

SELECT pg_backend_set_config(pg_backend_pid(),
       'statement_timeout=20000
        lock_timeout=10000');
 pg_backend_set_config
-----------------------
 t
(1 row)

SELECT pg_backend_get_config_value(pg_backend_pid(), 'statement_timeout');
 pg_backend_get_config_value
-----------------------------
 20s
(1 row)

SELECT pg_backend_get_config_value(pg_backend_pid(), 'lock_timeout');
 pg_backend_get_config_value
-----------------------------
 10s
(1 row)

SELECT pg_backend_set_config(pg_backend_pid(), 'fsync=on');
ERROR:  parameter "fsync" cannot be changed now

SELECT pg_backend_set_config(pg_backend_pid(), 'log_min_messages=INFO');
ERROR:  permission denied to set parameter "log_min_messages"

SELECT pg_backend_load_library(pg_backend_pid(), 'pgoutput');
 pg_backend_load_library
-------------------------
 t
(1 row)

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

Рассмотрим следующий пример:

SELECT pg_backend_set_config(pg_backend_pid(), 'test_param', 100000);
ERROR: syntax error in file "base/pgsql_tmp/pgsql_tmp87011.4" line 0, near end of line

9.28.2. Функции для передачи сигналов серверу #

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

Все эти функции возвращают true, если сигнал успешно отправлен, и false, если отправить сигнал не удалось.

Таблица 9.94. Функции для передачи сигналов серверу

Функция

Описание

pg_cancel_backend ( pid integer ) → boolean

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

pg_log_backend_memory_contexts ( pid integer ) → boolean

Запрашивает вывод в журнал информации о контекстах памяти обслуживающего процесса с указанным PID. Эта функция может отправлять запрос обслуживающим и вспомогательным процессам, кроме процесса протоколирования. Запрошенная информация будет выведена в сообщениях уровня LOG, которые появятся в журнале сервера в зависимости от заданной конфигурации журнала (за дополнительными сведениями обратитесь к Разделу 19.8), но не будут передаваться клиенту независимо от client_min_messages.

pg_reload_conf () → boolean

Даёт всем процессам сервера Postgres Pro команду перезагрузить файлы конфигурации. (Для этого посылается сигнал SIGHUP главному процессу, который, в свой очередь, посылает SIGHUP всем своим дочерним процессам.) Вы можете прочитать представления pg_file_settings, pg_hba_file_rules и pg_ident_file_mappings, чтобы проверить файлы конфигурации на предмет возможных ошибок перед перезагрузкой.

pg_rotate_logfile () → boolean

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

pg_terminate_backend ( pid integer, timeout bigint DEFAULT 0 ) → boolean

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

Если параметр timeout не задан или равен нулю, данная функция возвращает true независимо от того, действительно ли завершается процесс; то есть результат показывает только, что сигнал был отправлен успешно. Если параметр timeout задан (в миллисекундах) и больше нуля, функция ожидает, пока процесс не будет фактически завершён или пока не пройдёт заданное время. Если процесс завершён, функция возвращает true. В случае тайм-аута выдаётся предупреждение и возвращается false.

replan_signal ( pid integer ) → boolean

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


pg_cancel_backend и pg_terminate_backend передают сигналы (SIGINT и SIGTERM, соответственно) серверному процессу с заданным кодом PID. Код активного процесса можно получить из столбца pid представления pg_stat_activity или просмотрев на сервере процессы с именем postgres (используя ps в Unix или Диспетчер задач в Windows). Роль пользователя активного процесса можно узнать в столбце usename представления pg_stat_activity.

pg_log_backend_memory_contexts может использоваться для получения в журнале сервера информации о контекстах памяти. Например:

postgres=# SELECT pg_log_backend_memory_contexts(pg_backend_pid());
 pg_log_backend_memory_contexts
--------------------------------
 t
(1 row)

Для каждого контекста памяти будет выводиться одно сообщение. Например:

LOG:  logging memory contexts of PID 10377
STATEMENT:  SELECT pg_log_backend_memory_contexts(pg_backend_pid());
LOG:  level: 0; TopMemoryContext: 80800 total in 6 blocks; 14432 free (5 chunks); 66368 used
LOG:  level: 1; pgstat TabStatusArray lookup hash table: 8192 total in 1 blocks; 1408 free (0 chunks); 6784 used
LOG:  level: 1; TopTransactionContext: 8192 total in 1 blocks; 7720 free (1 chunks); 472 used
LOG:  level: 1; RowDescriptionContext: 8192 total in 1 blocks; 6880 free (0 chunks); 1312 used
LOG:  level: 1; MessageContext: 16384 total in 2 blocks; 5152 free (0 chunks); 11232 used
LOG:  level: 1; Operator class cache: 8192 total in 1 blocks; 512 free (0 chunks); 7680 used
LOG:  level: 1; smgr relation table: 16384 total in 2 blocks; 4544 free (3 chunks); 11840 used
LOG:  level: 1; TransactionAbortContext: 32768 total in 1 blocks; 32504 free (0 chunks); 264 used
...
LOG:  level: 1; ErrorContext: 8192 total in 1 blocks; 7928 free (3 chunks); 264 used
LOG:  Grand total: 1651920 bytes in 201 blocks; 622360 free (88 chunks); 1029560 used

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

9.28.3. Функции управления резервным копированием #

Функции, перечисленные в Таблице 9.95, предназначены для выполнения резервного копирования «на ходу». Эти функции нельзя выполнять во время восстановления (за исключением pg_backup_start, pg_backup_stop и pg_wal_lsn_diff).

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

Таблица 9.95. Функции управления резервным копированием

Функция

Описание

pg_create_restore_point ( name text ) → pg_lsn

Создаёт в журнале предзаписи именованный маркер, который можно использовать как цель при восстановлении, и возвращает соответствующую ему позицию в журнале. Полученное имя затем можно указать в параметре recovery_target_name, определив тем самым точку, до которой будет выполняться восстановление. Учтите, что если будет создано несколько точек восстановления с одним именем, восстановление остановится на первой точке с этим именем.

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

pg_current_wal_flush_lsn () → pg_lsn

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

pg_current_wal_insert_lsn () → pg_lsn

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

pg_current_wal_lsn () → pg_lsn

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

pg_backup_start ( label text [, fast boolean] ) → pg_lsn

Подготавливает сервер к резервному копированию «на лету». Единственный обязательный параметр задаёт произвольную пользовательскую метку резервной копии. (Обычно это имя, которое получит файл резервной копии.) Если необязательный второй параметр задан и имеет значение true, функция pg_backup_start должна выполниться максимально быстро. Это означает, что принудительно будет выполнена контрольная точка, вследствие чего кратковременно увеличится нагрузка на ввод-вывод и параллельно выполняемые запросы могут замедлиться.

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

pg_backup_stop ( [wait_for_archive boolean] ) → record ( lsn pg_lsn, labelfile text, spcmapfile text )

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

У этой функции есть также необязательный параметр типа boolean. Если он равен false, pg_backup_stop завершится сразу после окончания резервного копирования, не дожидаясь архивации WAL. Это поведение полезно только для программ резервного копирования, которые осуществляют архивацию WAL независимо. Если же WAL не будет заархивирован вовсе, резервная копия может оказаться неполной, и, как следствие, непригодной для восстановления. Когда он равен true (по умолчанию), pg_backup_stop будет ждать выполнения архивации WAL, если архивирование включено. Для резервного сервера это означает, что ожидание возможно только при условии archive_mode = always. Если активность записи на ведущем сервере невысока, может иметь смысл выполнить на нём pg_switch_wal для немедленного переключения сегмента.

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

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

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

pg_switch_wal () → pg_lsn

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

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

pg_walfile_name ( lsn pg_lsn ) → text

Выдаёт для заданной позиции в журнале предзаписи имя соответствующего файла WAL.

pg_walfile_name_offset ( lsn pg_lsn ) → record ( file_name text, file_offset integer )

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

pg_split_walfile_name ( file_name text ) → record ( segment_number numeric, timeline_id bigint )

Извлекает последовательный номер и идентификатор линии времени из имени файла WAL.

pg_wal_lsn_diff ( lsn1 pg_lsn, lsn2 pg_lsn ) → numeric

Вычисляет разницу в байтах (lsn1 - lsn2) между двумя позициями в журнале предзаписи. Полученный результат можно использовать с pg_stat_replication или с некоторыми функциями, перечисленными в Таблица 9.95, для определения задержки репликации.


pg_current_wal_lsn выводит текущую позицию записи в журнале предзаписи в том же формате, что и вышеописанные функции. pg_current_wal_insert_lsn подобным образом выводит текущую позицию добавления, а pg_current_wal_flush_lsn — позицию сброса данных журнала. Позицией добавления называется «логический» конец журнала предзаписи в любой момент времени, тогда как позиция записи указывает на конец данных, фактически вынесённых из внутренних буферов сервера, а позиция сброса показывает, до какого места данные считаются сохранёнными в надёжном хранилище. Позиция записи отмечает конец данных, которые может видеть снаружи внешний процесс, и именно она представляет интерес при копировании частично заполненных файлов журнала. Позиция добавления и позиция сброса выводятся в основном для отладки серверной части. Все эти функции выполняются в режиме «только чтение» и не требуют прав суперпользователя.

Используя функцию pg_walfile_name_offset, из значения pg_lsn можно получить имя соответствующего ему файла журнала предзаписи и байтовое смещение в этом файле. Например:

postgres=# SELECT * FROM pg_walfile_name_offset((pg_backup_stop()).lsn);
        file_name         | file_offset
--------------------------+-------------
 00000001000000000000000D |     4039624
(1 row)

Родственная ей функция pg_walfile_name извлекает только имя файла журнала предзаписи.

pg_split_walfile_name полезна для вычисления LSN на основе смещения файла и имени файла WAL, например:

postgres=# \set file_name '000000010000000100C000AB'
postgres=# \set offset 256
postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset AS lsn
  FROM pg_split_walfile_name(:'file_name') pd,
       pg_show_all_settings() ps
  WHERE ps.name = 'wal_segment_size';
      lsn
---------------
 C001/AB000100
(1 row)

9.28.4. Функции управления восстановлением #

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

Таблица 9.96. Функции для получения информации о восстановлении

Функция

Описание

pg_is_in_recovery () → boolean

Возвращает true, если в данный момент выполняется процедура восстановления.

pg_last_wal_receive_lsn () → pg_lsn

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

pg_last_wal_replay_lsn () → pg_lsn

Выдаёт позицию последней записи в журнале предзаписи, которая была воспроизведёна при восстановлении. В процессе восстановления эта позиция постоянно увеличивается. По окончании этого процесса она остаётся на записи WAL, которая была восстановлена последней. Если сервер при запуске не выполнял процедуру восстановления, эта функция выдаёт NULL.

pg_last_xact_replay_timestamp () → timestamp with time zone

Выдаёт отметку времени последней транзакции, воспроизведённой при восстановлении. Это время, когда на главном сервере произошла фиксация или откат записи WAL для этой транзакции. Если в процессе восстановления не была воспроизведена ни одна транзакция, эта функция выдаёт NULL. В противном случае возвращаемое значение постоянно увеличивается в процессе восстановления. По окончании восстановления в нём остаётся время транзакции, которая была восстановлена последней. Если сервер при запуске не выполнял процедуру восстановления, эта функция выдаёт NULL.

pg_get_wal_resource_managers () → setof record ( rm_id integer, rm_name text, rm_builtin boolean )

Выдаёт загруженные на данный момент менеджеры ресурсов WAL в системе. Столбец rm_builtin показывает, является ли данный менеджер ресурсов встроенным или пользовательским, то есть создаваемым расширением.


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

Таблица 9.97. Функции управления восстановлением

Функция

Описание

pg_is_wal_replay_paused () → boolean

Возвращает true, если запрошена приостановка восстановления.

pg_get_wal_replay_pause_state () → text

Возвращает состояние приостановки восстановления. Возвращаемые значения: not paused — приостановка не запрашивалась, pause requested — получен запрос на приостановку, но восстановление ещё не приостановлено, и paused, если восстановление действительно приостановлено.

pg_promote ( wait