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

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

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

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

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

Функция

Описание

Пример(ы)

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


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

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

Каждая из этих функций возвращает true при успешном завершении и false в противном случае.

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

Функция

Описание

pg_cancel_backend ( pid integer ) → boolean

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

pg_reload_conf () → boolean

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

pg_rotate_logfile () → boolean

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

pg_terminate_backend ( pid integer ) → boolean

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


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

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

Функции, перечисленные в Таблице 9.85, предназначены для выполнения резервного копирования «на ходу». Эти функции нельзя выполнять во время восстановления (за исключением немонопольных вариантов pg_start_backup и pg_stop_backup, а также функций pg_is_in_backup, pg_backup_start_time и pg_wal_lsn_diff).

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

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

Функция

Описание

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_start_backup ( label text [, fast boolean [, exclusive boolean]] ) → pg_lsn

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

При копировании в монопольном режиме эта функция записывает файл метки (backup_label) и, если есть ссылки в каталоге pg_tblspc/, файл карты табличных пространств (tablespace_map) в каталог данных кластера БД, выполняет процедуру контрольной точки, а затем возвращает начальную позицию создаваемой копии в журнале предзаписи. (Результат этой функции может быть полезен, но если он не нужен, его можно просто игнорировать.) При копировании в немонопольном режиме содержимое этих файлов выдаётся функцией pg_stop_backup, и должно быть записано в архивную копию внешними средствами.

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

pg_stop_backup ( exclusive boolean [, wait_for_archive boolean] ) → setof record ( lsn pg_lsn, labelfile text, spcmapfile text )

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

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

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

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

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

pg_stop_backup () → pg_lsn

Завершает процедуру монопольного копирования «на лету». Вызов этой упрощённой вариации равнозначен pg_stop_backup(true, true), за исключением того, что в результате выдаётся только pg_lsn.

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

pg_is_in_backup () → boolean

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

pg_backup_start_time () → timestamp with time zone

Выдаёт время начала исключительного резервного копирования, если оно выполняется в данный момент, иначе — NULL.

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_wal_lsn_diff ( lsn1 pg_lsn, lsn2 pg_lsn ) → numeric

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


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_stop_backup());
        file_name         | file_offset
--------------------------+-------------
 00000001000000000000000D |     4039624
(1 row)

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

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

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

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

Функция

Описание

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.


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

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

Функция

Описание

pg_is_wal_replay_paused () → boolean

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

pg_promote ( wait boolean DEFAULT true, wait_seconds integer DEFAULT 60 ) → boolean

Повышает статус ведомого сервера до ведущего. Если параметр wait равен true (по умолчанию), эта функция дожидается завершения операции повышения в течение wait_seconds секунд и возвращает true в случае успешного повышения или false в противном случае. Если параметр wait равен false, функция возвращает true сразу после передачи процессу postmaster сигнала SIGUSR1, инициирующего повышение.

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

pg_wal_replay_pause () → void

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

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

pg_wal_replay_resume () → void

Возобновляет восстановление, если оно было приостановлено.

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


Функции pg_wal_replay_pause и pg_wal_replay_resume нельзя выполнять в процессе повышения. Если повышение запрашивается, когда восстановление приостановлено, сервер выходит из состояния паузы и продолжает процедуру повышения.

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

9.27.5. Функции синхронизации снимков

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

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

Снимки состояния экспортируются с помощью функции pg_export_snapshot, показанной в Таблице 9.88, и импортируются командой SET TRANSACTION.

Таблица 9.88. Функции синхронизации снимков

Функция

Описание

pg_export_snapshot () → text

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

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


9.27.6. Функции управления репликацией

В Таблице 9.89 показаны функции, предназначенные для управления механизмом репликации и взаимодействия с ним. Чтобы изучить этот механизм детальнее, обратитесь к Подразделу 25.2.5, Подразделу 25.2.6 и Главе 48. Использовать эти функции для источников репликации разрешено только суперпользователям, а для слотов репликации — только суперпользователям и пользователям, имеющим право REPLICATION.

Многие из этих функций соответствуют командам в протоколе репликации; см. Раздел 51.4.

Функции, описанные в Подразделе 9.27.3, Подразделе 9.27.4 и Подразделе 9.27.5, также имеют отношение к репликации.

Таблица 9.89. Функции управления репликацией

Функция

Описание

pg_create_physical_replication_slot ( slot_name name [, immediately_reserve boolean, temporary boolean] ) → record ( slot_name name, lsn pg_lsn )

Создаёт новый физический слот репликации с именем slot_name. Необязательный второй параметр, когда он равен true, указывает, что LSN для этого слота репликации должен быть зарезервирован немедленно; в противном случае LSN резервируется при первом подключении клиента потоковой репликации. Передача изменений из физического слота возможна только по протоколу потоковой репликации — см. Раздел 51.4. Необязательный третий параметр, temporary, когда он равен true, указывает, что этот слот не должен постоянно храниться на диске, так как он предназначен только для текущего сеанса. Временные слоты также освобождаются при любой ошибке. Эта функция соответствует команде протокола репликации CREATE_REPLICATION_SLOT ... PHYSICAL.

pg_drop_replication_slot ( slot_name name ) → void

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

pg_create_logical_replication_slot ( slot_name name, plugin name [, temporary boolean] ) → record ( slot_name name, lsn pg_lsn )

Создаёт новый логический (декодирующий) слот репликации с именем slot_name, используя модуль вывода plugin. Необязательный третий параметр, temporary, когда равен true, указывает, что этот слот не должен постоянно храниться на диске, так как предназначен только для текущего сеанса. Временные слоты также освобождаются при любой ошибке. Вызов этой функции равнозначен выполнению команды протокола репликации CREATE_REPLICATION_SLOT ... LOGICAL.

pg_copy_physical_replication_slot ( src_slot_name name, dst_slot_name name [, temporary boolean] ) → record ( slot_name name, lsn pg_lsn )

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

pg_copy_logical_replication_slot ( src_slot_name name, dst_slot_name name [, temporary boolean [, plugin name]] ) → record ( slot_name name, lsn pg_lsn )

Копирует существующий слот логической репликации с именем src_slot_name в слот с именем dst_slot_name, с возможностью смены модуля вывода и свойства временности. Скопированный логический слот начинает передачу с того же последовательного номера LSN, что и исходный слот. Параметры temporary и plugin являются необязательными; если они опущены, сохраняются свойства исходного слота.

pg_logical_slot_get_changes ( slot_name name, upto_lsn pg_lsn, upto_nchanges integer, VARIADIC options text[] ) → setof record ( lsn pg_lsn, xid xid, data text )

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

pg_logical_slot_peek_changes ( slot_name name, upto_lsn pg_lsn, upto_nchanges integer, VARIADIC options text[] ) → setof record ( lsn pg_lsn, xid xid, data text )

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

pg_logical_slot_get_binary_changes ( slot_name name, upto_lsn pg_lsn, upto_nchanges integer, VARIADIC options text[] ) → setof record ( lsn pg_lsn, xid xid, data bytea )

Работает так же, как функция pg_logical_slot_get_changes(), но выдаёт изменения в типе bytea.

pg_logical_slot_peek_binary_changes ( slot_name name, upto_lsn pg_lsn, upto_nchanges integer, VARIADIC options text[] ) → setof record ( lsn pg_lsn, xid xid, data bytea )

Работает аналогично функции pg_logical_slot_peek_changes(), но выдаёт изменения в значении bytea.

pg_replication_slot_advance ( slot_name name, upto_lsn pg_lsn ) → record ( slot_name name, end_lsn pg_lsn )

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

pg_replication_origin_create ( node_name text ) → oid

Создаёт источник репликации с заданным внешним именем и возвращает назначенный ему внутренний идентификатор.

pg_replication_origin_drop ( node_name text ) → void

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

pg_replication_origin_oid ( node_name text ) → oid

Ищет источник репликации по имени и возвращает внутренний идентификатор. Если такой источник не находится, возвращает NULL.

pg_replication_origin_session_setup ( node_name text ) → void

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

pg_replication_origin_session_reset () → void

Отменяет действие pg_replication_origin_session_setup().

pg_replication_origin_session_is_setup () → boolean

Возвращает true, если в текущем сеансе выбран источник репликации.

pg_replication_origin_session_progress ( flush boolean ) → pg_lsn

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

pg_replication_origin_xact_setup ( origin_lsn pg_lsn, origin_timestamp timestamp with time zone ) → void

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

pg_replication_origin_xact_reset () → void

Отменяет действие pg_replication_origin_xact_setup().

pg_replication_origin_advance ( node_name text, lsn pg_lsn ) → void

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

pg_replication_origin_progress ( node_name text, flush boolean ) → pg_lsn

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

pg_logical_emit_message ( transactional boolean, prefix text, content text ) → pg_lsn

pg_logical_emit_message ( transactional boolean, prefix text, content bytea ) → pg_lsn

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


9.27.7. Функции управления объектами баз данных

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

Таблица 9.90. Функции получения размера объектов БД

Функция

Описание

pg_column_size ( "any" ) → integer

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

pg_database_size ( name ) → bigint

pg_database_size ( oid ) → bigint

Вычисляет общий объём, который занимает на диске база данных с указанным именем или OID. Для использования этой функции необходимо иметь право CONNECT для заданной базы (оно даётся по умолчанию) или быть членом роли pg_read_all_stats.

pg_indexes_size ( regclass ) → bigint

Вычисляет общий объём, который занимают на диске индексы, связанные с указанной таблицей.

pg_relation_size ( relation regclass [, fork text] ) → bigint

Вычисляет объём, который занимает на диске один «слой» заданного отношения. (Заметьте, что в большинстве случаев удобнее использовать более высокоуровневые функции pg_total_relation_size и pg_table_size, которые суммируют размер всех слоёв.) С одним аргументом она выдаёт размер основного слоя с данными отношения. Название другого интересующего слоя можно передать во втором аргументе:

  • main выдаёт размер основного слоя данных заданного отношения.

  • fsm выдаёт размер карты свободного места (см. Раздел 66.3), связанной с заданным отношением.

  • vm выдаёт размер карты видимости (см. Раздел 66.4), связанной с заданным отношением.

  • init выдаёт размер слоя инициализации для заданного отношения, если он имеется.

pg_size_bytes ( text ) → bigint

Преобразует размер в человеко-ориентированном формате (который выдаёт pg_size_pretty) в число байт.

pg_size_pretty ( bigint ) → text

pg_size_pretty ( numeric ) → text

Преобразует размер в байтах в более понятный человеку формат с единицами измерения размера (bytes, kB, MB, GB или TB, в зависимости от значения). Заметьте, что эти единицы определяются как степени 2, а не 10, так что 1kB — это 1024 байта, 1MB — 10242 = 1048576 байт и т. д.

pg_table_size ( regclass ) → bigint

Вычисляет объём, который занимает на диске данная таблица, за исключением индексов (но включая её TOAST-таблицу (если она есть), карту свободного места и карту видимости).

pg_tablespace_size ( name ) → bigint

pg_tablespace_size ( oid ) → bigint

Вычисляет общий объём, который занимает на диске табличное пространство с заданным именем или OID. Для использования этой функции требуется иметь право CREATE для указанного табличного пространства или быть членом роли pg_read_all_stats, если только это не табличное пространство по умолчанию для текущей базы данных.

pg_total_relation_size ( regclass ) → bigint

Вычисляет общий объём, который занимает на диске заданная таблица, включая все её индексы и данные TOAST. Результат этой функции равен значению pg_table_size + pg_indexes_size.


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

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

Таблица 9.91. Функции определения расположения объектов

Функция

Описание

pg_relation_filenode ( relation regclass ) → oid

Выдаёт номер «файлового узла», связанного с заданным объектом. Файловым узлом называется основной компонент имени файла, используемого для хранения данных (подробнее это описано в Разделе 66.1). Для большинства отношений этот номер совпадает со значением pg_class.relfilenode, но для некоторых системных каталогов relfilenode равен 0, и нужно использовать эту функцию, чтобы узнать действительное значение. Если указанное отношение не хранится на диске, как например представление, данная функция возвращает NULL.

pg_relation_filepath ( relation regclass ) → text

Выдаёт полный путь к файлу отношения (относительно каталога данных PGDATA).

pg_filenode_relation ( tablespace oid, filenode oid ) → regclass

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


В Таблица 9.92 перечислены функции, предназначенные для управления правилами сортировки.

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

Функция

Описание

pg_collation_actual_version ( oid ) → text

Возвращает действующую версию объекта правила сортировки, которая в настоящее время установлена в операционной системе. Если она отличается от значения в pg_collation.collversion, может потребоваться перестроить объекты, зависящие от данного правила сортировки. См. также ALTER COLLATION.

pg_import_system_collations ( schema regnamespace ) → integer

Добавляет правила сортировки в системный каталог pg_collation, анализируя все локали, которые она находит в операционной системе. Эту информацию использует initdb; за подробностями обратитесь к Подразделу 22.2.2. Если позднее в систему устанавливаются дополнительные локали, эту функцию можно запустить снова, чтобы добавились правила сортировки для новых локалей. Локали, для которых обнаруживаются существующие записи в pg_collation, будут пропущены. (Объекты правил сортировки для локалей, которые перестают существовать в операционной системе, никогда не удаляются этой функцией.) В параметре schema обычно передаётся pg_catalog, но это не обязательно; правила сортировки могут быть установлены и в другую схему. Эта функция возвращает число созданных ей объектов правил сортировки; вызывать её разрешено только суперпользователям.


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

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

Функция

Описание

pg_partition_tree ( regclass ) → setof record ( relid regclass, parentrelid regclass, isleaf boolean, level integer )

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

pg_partition_ancestors ( regclass ) → setof regclass

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

pg_partition_root ( regclass ) → regclass

Выдаёт самое верхнее отношение в дереве секционирования, к которому относится заданное отношение. Если заданное отношение не существует или не является секцией или секционированным отношением, эта функция выдаёт NULL.


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

SELECT pg_size_pretty(sum(pg_relation_size(relid))) AS total_size
  FROM pg_partition_tree('measurement');

9.27.8. Функции обслуживания индексов

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

Таблица 9.94. Функции обслуживания индексов

Функция

Описание

brin_summarize_new_values ( index regclass ) → integer

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

brin_summarize_range ( index regclass, blockNumber bigint ) → integer

Обобщает зону страниц, охватывающую данный блок, если она ещё не была обобщена. Эта функция подобна brin_summarize_new_values, но обрабатывает только одну выбранную зону страниц.

brin_desummarize_range ( index regclass, blockNumber bigint ) → void

Удаляет из BRIN-индекса кортеж, который обобщает зону страниц, охватывающую данный блок таблицы, если такой кортеж имеется.

gin_clean_pending_list ( index regclass ) → bigint

Очищает очередь указанного GIN-индекса, массово перемещая элементы из неё в основную структуру данных GIN, и возвращает число страниц, убранных из очереди. Если для обработки ей передаётся индекс GIN, построенный с отключённым параметром fastupdate, очистка не производится и возвращается 0, так как у такого индекса нет очереди записей. Подробнее об очереди записей и параметре fastupdate рассказывается в Подразделе 63.4.1 и Разделе 63.5.


9.27.9. Функции для работы с обычными файлами

Функции, перечисленные в Таблице 9.95, предоставляют прямой доступ к файлам, находящимся на сервере. Обычным пользователям, не включённым в роль pg_read_server_files, они позволяют обращаться только к файлам в каталоге кластера баз данных и в каталоге log_directory. Для файлов в каталоге кластера этим функциям передаётся относительный путь, а для файлов журнала — путь, соответствующий значению параметра log_directory.

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

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

Таблица 9.95. Функции для работы с обычными файлами

Функция

Описание

pg_ls_dir ( dirname text [, missing_ok boolean, include_dot_dirs boolean] ) → setof text

Выдаёт имена всех файлов (а также каталогов и других специальных файлов) в заданном каталоге. Параметр include_dot_dirs определяет, будут ли в результирующий набор включаться каталоги «.» и «..». По умолчанию они не включаются, но их можно включить, чтобы с параметром missing_ok равным true, пустой каталог можно было отличить от несуществующего.

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

pg_ls_logdir () → setof record ( name text, size bigint, modification timestamp with time zone )

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

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

pg_ls_waldir () → setof record ( name text, size bigint, modification timestamp with time zone )

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

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

pg_ls_archive_statusdir () → setof record ( name text, size bigint, modification timestamp with time zone )

Выводит имя, размер и время последнего изменения (mtime) всех обычных файлов в каталоге состояния архива WAL (pg_wal/archive_status). Файлы с именами, начинающимися с точки, каталоги и другие специальные файлы исключаются из рассмотрения.

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

pg_ls_tmpdir ( [tablespace oid] ) → setof record ( name text, size bigint, modification timestamp with time zone )

Выводит имя, размер и время последнего изменения (mtime) всех обычных файлов во временном каталоге для табличного пространства tablespace. Если параметр tablespace не задан, подразумевается табличное пространство pg_default. Файлы с именами, начинающимися с точки, каталоги и другие специальные файлы исключаются из рассмотрения.

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

pg_read_file ( filename text [, offset bigint, length bigint [, missing_ok boolean]] ) → text

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

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

pg_read_binary_file ( filename text [, offset bigint, length bigint [, missing_ok boolean]] ) → bytea

Читает из текстового файла всё содержимое или заданный фрагмент. Эта функция подобна pg_read_file, но может читать произвольные двоичные данные и возвращает результат в значении типа bytea, а не text; как следствие, никакие проверки кодировок не производятся.

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

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

SELECT convert_from(pg_read_binary_file('file_in_utf8.txt'), 'UTF8');

pg_stat_file ( filename text [, missing_ok boolean] ) → record ( size bigint, access timestamp with time zone, modification timestamp with time zone, change timestamp with time zone, creation timestamp with time zone, isdir boolean )

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

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


9.27.10. Функции управления рекомендательными блокировками

Функции, перечисленные в Таблице 9.96, предназначены для управления рекомендательными блокировками. Подробнее об их использовании можно узнать в Подразделе 13.3.5.

Все эти функции предназначены для оперирования блокировками ресурсов, определяемых приложением и задаваемых одним 64-битным или двумя 32-битными ключами (заметьте, что пространства этих ключей не пересекаются). Если конфликтующую блокировку с тем же идентификатором уже удерживает другой сеанс, эти функции либо дожидаются освобождения ресурса, либо выдают в результате false, в зависимости от вида функции. Блокировки могут быть как исключительными, так и разделяемыми — разделяемая блокировка не конфликтует с другими разделяемыми блокировками того же ресурса, но конфликтует с исключительными. Блокировки могут устанавливаться на сеансовом уровне (тогда они удерживаются до момента освобождения или до завершения сеанса) и на транзакционном (тогда они удерживаются до конца текущей транзакции, освободить их вручную нет возможности). Когда поступает несколько запросов на блокировку сеансового уровня, они накапливаются, так что если один идентификатор ресурса был заблокирован три раза, должны поступить три запроса на освобождение блокировки, чтобы ресурс был разблокирован до завершения сеанса.

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

Функция

Описание

pg_advisory_lock ( key bigint ) → void

pg_advisory_lock ( key1 integer, key2 integer ) → void

Получает исключительную рекомендательную блокировку сеансового уровня, ожидая её, если это необходимо.

pg_advisory_lock_shared ( key bigint ) → void

pg_advisory_lock_shared ( key1 integer, key2 integer ) → void

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

pg_advisory_unlock ( key bigint ) → boolean

pg_advisory_unlock ( key1 integer, key2 integer ) → boolean

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

pg_advisory_unlock_all () → void

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

pg_advisory_unlock_shared ( key bigint ) → boolean

pg_advisory_unlock_shared ( key1 integer, key2 integer ) → boolean

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

pg_advisory_xact_lock ( key bigint ) → void

pg_advisory_xact_lock ( key1 integer, key2 integer ) → void

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

pg_advisory_xact_lock_shared ( key bigint ) → void

pg_advisory_xact_lock_shared ( key1 integer, key2 integer ) → void

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

pg_try_advisory_lock ( key bigint ) → boolean

pg_try_advisory_lock ( key1 integer, key2 integer ) → boolean

Получает исключительную рекомендательную блокировку сеансового уровня, если она доступна. То есть эта функция либо немедленно получает блокировку и возвращает true, либо сразу возвращает false, если получить её нельзя.

pg_try_advisory_lock_shared ( key bigint ) → boolean

pg_try_advisory_lock_shared ( key1 integer, key2 integer ) → boolean

Получает разделяемую рекомендательную блокировку сеансового уровня, если она доступна. То есть эта функция либо немедленно получает блокировку и возвращает true, либо сразу возвращает false, если получить её нельзя.

pg_try_advisory_xact_lock ( key bigint ) → boolean

pg_try_advisory_xact_lock ( key1 integer, key2 integer ) → boolean

Получает исключительную рекомендательную блокировку транзакционного уровня, если она доступна. То есть эта функция либо немедленно получает блокировку и возвращает true, либо сразу возвращает false, если получить её нельзя.

pg_try_advisory_xact_lock_shared ( key bigint ) → boolean

pg_try_advisory_xact_lock_shared ( key1 integer, key2 integer ) → boolean

Получает разделяемую рекомендательную блокировку транзакционного уровня, если она доступна. То есть эта функция либо немедленно получает блокировку и возвращает true, либо сразу возвращает false, если получить её нельзя.


9.27.11. Опорные функции журнала операций

В журнале операций хранится информация о критически важных системных событиях, таких как обновление, выполнение pg_resetwal и т. п. Эта информация не представляет особого интереса для обычного пользователя, но важна для осуществления технической поддержки со стороны поставщика. Запись в журнал операций производится только на системном уровне (без каких-либо действий со стороны пользователя), а для его чтения используются функции SQL. Функция, показанная в Таблица 9.97, читает журнал операций.

Таблица 9.97. Опорные функции журнала операций

Функция

Описание

pg_operation_log () → setof record ( event text, edition text, version text, lsn pg_lsn, last timestamptz, count int4 )

Здесь:

  • event — тип события (операции). Может быть bootstrap, startup, pg_resetwal, pg_rewind, pg_upgrade или promoted.

  • edition — редакция Postgres Pro. Может быть vanilla, 1c, std, ent или unknown.

  • version — версия Postgres Pro.

  • lsn — положение последней контрольной точки, возвращённое утилитой pg_controldata на момент возникновения события.

  • last — дата/время возникновения последнего события этого типа, если события накапливаются, или дата/время возникновения события в противном случае.

  • count — количество событий этого типа, если события накапливаются, или 1 в противном случае.

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

CREATE OR REPLACE FUNCTION
  pg_operation_log(
    OUT event text,
    OUT edition text,
    OUT version text,
    OUT lsn pg_lsn,
    OUT last timestamptz,
    OUT count int4)
 RETURNS SETOF record
 LANGUAGE INTERNAL
 STABLE STRICT PARALLEL SAFE
AS 'pg_operation_log';         

Ниже представлен пример вывода для функции pg_operation_log:

select * from pg_operation_log();
   event    | edition | version |    lsn    |          last          | count
------------+---------+---------+-----------+------------------------+-------
 startup    | vanilla | 10.22.0 | 0/8000028 | 2022-10-27 23:06:27+03 |     1
 pg_upgrade | 1c      | 15.0.0  | 0/8000028 | 2022-10-27 23:06:27+03 |     1
 startup    | 1c      | 15.0.0  | 0/80001F8 | 2022-10-27 23:06:53+03 |     2
(3 rows)

Примечание

Если журнал операций пуст, то при обновлении перед записью pg_upgrade сначала записывается событие startup с предыдущим значением version, имеющим следующие особенности: вместо версии патча (третья цифра в номере версии) всегда устанавливается ноль, поскольку в pg_upgrade нет информации о версии патча ни для одной редакции (1c, std, ent). При обновлении с 1c или vanilla невозможно выяснить, к какой из этих редакций относится база данных до обновления, поэтому для записи startup используется редакция vanilla.

9.27.12. Отладочные функции

Функция, показанная в Таблице 9.98, может быть полезна для низкоуровневых операций, например в целях отладки или исследования испорченных баз данных Postgres Pro.

Таблица 9.98. Функции синхронизации снимков

ИмяТип результатаОписание
pg_snapshot_any()voidОтключает действие правил MVCC в рамках текущей транзакции, что позволяет видеть в ней все версии данных.

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

Примечание

Если ваш кластер БД создавался сервером версии, в которой этой функции ещё не было, определите её следующей командой:

CREATE FUNCTION pg_snapshot_any() RETURNS void AS 'pg_snapshot_any' LANGUAGE internal;