F.35. pg_background#

F.35. pg_background

F.35. pg_background

F.35.1. О расширении pg_background

Версия: 1.1

GitHub

F.35.2. Фоновый рабочий процесс Postgres

pg_background - это расширение для Tantor SE. Изначально это расширение было представлено Робертом Хаасом в сообществе PostgreSQL для демонстрационных целей. Была добавлена дополнительная обработка ошибок и результаты команд.

Этот модуль позволяет пользователю выполнять произвольные команды в фоновом режиме и предоставляет возможность пользователям запускать

  1. VACUUM в фоновом режиме.

  2. Реализация автономной транзакции лучше, чем метод dblink.

  3. Позволяет выполнять задачи, такие как CREATE INDEX CONCURRENTLY, из процедурного языка.

Этот модуль поставляется с следующими SQL API:

  1. pg_background_launch: Этот API принимает SQL-команду, которую пользователь хочет выполнить, и размер буфера очереди. Эта функция возвращает идентификатор процесса фонового рабочего процесса.

  2. pg_background_result: Этот API принимает идентификатор процесса в качестве входного параметра и возвращает результат команды, выполненной через фоновый рабочий процесс.

  3. pg_background_detach: Этот API принимает идентификатор процесса и отсоединяет фоновый процесс, который ожидает, пока пользователь прочитает его результаты.

F.35.3. Установка

Чтобы установить расширение, просто выполните команду:

CREATE EXTENSION pg_background;

F.35.4. Использование

Для выполнения команды в фоновом режиме пользователь может использовать следующий SQL API

SELECT pg_background_launch('SQL COMMAND');

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

SELECT pg_background_result(pid)

pid - это идентификатор процесса, возвращаемый функцией pg_background_launch

Пример:

SELECT pg_background_launch('vacuum verbose public.sales');
 pg_background_launch 
----------------------
                11088
(1 row)


SELECT * FROM pg_background_result(11088) as (result text);
INFO:  vacuuming "public.sales"
INFO:  index "sales_pkey" now contains 0 row versions in 1 pages
DETAIL:  0 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO:  "sales": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages
DETAIL:  0 dead row versions cannot be removed yet.
There were 0 unused item pointers.
Skipped 0 pages due to buffer pins.
0 pages are entirely empty.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO:  vacuuming "pg_toast.pg_toast_1866942"
INFO:  index "pg_toast_1866942_index" now contains 0 row versions in 1 pages
DETAIL:  0 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO:  "pg_toast_1866942": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages
DETAIL:  0 dead row versions cannot be removed yet.
There were 0 unused item pointers.
Skipped 0 pages due to buffer pins.
0 pages are entirely empty.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
 result    
--------
 VACUUM
(1 row)

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

SELECT * FROM pg_background_result(pg_background_launch('vacuum verbose public.sales')) as (result TEXT);
INFO:  vacuuming "public.sales"
INFO:  index "sales_pkey" now contains 0 row versions in 1 pages
DETAIL:  0 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO:  "sales": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages
DETAIL:  0 dead row versions cannot be removed yet.
There were 0 unused item pointers.
Skipped 0 pages due to buffer pins.
0 pages are entirely empty.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO:  vacuuming "pg_toast.pg_toast_1866942"
INFO:  index "pg_toast_1866942_index" now contains 0 row versions in 1 pages
DETAIL:  0 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO:  "pg_toast_1866942": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages
DETAIL:  0 dead row versions cannot be removed yet.
There were 0 unused item pointers.
Skipped 0 pages due to buffer pins.
0 pages are entirely empty.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
 result 
--------
 VACUUM
(1 row)