pg_repack. Реорганизация таблиц с минимальными блокировками
Версия: 1.4.8.
В исходном дистрибутиве установлено по умолчанию: нет.
Связанные компоненты: отсутствуют.
Схема размещения:
ext
.
Модуль предназначен для выполнения реорганизации таблиц с минимальными блокировками, а также для опционального восстановления физического порядка кластерных индексов. Это позволяет минимизировать эффект так называемого «раздувания» таблиц (англ. «bloat»).
Внимание!
При включенном прозрачном шифровании (TDE) использовать
pg_repack
запрещено.
Функциональность расширения
Функциональность:
- реорганизация таблиц без блокировки, в отличие от стандартных средств PostgreSQL
VACUUM FULL
иCLUSTER
. Производительность сравнима сCLUSTER
; - удаление пустот в таблицах и индексах;
- восстановление физического порядка кластеризованных индексов.
Реорганизации таблиц без блокировки
Особенности функциональности:
- для работы pg_repack требуются права суперпользователя;
- в реорганизуемых таблицах требуется наличие primary key или хотя бы одного уникального поля;
- во время работы утилиты с обрабатываемой таблицей можно производить любые манипуляции, кроме DDL.
Алгоритм:
- Создается таблица для логирования операций над оригинальной таблицей, которые будут происходить во время выполнения алгоритма.
- В оригинальной таблице создаются триггеры для операций
Insert
,Update
иDelete
. Триггеры записывают действия в созданную таблицу для логирования. - Создается новая таблица – копия оригинальной таблицы.
- Копируются индексы из оригинальной таблицы в новую.
- К новой таблице применяются все операции из та блицы логирования (см. шаг 1).
- Выполняется swap оригинальной и новой таблиц.
- Удаляется оригинальная таблица.
На шагах 1, 2, 6 и 7 для оригинальной таблицы применяется короткая Access Exclusive-блокировка. Данная блокировка незначительна по времени. На остальных шагах к оригинальной таблице применяется Access Share-блокировка.
Недостатки pg_repack
Имеются следующие недостатки:
- отсутствие ограничений на работу с диском и невозможность распределить нагрузку. Это приводит к значительной нагрузке на диск и падению производительности при работе с большими таблицами (падение сравнимо с вызовом полного копирования таблицы);
- во время работы переполняется WAL, что приводит к задержке между лидером и репликой и может привести к падению экземпляра Pangolin. При обработке больших таблиц рекомендуется отключить слот репликации на время работы утилиты;
- для реорганизации требуется дополнительное место на диске, равное сумме размеров оригинальной таблицы, таблиц с логами и индексов. При небольшой нагрузке размером логов можно пренебречь.
Доработка
Доработка: Добавление расширения
pg_repack
в состав дистрибутива СУБД Pangolin для обеспечения возможности реорганизации таблиц без блокировки.Версия: 4.3.0.
Ограничения
- Отсутствие ограничений на работу с диском и возможности распределить нагрузку приводит к значительной нагрузке на диск и падению производительности при работе с большими таблицами (падение сравнимо с вызовом полного копирования таблицы).
- Во время работы забивается журнал предзаписи (WAL, Write-Ahead Logging), что приводит к задержке между лидером кластера и репликой. Результатом этого может стать падение сущности PostgreSQL. При обработке больших таблиц рекомендуется отключить слот репликации на время работы утилиты.
- Для реорганизации требуется дополнительное место на диске, равное сумме размера оригинальной таблицы, размера индексов и размера таблицы с логами. При небольшой нагрузке размером логов можно пренебречь.
Установка
Для начала использования расширения его требуется активировать:
CREATE EXTENSION pg_repack;