9.27. Функции для системного администрирования
Функции, описанные в этом разделе, предназначены для контроля и управления сервером Postgres Pro.
9.27.1. Функции для управления конфигурацией
В Таблице 9.83 показаны функции, позволяющие получить и изменить значения параметров конфигурации выполнения.
Таблица 9.83. Функции для управления конфигурацией
| Функция Описание Пример(ы) | 
|---|
|  current_setting(setting_nametext[,missing_okboolean] ) →text Выдаёт текущее значение параметра setting_name. Если такого параметра нет,current_settingвыдаёт ошибку, если только дополнительно не передан параметрmissing_okсо значениемtrue(в этом случае выдаётся NULL). Эта функция соответствует SQL-команде SHOW. current_setting('datestyle')→ISO, MDY
 | 
|  set_config(setting_nametext,new_valuetext,is_localboolean) →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(pidinteger) →boolean Отменяет текущий запрос в сеансе, который обслуживается процессом с заданным PID. Это действие разрешается и ролям, являющимся членами роли, запрос которой отменяется, и ролям, которым дано право pg_signal_backend; однако только суперпользователям разрешено отменять запросы других суперпользователей. | 
|  pg_reload_conf() →boolean Даёт всем процессам сервера PostgreSQL команду перегрузить файлы конфигурации. (Для этого посылается сигнал SIGHUP главному процессу, который, в свой очередь, посылает SIGHUP всем своим дочерним процессам.) | 
|  pg_rotate_logfile() →boolean Указывает менеджеру журнала сообщений немедленно переключиться на новый файл. Это имеет смысл, только когда работает встроенный сборщик сообщений, так как без него подпроцесс менеджера журнала не запускается. | 
|  pg_terminate_backend(pidinteger) →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(nametext) →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(labeltext[,fastboolean[,exclusiveboolean]] ) →pg_lsn Подготавливает сервер к резервному копированию «на лету». Единственный обязательный параметр задаёт произвольную пользовательскую метку резервной копии. (Обычно это имя, которое получит файл резервной копии.) Если необязательный второй параметр задан и имеет значение true, функцияpg_start_backupдолжна выполниться максимально быстро. Это означает, что принудительно будет выполнена контрольная точка, вследствие чего кратковременно увеличится нагрузка на ввод/вывод и параллельно выполняемые запросы могут замедлиться. Необязательный третий параметр указывает, будет ли резервное копирование выполняться в немонопольном или монопольном режиме (по умолчанию). При копировании в монопольном режиме эта функция записывает файл метки (backup_label) и, если есть ссылки в каталогеpg_tblspc/, файл карты табличных пространств (tablespace_map) в каталог данных кластера БД, выполняет процедуру контрольной точки, а затем возвращает начальную позицию создаваемой копии в журнале предзаписи. (Результат этой функции может быть полезен, но если он не нужен, его можно просто игнорировать.) При копировании в немонопольном режиме содержимое этих файлов выдаётся функциейpg_stop_backup, и должно быть записано в архивную копию внешними средствами. По умолчанию доступ к этой функции имеют только суперпользователи, но право на её выполнение (EXECUTE) можно дать и другим пользователям. | 
|  pg_stop_backup(exclusiveboolean[,wait_for_archiveboolean] ) →setof record(lsnpg_lsn,labelfiletext,spcmapfiletext) Завершает процедуру немонопольного или монопольного копирования «на лету». Значение параметра 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(lsnpg_lsn) →text Выдаёт для заданной позиции в журнале предзаписи имя соответствующего файла WAL. | 
|  pg_walfile_name_offset(lsnpg_lsn) →record(file_nametext,file_offsetinteger) Выдаёт для заданной позиции в журнале предзаписи имя соответствующего файла и байтовое смещение в нём. | 
|  pg_wal_lsn_diff(lsn1pg_lsn,lsn2pg_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(waitbooleanDEFAULTtrue,wait_secondsintegerDEFAULT60) →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 и Главе 47. Использовать эти функции для источников репликации разрешено только суперпользователям, а для слотов репликации — только суперпользователям и пользователям, имеющим право REPLICATION.
Многие из этих функций соответствуют командам в протоколе репликации; см. Раздел 50.4.
Функции, описанные в Подразделе 9.27.3, Подразделе 9.27.4 и Подразделе 9.27.5, также имеют отношение к репликации.
Таблица 9.89. Функции управления репликацией
| Функция Описание | 
|---|
|  pg_create_physical_replication_slot(slot_namename[,immediately_reserveboolean,temporaryboolean] ) →record(slot_namename,lsnpg_lsn) Создаёт новый физический слот репликации с именем slot_name. Необязательный второй параметр, когда он равенtrue, указывает, что LSN для этого слота репликации должен быть зарезервирован немедленно; в противном случае LSN резервируется при первом подключении клиента потоковой репликации. Передача изменений из физического слота возможна только по протоколу потоковой репликации — см. Раздел 50.4. Необязательный третий параметр,temporary, когда он равен true, указывает, что этот слот не должен постоянно храниться на диске, так как он предназначен только для текущего сеанса. Временные слоты также освобождаются при любой ошибке. Эта функция соответствует команде протокола репликацииCREATE_REPLICATION_SLOT ... PHYSICAL. | 
|  pg_drop_replication_slot(slot_namename) →void Удаляет физический или логический слот репликации с именем slot_name. Соответствует команде протокола репликацииDROP_REPLICATION_SLOT. Для логических слотов эта функция должна вызываться при подключении к той же базе данных, в которой был создан слот. | 
|  pg_create_logical_replication_slot(slot_namename,pluginname[,temporaryboolean] ) →record(slot_namename,lsnpg_lsn) Создаёт новый логический (декодирующий) слот репликации с именем slot_name, используя модуль выводаplugin. Необязательный третий параметр,temporary, когда равен true, указывает, что этот слот не должен постоянно храниться на диске, так как предназначен только для текущего сеанса. Временные слоты также освобождаются при любой ошибке. Вызов этой функции равнозначен выполнению команды протокола репликацииCREATE_REPLICATION_SLOT ... LOGICAL. | 
|  pg_copy_physical_replication_slot(src_slot_namename,dst_slot_namename[,temporaryboolean] ) →record(slot_namename,lsnpg_lsn) Копирует существующий слот физической репликации с именем src_slot_nameв слот с именемdst_slot_name. Скопированный слот физической репликации начинает резервировать WAL с того же последовательного номера LSN, что и исходный слот. Параметрtemporaryявляется необязательным и позволяет указать, будет ли слот временным. Если параметрtemporaryопущен, сохраняется то же свойство, что имеет исходный слот. | 
|  pg_copy_logical_replication_slot(src_slot_namename,dst_slot_namename[,temporaryboolean[,pluginname]] ) →record(slot_namename,lsnpg_lsn) Копирует существующий слот логической репликации с именем src_slot_nameв слот с именемdst_slot_name, с возможностью смены модуля вывода и свойства временности. Скопированный логический слот начинает передачу с того же последовательного номера LSN, что и исходный слот. Параметрыtemporaryиpluginявляются необязательными; если они опущены, сохраняются свойства исходного слота. | 
|  pg_logical_slot_get_changes(slot_namename,upto_lsnpg_lsn,upto_nchangesinteger,VARIADICoptionstext[]) →setof record(lsnpg_lsn,xidxid,datatext) Возвращает изменения в слоте slot_nameс позиции, до которой ранее были получены изменения. Если параметрыupto_lsnиupto_nchangesравны NULL, логическое декодирование продолжится до конца журнала транзакций. Еслиupto_lsnне NULL, декодироваться будут только транзакции, зафиксированные до заданного LSN. Еслиupto_nchangesне NULL, декодирование остановится, когда число строк, полученных при декодировании, превысит заданное значение. Заметьте однако, что фактическое число возвращённых строк может быть больше, так как это ограничение проверяется только после добавления строк, декодированных для очередной транзакции. | 
|  pg_logical_slot_peek_changes(slot_namename,upto_lsnpg_lsn,upto_nchangesinteger,VARIADICoptionstext[]) →setof record(lsnpg_lsn,xidxid,datatext) Работает так же, как функция pg_logical_slot_get_changes(), но не забирает изменения; то есть, они будут получены снова при следующих вызовах. | 
|  pg_logical_slot_get_binary_changes(slot_namename,upto_lsnpg_lsn,upto_nchangesinteger,VARIADICoptionstext[]) →setof record(lsnpg_lsn,xidxid,databytea) Работает так же, как функция pg_logical_slot_get_changes(), но выдаёт изменения в типеbytea. | 
|  pg_logical_slot_peek_binary_changes(slot_namename,upto_lsnpg_lsn,upto_nchangesinteger,VARIADICoptionstext[]) →setof record(lsnpg_lsn,xidxid,databytea) Работает аналогично функции pg_logical_slot_peek_changes(), но выдаёт изменения в значенииbytea. | 
|  pg_replication_slot_advance(slot_namename,upto_lsnpg_lsn) →record(slot_namename,end_lsnpg_lsn) Продвигает текущую подтверждённую позицию слота репликации с именем slot_name. Слот нельзя переместить назад, а также вперёд за текущую позицию добавления. Возвращает имя слота и позицию, до которой он фактически продвинулся. Информация об изменившемся положении слота, если он продвинулся, сохраняется только при ближайшей контрольной точке. Поэтому в случае прерывания работы слот может оказаться в предыдущем положении. | 
|  pg_replication_origin_create(node_nametext) →oid Создаёт источник репликации с заданным внешним именем и возвращает назначенный ему внутренний идентификатор. | 
|  pg_replication_origin_drop(node_nametext) →void Удаляет ранее созданный источник репликации, в том числе связанную информацию о воспроизведении. | 
|  pg_replication_origin_oid(node_nametext) →oid Ищет источник репликации по имени и возвращает внутренний идентификатор. Если такой источник не находится, выдаёт ошибку. | 
|  pg_replication_origin_session_setup(node_nametext) →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(flushboolean) →pg_lsn Возвращает позицию воспроизведения для источника репликации, выбранного в текущем сеансе. Параметр flushопределяет, будет ли гарантироваться сохранение локальной транзакции на диске. | 
|  pg_replication_origin_xact_setup(origin_lsnpg_lsn,origin_timestamptimestamp 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_nametext,lsnpg_lsn) →void Устанавливает положение репликации для заданного узла в указанную позицию. Это в основном полезно для установки начальной позиции или новой позиции после изменения конфигурации и подобных действий. Но учтите, что неосторожное использование этой функции может привести к несогласованности реплицированных данных. | 
|  pg_replication_origin_progress(node_nametext,flushboolean) →pg_lsn Выдаёт позицию воспроизведения для заданного источника репликации. Параметр flushопределяет, будет ли гарантироваться сохранение локальной транзакции на диске. | 
|  pg_logical_emit_message(transactionalboolean,prefixtext,contenttext) →pg_lsn pg_logical_emit_message(transactionalboolean,prefixtext,contentbytea) →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(relationregclass[,forktext] ) →bigint Вычисляет объём, который занимает на диске один «слой» заданного отношения. (Заметьте, что в большинстве случаев удобнее использовать более высокоуровневые функции pg_total_relation_sizeиpg_table_size, которые суммируют размер всех слоёв.) С одним аргументом она выдаёт размер основного слоя с данными отношения. Название другого интересующего слоя можно передать во втором аргументе: mainвыдаёт размер основного слоя данных заданного отношения.
fsmвыдаёт размер карты свободного места (см. Раздел 65.3), связанной с заданным отношением.
vmвыдаёт размер карты видимости (см. Раздел 65.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(relationregclass) →oid Выдаёт номер «файлового узла», связанного с заданным объектом. Файловым узлом называется основной компонент имени файла, используемого для хранения данных (подробнее это описано в Разделе 65.1). Для большинства отношений этот номер совпадает со значением pg_class.relfilenode, но для некоторых системных каталоговrelfilenodeравен 0, и нужно использовать эту функцию, чтобы узнать действительное значение. Если указанное отношение не хранится на диске, как например представление, данная функция возвращает NULL. | 
|  pg_relation_filepath(relationregclass) →text Выдаёт полный путь к файлу отношения (относительно каталога данных PGDATA). | 
|  pg_filenode_relation(tablespaceoid,filenodeoid) →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(schemaregnamespace) →integer Добавляет правила сортировки в системный каталог pg_collation, анализируя все локали, которые она находит в операционной системе. Эту информацию используетinitdb; за подробностями обратитесь к Подразделу 22.2.2. Если позднее в систему устанавливаются дополнительные локали, эту функцию можно запустить снова, чтобы добавились правила сортировки для новых локалей. Локали, для которых обнаруживаются существующие записи вpg_collation, будут пропущены. (Объекты правил сортировки для локалей, которые перестают существовать в операционной системе, никогда не удаляются этой функцией.) В параметреschemaобычно передаётсяpg_catalog, но это не обязательно; правила сортировки могут быть установлены и в другую схему. Эта функция возвращает число созданных ей объектов правил сортировки; вызывать её разрешено только суперпользователям. | 
В Таблице 9.93 перечислены функции, предоставляющие информацию о структуре секционированных таблиц.
Таблица 9.93. Функции получения информации о секционировании
| Функция Описание | 
|---|
|  pg_partition_tree(regclass) →setof record(relidregclass,parentrelidregclass,isleafboolean,levelinteger) Выводит информацию о таблицах и индексах в дереве секционирования для заданной секционированной таблицы или секционированного индекса, отражая каждую секцию в отдельной строке. В этой информации представляется 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(indexregclass) →integer Сканирует указанный BRIN-индекс в поисках зон страниц в базовой таблице, ещё не обобщённых в индексе; для каждой такой зоны в результате сканирования этих страниц создаётся новый обобщающий кортеж в индексе. Возвращает эта функция число вставленных в индекс обобщающих записей о зонах страниц. | 
|  brin_summarize_range(indexregclass,blockNumberbigint) →integer Обобщает зону страниц, охватывающую данный блок, если она ещё не была обобщена. Эта функция подобна brin_summarize_new_values, но обрабатывает только одну выбранную зону страниц. | 
|  brin_desummarize_range(indexregclass,blockNumberbigint) →void Удаляет из BRIN-индекса кортеж, который обобщает зону страниц, охватывающую данный блок таблицы, если такой кортеж имеется. | 
|  gin_clean_pending_list(indexregclass) →bigint Очищает очередь указанного GIN-индекса, массово перемещая элементы из неё в основную структуру данных GIN, и возвращает число страниц, убранных из очереди. Если для обработки ей передаётся индекс GIN, построенный с отключённым параметром fastupdate, очистка не производится и возвращается 0, так как у такого индекса нет очереди записей. Подробнее об очереди записей и параметреfastupdateрассказывается в Подразделе 62.4.1 и Разделе 62.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(dirnametext[,missing_okboolean,include_dot_dirsboolean] ) →setof text Выдаёт имена всех файлов (а также каталогов и других специальных файлов) в заданном каталоге. Параметр include_dot_dirsопределяет, будут ли в результирующий набор включаться каталоги «.» и «..». По умолчанию они не включаются, но их можно включить, чтобы с параметромmissing_okравнымtrue, пустой каталог можно было отличить от несуществующего. По умолчанию доступ к этой функции имеют только суперпользователи, но право на её выполнение (EXECUTE) можно дать и другим пользователям. | 
|  pg_ls_logdir() →setof record(nametext,sizebigint,modificationtimestamp with time zone) Выводит имя, размер и время последнего изменения (mtime) всех обычных файлов в каталоге журналов сервера. Файлы с именами, начинающимися с точки, каталоги и другие специальные файлы исключаются из рассмотрения. По умолчанию доступ к этой функции имеют только суперпользователи и члены группы pg_monitor, но право на её выполнение (EXECUTE) можно дать и другим пользователям. | 
|  pg_ls_waldir() →setof record(nametext,sizebigint,modificationtimestamp with time zone) Выводит имя, размер и время последнего изменения (mtime) всех обычных файлов в каталоге журнала предзаписи (WAL) сервера. Файлы с именами, начинающимися с точки, каталоги и другие специальные файлы исключаются из рассмотрения. По умолчанию доступ к этой функции имеют только суперпользователи и члены группы pg_monitor, но право на её выполнение (EXECUTE) можно дать и другим пользователям. | 
|  pg_ls_archive_statusdir() →setof record(nametext,sizebigint,modificationtimestamp with time zone) Выводит имя, размер и время последнего изменения (mtime) всех обычных файлов в каталоге состояния архива WAL (pg_wal/archive_status). Файлы с именами, начинающимися с точки, каталоги и другие специальные файлы исключаются из рассмотрения. По умолчанию доступ к этой функции имеют только суперпользователи и члены группы pg_monitor, но право на её выполнение (EXECUTE) можно дать и другим пользователям. | 
|  pg_ls_tmpdir( [tablespaceoid] ) →setof record(nametext,sizebigint,modificationtimestamp with time zone) Выводит имя, размер и время последнего изменения (mtime) всех обычных файлов во временном каталоге для табличного пространства tablespace. Если параметрtablespaceне задан, подразумевается табличное пространствоpg_default. Файлы с именами, начинающимися с точки, каталоги и другие специальные файлы исключаются из рассмотрения. По умолчанию доступ к этой функции имеют только суперпользователи и члены группы pg_monitor, но право на её выполнение (EXECUTE) можно дать и другим пользователям. | 
|  pg_read_file(filenametext[,offsetbigint,lengthbigint[,missing_okboolean]] ) →text Читает из текстового файла всё содержимое или фрагмент с заданного смещения (offset), размером не большеlengthбайт (размер может быть меньше, если файл кончится раньше). Если смещениеoffsetотрицательно, оно отсчитывается от конца файла. Если параметрыoffsetиlengthопущены, возвращается всё содержимое файла. Прочитанные из файла байты обрабатываются как символы в кодировке базы данных; если они оказываются недопустимыми для этой кодировки, возникает ошибка. По умолчанию доступ к этой функции имеют только суперпользователи, но право на её выполнение (EXECUTE) можно дать и другим пользователям. | 
|  pg_read_binary_file(filenametext[,offsetbigint,lengthbigint[,missing_okboolean]] ) →bytea Читает из текстового файла всё содержимое или заданный фрагмент. Эта функция подобна pg_read_file, но может читать произвольные двоичные данные и возвращает результат в значении типаbytea, а неtext; как следствие, никакие проверки кодировок не производятся. По умолчанию доступ к этой функции имеют только суперпользователи, но право на её выполнение (EXECUTE) можно дать и другим пользователям. В сочетании с convert_fromэту функцию можно применять для чтения текста в указанной кодировке и преобразования в кодировку базы данных: SELECT convert_from(pg_read_binary_file('file_in_utf8.txt'), 'UTF8'); | 
|  pg_stat_file(filenametext[,missing_okboolean] ) →record(sizebigint,accesstimestamp with time zone,modificationtimestamp with time zone,changetimestamp with time zone,creationtimestamp with time zone,isdirboolean) Выдаёт запись, содержащую размер файла, время последнего обращения и последнего изменения, а также время последнего изменения состояния (только в Unix-системах), время создания (только в Windows) и флаг, показывающий, что это каталог. По умолчанию доступ к этой функции имеют только суперпользователи, но право на её выполнение (EXECUTE) можно дать и другим пользователям. | 
9.27.10. Функции управления рекомендательными блокировками
Функции, перечисленные в Таблице 9.96, предназначены для управления рекомендательными блокировками. Подробнее об их использовании можно узнать в Подразделе 13.3.5.
Все эти функции предназначены для оперирования блокировками ресурсов, определяемых приложением и задаваемых одним 64-битным или двумя 32-битными ключами (заметьте, что пространства этих ключей не пересекаются). Если конфликтующую блокировку с тем же идентификатором уже удерживает другой сеанс, эти функции либо дожидаются освобождения ресурса, либо выдают в результате false, в зависимости от вида функции. Блокировки могут быть как исключительными, так и разделяемыми — разделяемая блокировка не конфликтует с другими разделяемыми блокировками того же ресурса, но конфликтует с исключительными. Блокировки могут устанавливаться на сеансовом уровне (тогда они удерживаются до момента освобождения или до завершения сеанса) и на транзакционном (тогда они удерживаются до конца текущей транзакции, освободить их вручную нет возможности). Когда поступает несколько запросов на блокировку сеансового уровня, они накапливаются, так что если один идентификатор ресурса был заблокирован три раза, должны поступить три запроса на освобождение блокировки, чтобы ресурс был разблокирован до завершения сеанса.
Таблица 9.96. Функции управления рекомендательными блокировками
| Функция Описание | 
|---|
|  pg_advisory_lock(keybigint) →void pg_advisory_lock(key1integer,key2integer) →void
 Получает исключительную рекомендательную блокировку сеансового уровня, ожидая её, если это необходимо. | 
|  pg_advisory_lock_shared(keybigint) →void pg_advisory_lock_shared(key1integer,key2integer) →void
 Получает разделяемую рекомендательную блокировку сеансового уровня, ожидая её, если это необходимо. | 
|  pg_advisory_unlock(keybigint) →boolean pg_advisory_unlock(key1integer,key2integer) →boolean
 Освобождает ранее полученную исключительную рекомендательную блокировку сеансового уровня. Если блокировка освобождена успешно, эта функция возвращает true, а если сеанс не владел ей —false, при этом сервер выдаёт предупреждение SQL. | 
|  pg_advisory_unlock_all() →void Освобождает все закреплённые за текущим сеансом рекомендательные блокировки сеансового уровня. (Эта функция неявно вызывается в конце любого сеанса, даже при нештатном отключении клиента.) | 
|  pg_advisory_unlock_shared(keybigint) →boolean pg_advisory_unlock_shared(key1integer,key2integer) →boolean
 Освобождает ранее полученную разделяемую рекомендательную блокировку сеансового уровня. Если она освобождена успешно, эта функция возвращает true, а если сеанс не владел этой блокировкой —false, при этом сервер выдаёт предупреждение SQL. | 
|  pg_advisory_xact_lock(keybigint) →void pg_advisory_xact_lock(key1integer,key2integer) →void
 Получает исключительную рекомендательную блокировку транзакционного уровня, ожидая её, если это необходимо. | 
|  pg_advisory_xact_lock_shared(keybigint) →void pg_advisory_xact_lock_shared(key1integer,key2integer) →void
 Получает разделяемую рекомендательную блокировку транзакционного уровня, ожидая её, если это необходимо. | 
|  pg_try_advisory_lock(keybigint) →boolean pg_try_advisory_lock(key1integer,key2integer) →boolean
 Получает исключительную рекомендательную блокировку сеансового уровня, если она доступна. То есть эта функция либо немедленно получает блокировку и возвращает true, либо сразу возвращаетfalse, если получить её нельзя. | 
|  pg_try_advisory_lock_shared(keybigint) →boolean pg_try_advisory_lock_shared(key1integer,key2integer) →boolean
 Получает разделяемую рекомендательную блокировку сеансового уровня, если она доступна. То есть эта функция либо немедленно получает блокировку и возвращает true, либо сразу возвращаетfalse, если получить её нельзя. | 
|  pg_try_advisory_xact_lock(keybigint) →boolean pg_try_advisory_xact_lock(key1integer,key2integer) →boolean
 Получает исключительную рекомендательную блокировку транзакционного уровня, если она доступна. То есть эта функция либо немедленно получает блокировку и возвращает true, либо сразу возвращаетfalse, если получить её нельзя. | 
|  pg_try_advisory_xact_lock_shared(keybigint) →boolean pg_try_advisory_xact_lock_shared(key1integer,key2integer) →boolean
 Получает разделяемую рекомендательную блокировку транзакционного уровня, если она доступна. То есть эта функция либо немедленно получает блокировку и возвращает true, либо сразу возвращаетfalse, если получить её нельзя. | 
9.27.11. Отладочные функции
Функция, показанная в Таблице 9.97, может быть полезна для низкоуровневых операций, например в целях отладки или исследования испорченных баз данных Postgres Pro.
Таблица 9.97. Функции синхронизации снимков
| Имя | Тип результата | Описание | 
|---|
| pg_snapshot_any() | void | Отключает действие правил MVCC в рамках текущей транзакции, что позволяет видеть в ней все версии данных. | 
Применяйте pg_snapshot_any крайне осторожно. Выполнять её следует в транзакции с уровнем изоляции REPEATABLE READ или выше, в противном случае следующий же запрос заменит выбранный снимок новым. Выполнять её могут только суперпользователи. 
Примечание
Если ваш кластер БД создавался сервером версии, в которой этой функции ещё не было, определите её следующей командой: 
CREATE FUNCTION pg_snapshot_any() RETURNS void AS 'pg_snapshot_any' LANGUAGE internal;