pgcompacttable. Реорганизации данных в таблицах и перестройка индексов#
Версия: 1.0.10.
В исходном дистрибутиве установлено по умолчанию: да.
Связанные компоненты: модуль
pgcompacttableнаписан на языке Perl, поэтому для работы требует библиотеки Perl DBI с модулем поддержки PostgreSQL:
perl-Time-HiRes;
perl-DBI;
perl-DBD-Pg;
Схема размещения: не используется.
Утилита pgcompacttable - это инструмент для уменьшения размера «раздутых» таблиц и индексов без тяжелых блокировок.
Модуль предназначен для реорганизации данных в таблицах и перестроения индексов для того, чтобы освободить место на диске без ущерба для производительности базы данных.
Модуль может быть запущен от имени любого пользователя ОС, в том числе на другом хосте (вариант с ключом --host).
Фрагментация: pg_repack и pgcompacttable#
В процессе работы с Pangolin возникает table bloat — ситуация, при которой данные таблиц будут храниться неэффективно. Они фрагментируются, что приводит к ухудшению производительности и нерациональному использованию места на диске.
Основные причины фрагментации:
непредвиденный скачок запросов
UPDATEилиDELETE;долгие транзакции, препятствующие удалению старых версий записей (
VACUUMне может удалить запись, если есть хотя бы одна незакрытая транзакция старше запроса, удалившего или изменившего эту запись);незавершенные
PREPAREDтранзакции;открытые слоты репликации из-за сильной задержки между Active и Standby или в случае недоступности Standby;
накопление остатков удаленных записей большого размера при работе с типами данных переменной длины.
Расширение pg_repack#
Устройство расширения#
Функциональность:
удаление пустот в таблицах и индексах;
восстановление физического порядка кластеризованных индексов.
Особенности функциональности:
в отличие от стандартных средств PostgreSQL, VACUUM FULL и CLUSTER, реорганизация таблиц происходит без блокировки операций над обрабатываемыми данными;
производительность сравнима с CLUSTER;
для работы
pg\_repackтребуются праваsuperuser;требования к реорганизуемым таблицам: наличие primary key или хотя бы одного уникального поля;
во время работы утилиты с обрабатываемой таблицей можно производить любые манипуляции, кроме DDL.
Алгоритм работы:
Создается таблица для логирования операций, которые будут производиться над оригинальной таблицей во время выполнения алгоритма.
В оригинальной таблице создаются триггеры для операций
Insert,UpdateиDelete. Триггеры записывают действия в созданную таблицу для логирования.Создается новая таблица, копия оригинальной таблицы.
Копируются индексы из оригинальной таблицы в новую.
К новой таблице применяются все операции из таблицы логирования (см. пункт 1).
Выполняется
swapоригинальной и новой таблицы.Удаляется оригинальная таблица.
На шагах 1, 2, 6 и 7 для оригинальной таблицы применяется короткая Access Exclusive блокировка. На остальных - Access Share блокировка.
Недостатки pg_repack:
отсутствие ограничений на работу с диском и возможности распределить нагрузку. Приводит к значительной нагрузке на диск и падению производительности при работе с большими таблицами;
во время работы переполняется
WAL. Это приводит к задержке между Active и Standby и может стать причиной отказа экземпляра PostgreSQL. При обработке больших таблиц рекомендуется отключить слот репликации на время работы утилиты;для реорганизации требуется дополнительное место на диске, равное сумме оригинальной и содержащей логи таблиц и размеру индексов.
Инструмент pgcompacttable#
Устройство расширения#
Скрипт реорганизации данных в «раздутых» таблицах (bloated tables), восстановления индексов и возврата дискового пространства.
Преимущества:
не влияет на производительность базы данных;
не использует Access Exclusive блокировки.
Отличия от pg_repack:
не требует много места на диске:
таблицы обрабатываются «на месте»;
индексы перестраиваются друг за другом, от меньшего к большему;
максимальное требуемое место на диске равно размеру наибольшего индекса.
таблицы обрабатываются с настраиваемыми задержками для предотвращения перегрузки IO и всплесков задержки репликации (см. ключ
--delay-ratio);не может переносить таблицы и/или индексы в другое табличное пространство.
Принцип работы pgcompacttable:
Выполняется фиктивное обновление всех записей таблицы, начиная с конца, командой
SET field\_name = field\_name. Задержка перед обработкой каждого поля одинакова, что позволяет контролировать нагрузку на систему.Примечание:
PostgreSQL гарантирует, что все новые данные добавляются в свободные места в начале таблицы, так что по прохождению всех строк таблица будет укомплектована.
После обработки таблицы pgcompacttable перестраивает индексы за три шага:
Создается новый индекс (команда
CREATE INDEXс параметромCONCURRENTLY).Происходит замена (
SWAP) имени старого индекса на новый (командаALTER INDEX RENAME).Удаляется старый индекс (команда
DROP INDEXс параметромCONCURRENTLY).
На втором шаге может возникнуть длительная блокировка. Чтобы не блокировать индексы на длительное время, pgcompacttable выполняет множество коротких попыток замены индексов. Поведение управляется ключами:
--reindex-retry-count– максимальное количество попыток;--reindex-retry-pause– задержка между попытками;--reindex-lock-timeout– максимальное время выполнения переименования. При превышении количества попыток выводится WARNING сообщение:Reindex <имя индекса>, lock has not been acquired.
После обработки всех строк запускается VACUUM для удаления пустых блоков с конца таблицы.
Сравнение утилит Pangolin и встроенных в PostgreSQL#
CLUSTER/VACUUM |
pg_repack |
pgcompacttable |
|
|---|---|---|---|
Нагрузка на диск и WAL меньше, чем у CLUSTER |
+ |
||
Скорость работы выше по сравнению с CLUSTER |
+ |
||
Позволяет отдельно работать с индексами |
- |
+ |
- |
Позволяет указать задержку между этапами реорганизации |
- |
- |
+ |
Может выполнять операцию CLUSTER |
+ |
- |
|
Не требует наличия основных (primary) или уникальных (unique) ключей |
- |
- |
+ |
Не требует дополнительное дисковое пространство |
- |
- |
+ |
Может переносить таблицы и/или индексы в другие табличные пространства |
- |
+ |
- |
Работу обеих утилит могут затормозить:
долгие транзакции;
постоянная вставка и изменение данных.
Рекомендации по использованию:
pgcompacttable – для безопасной реорганизации таблиц;
pg_repack – для переноса таблицы в другое табличное пространство и использования CLUSTER без блокировки.
Доработка#
Доработка не проводилась.
Ограничения#
Ограничения отсутствуют.
Установка#
Установка утилиты в документе «Руководство администратора», раздел «Сценарии администрирования», подраздел «Инструмент pgcompacttable».
Расширение установлено по умолчанию.
Настройка#
Настройка не требуется.
Использование модуля#
Подробное описание в документе «Руководство администратора», раздел «Сценарии администрирования», подраздел «Инструмент pgcompacttable».
Ссылки на документацию разработчика#
Утилита pgcompacttable: https://github.com/dataegret/pgcompacttable.