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 SCHEMA ext;
Настройка
Настройка не требуется.
Использование модуля
С перечнем опций в рамках использования модуля можно ознакомиться на сайте pg_repack
в разделе «Usage».
Пример использования
Реорганизуйте таблицу bloated_table
:
pg_repack -U <username> -d <dbname> -t bloated_table
Обозначения
Описание возможных ключей утилиты:
-U USERNAME
— имя пользователя;-d DBNAME
— имя базы данных;--table TABLE_NAME
или-t SCHEME_NAME.TABLE_NAME
— выбор таблицы для обработки;--schema SCHEME_NAME
— выбор схемы для обработки;--index INDEX_NAME
— выбор индекса для обработки;--jobs NUMBER_OF_PROCESSES
— запустить несколько параллельных процессов для ускорения обработки.
Ссылки на документацию разработчика
Дополнительно поставляемый модуль pg_repack: https://reorg.github.io/pg_repack/.