F.31. pg_background#

F.31. pg_background

F.31. pg_background #

F.31.1. О расширении pg_background #

Версия: 1.3

GitHub

F.31.2. pg_background: выполнение команд PostgreSQL в фоновых рабочих процессах #

pg_background позволяет выполнять произвольные SQL-команды в фоновых рабочих процессах в рамках Tantor BE. Это обеспечивает удобный способ разгрузки длительных задач, выполнения операций асинхронно и реализации автономных транзакций.

F.31.3. Особенности #

  • Выполните любую SQL-команду в фоновом рабочем процессе.

  • Получить результат фоновой команды.

  • Отсоедините фоновые рабочие процессы для независимой работы.

  • Улучшенная обработка ошибок и отчетность о результатах команд.

  • Встроенные функции для управления привилегиями.

F.31.4. Установка #

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

CREATE EXTENSION pg_background;

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

F.31.5.1. SQL API: #

pg_background_launch(sql_command TEXT, queue_size INTEGER DEFAULT 65536):

Выполняет sql_command в фоновом рабочем процессе. queue_size определяет размер очереди сообщений (по умолчанию: 65536). Возвращает идентификатор процесса фонового рабочего процесса.

pg_background_result(pid INTEGER):

Извлекает результат команды, выполненной фоновым рабочим процессом с идентификатором процесса pid.

pg_background_detach(pid INTEGER):

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

F.31.6. Примеры #

-- Run VACUUM in the background
SELECT pg_background_launch('VACUUM VERBOSE public.your_table');

-- Retrieve the result
SELECT pg_background_result(12345); -- Replace 12345 with the actual pid

-- Run a command and wait for the result
SELECT pg_background_result(pg_background_launch('SELECT count(*) FROM your_table'));

F.31.7. Управление привилегиями #

Для безопасности предоставьте привилегии выделенной роли:

-- Create a role
CREATE ROLE pgbackground_role;

-- Grant privileges using the built-in function
SELECT grant_pg_background_privileges('pgbackground_role', TRUE);

-- Revoke privileges
SELECT revoke_pg_background_privileges('pgbackground_role', TRUE);

F.31.8. Примеры использования #

Фоновые задачи: Переносите длительные задачи, такие как VACUUM, ANALYZE или CREATE INDEX CONCURRENTLY, на фоновые процессы.

Автономные транзакции: Реализуйте автономные транзакции более эффективно, чем с помощью dblink.

Процедурные языки: Выполняйте команды из процедурных языков, таких как PL/pgSQL, без блокировки.

F.31.9. Больше примеров: #

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

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)

Предоставление/Отзыв разрешений

CREATE ROLE pgbackground_role;
CREATE ROLE

SELECT grant_pg_background_privileges(user_name => 'pgbackground_role', print_commands => true);
INFO:  Executed command: GRANT EXECUTE ON FUNCTION pg_background_launch(pg_catalog.text, pg_catalog.int4) TO pgbackground_role
INFO:  Executed command: GRANT EXECUTE ON FUNCTION pg_background_result(pg_catalog.int4) TO pgbackground_role
INFO:  Executed command: GRANT EXECUTE ON FUNCTION pg_background_detach(pg_catalog.int4) TO pgbackground_role
┌────────────────────────────────┐
│ grant_pg_background_privileges │
├────────────────────────────────┤
│ t                              │
└────────────────────────────────┘
(1 row)

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

SELECT revoke_pg_background_privileges(user_name => 'pgbackground_role', print_commands => true);
INFO:  Executed command: REVOKE EXECUTE ON FUNCTION pg_background_launch(pg_catalog.text, pg_catalog.int4) FROM pgbackground_role
INFO:  Executed command: REVOKE EXECUTE ON FUNCTION pg_background_result(pg_catalog.int4) FROM pgbackground_role
INFO:  Executed command: REVOKE EXECUTE ON FUNCTION pg_background_detach(pg_catalog.int4) FROM pgbackground_role
┌─────────────────────────────────┐
│ revoke_pg_background_privileges │
├─────────────────────────────────┤
│ t                               │
└─────────────────────────────────┘
(1 row)