Перейти к основному содержимому

pg_repack. Реорганизация таблиц с минимальными блокировками

Версия: 1.4.8.

В исходном дистрибутиве установлено по умолчанию: нет.

Связанные компоненты: отсутствуют.

Схема размещения: ext.

Модуль предназначен для выполнения реорганизации таблиц с минимальными блокировками, а также для опционального восстановления физического порядка кластерных индексов. Это позволяет минимизировать эффект так называемого «раздувания» таблиц (англ. «bloat»).

Внимание!

При включенном прозрачном шифровании (TDE) использовать pg_repack запрещено.

Функциональность расширения

Функциональность:

  • реорганизация таблиц без блокировки, в отличие от стандартных средств PostgreSQL VACUUM FULL и CLUSTER. Производительность сравнима с CLUSTER;
  • удаление пустот в таблицах и индексах;
  • восстановление физического порядка кластеризованных индексов.

Реорганизации таблиц без блокировки

Особенности функциональности:

  • для работы pg_repack требуются права суперпользователя;
  • в реорганизуемых таблицах требуется наличие primary key или хотя бы одного уникального поля;
  • во время работы утилиты с обрабатываемой таблицей можно производить любые манипуляции, кроме DDL.

Алгоритм:

  1. Создается таблица для логирования операций над оригинальной таблицей, которые будут происходить во время выполнения алгоритма.
  2. В оригинальной таблице создаются триггеры для операций Insert, Update и Delete. Триггеры записывают действия в созданную таблицу для логирования.
  3. Создается новая таблица – копия оригинальной таблицы.
  4. Копируются индексы из оригинальной таблицы в новую.
  5. К новой таблице применяются все операции из таблицы логирования (см. шаг 1).
  6. Выполняется swap оригинальной и новой таблиц.
  7. Удаляется оригинальная таблица.

На шагах 1, 2, 6 и 7 для оригинальной таблицы применяется короткая Access Exclusive-блокировка. Данная блокировка незначительна по времени. На остальных шагах к оригинальной таблице применяется Access Share-блокировка.

Недостатки pg_repack

Имеются следующие недостатки:

  • отсутствие ограничений на работу с диском и невозможность распределить нагрузку. Это приводит к значительной нагрузке на диск и падению производительности при работе с большими таблицами (падение сравнимо с вызовом полного копирования таблицы);
  • во время работы переполняется WAL, что приводит к задержке между лидером и репликой и может привести к падению экземпляра Pangolin. При обработке больших таблиц рекомендуется отключить слот репликации на время работы утилиты;
  • для реорганизации требуется дополнительное место на диске, равное сумме размеров оригинальной таблицы, таблиц с логами и индексов. При небольшой нагрузке размером логов можно пренебречь.

Доработка

Доработка: Добавление расширения pg_repack в состав дистрибутива СУБД Pangolin для обеспечения возможности реорганизации таблиц без блокировки.

Версия: 4.3.0.

Ограничения

  1. Отсутствие ограничений на работу с диском и возможности распределить нагрузку приводит к значительной нагрузке на диск и падению производительности при работе с большими таблицами (падение сравнимо с вызовом полного копирования таблицы).
  2. Во время работы забивается журнал предзаписи (WAL, Write-Ahead Logging), что приводит к задержке между лидером кластера и репликой. Результатом этого может стать падение сущности PostgreSQL. При обработке больших таблиц рекомендуется отключить слот репликации на время работы утилиты.
  3. Для реорганизации требуется дополнительное место на диске, равное сумме размера оригинальной таблицы, размера индексов и размера таблицы с логами. При небольшой нагрузке размером логов можно пренебречь.

Установка

Для начала использования расширения его требуется активировать:

CREATE EXTENSION pg_repack;

Настройка

Настройка не требуется.

Использование модуля

С перечнем опций в рамках использования модуля можно ознакомиться на сайте 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/.