pgcompacttable. Реорганизации данных в таблицах и перестройка индексов#
Версия: 1.0.10.
В исходном дистрибутиве установлено по умолчанию: да.
Связанные компоненты: модуль
pgcompacttableнаписан на языке Perl, поэтому для работы требует библиотеки Perl DBI с модулем поддержки PostgreSQL:
perl-Time-HiRes;
perl-DBI;
perl-DBD-Pg;Схема размещения: не используется.
Утилита pgcompacttable представляет собой скрипт для уменьшения размера «раздутых» таблиц и индексов без тяжелых блокировок.
Модуль предназначен для реорганизации данных в таблицах и перестроения индексов для того, чтобы освободить место на диске без ущерба для производительности базы данных.
Модуль может быть запущен от имени любого пользователя ОС, в том числе на другом хосте (вариант с ключом --host).
Принцип работы pgcompacttable#
Вызовом команды
SET field_name = field_nameвыполняется фиктивное обновление всех записей таблицы, начиная с конца. Утилита проходит по таблице итеративно. На первом шаге обновляется несколько страниц (число считается динамически, максимум 5). Задержка перед обработкой каждого поля вычисляется как произведение--delay-ratioи длительности предыдущей итерации. Это позволяет контролировать нагрузку на БД.Внимание!
Pangolin гарантирует, что все новые данные заполняют свободные места, начиная с начала таблицы. Таким образом, по прохождению всех строк таблица будет укомплектована.
После обработки таблицы
pgcompacttableперестраивает индексы за три шага:Создается новый индекс (команда
CREATE INDEXс параметромCONCURRENTLY).Происходит замена (swap) имени старого индекса на новый (команда
ALTER INDEX RENAME).Удаляется старый индекс (команда
DROP INDEXс параметромCONCURRENTLY).
На шаге ii может возникнуть длительная блокировка. Чтобы не блокировать индексы на длительное время,
pgcompacttableвыполняет множество коротких попыток замены индексов. Поведение управляется ключами:--reindex-retry-count– максимальное количество попыток;--reindex-retry-pause– задержка между попытками;--reindex-lock-timeout– максимальное время выполнения переименования. При превышении количества попыток выводится WARNING-сообщение вида:
Reindex <имя индекса>, lock has not been acquiredПосле обработки всех строк запускается
VACUUMдля удаления пустых блоков с конца таблицы.
Запуск скрипта#
Для запуска скрипта требуются права superuser.
Рекомендуется запускать его от имени владельца кластера. В этом случае скрипт может использовать ionice в бэкенде PostrgreSQL для понижения приоритетов IO.
Используемые ключи делятся на группы:
общие ключи;
ключи настройки соединения;
ключи работы с БД;
ключи настройки поведения инструмента.
Общие ключи:
-?,--help— вывести короткую справку об инструменте;-m,--man— вывести полную справку об инструменте;-V,--version— вывести версию инструмента;-q,--quiet— включить тихий режим. В этом режиме выводятся только сообщения об ошибках и результирующее сообщение;-v,--verbose— включить режим протоколирования. В этом режиме выводятся все сообщения.
Ключи настройки соединения:
-h HOST,--host HOST— имя или IP-адрес сервера базы данных;-p PORT,--port PORT— порт для подключения к базе данных;-U USER,--user USER— имя пользователя базы данных, под которым выполняется подключение. По умолчанию имя текущего пользователя, получаемое командойwhoami;-W PASSWD,--password PASSWD— пароль для указанного пользователя.
Примечание:
Инструмент
pgcompacttableиспользует Perl модуль DBI для соединения с базой данных.Если настройки соединения не передаются в ключах, то инструмент использует переменные окружения
PGHOST,PGPORT, имя текущего пользователя иPGPASSWORD.Если пароль не задан, инструмент попробует применить пароль (в порядке обращения):
Из файла, указанного в переменной окружения
PGPASSFILE.Из файла
HOME/.pgpass.
Ключи работы с БД:
-a,--all– обработать все базы данных в кластере;-d DBNAME,--dbname DBNAME– имя базы данных для обработки. По умолчанию – все базы данных, которыми владеет пользователь, под которым выполняется подключение;-n SCHEMA,--schema SCHEMA– имя схемы для обработки. По умолчанию обрабатывается публичная (public) схема;-N SCHEMA,--exclude-schema SCHEMA– имя исключаемой из обработки схемы;-t TABLE,--table TABLE– имя таблицы для обработки. По умолчанию – все таблицы обрабатываемой схемы;--tables-like 'LIKE expression'– SQL LIKE условие поиска таблиц для обработки. По умолчанию – все таблицы обрабатываемой схемы;-T TABLE,--exclude-table TABLE– имя исключаемой из обработки схемы.
Инструмент игнорирует не найденные в кластере базы данных, схемы и таблицы. Избыточные исключения так же игнорируются.
Все ключи, кроме --all, можно использовать несколько раз.
Ключи настройки поведения инструмента:
-R,--routine-vacuum– включить использованиеVACUUM. По умолчанию выключено;-r,--no-reindex– выключить переиндексирование таблиц после их обработки;--no-initial-vacuum– выключить запускVACUUMперед обработкой таблицы;-i,--initial-reindex– включить переиндексирование таблицы перед ее обработкой;-s,--print-reindex-queries– выводить запросы на переиндексацию. Пример применения: выполнение самостоятельного переиндексирования после работы инструмента;--reindex-retry-count– максимальное количество попыток замены имени индекса. По умолчанию100;--reindex-retry-pause– задержка между попытками реиндексации, в секундах. По умолчанию 1 секунда;--reindex-lock-timeout– задержка перед переиндексацией после выполнения запросовALTER TABLE, в миллисекундах. По умолчанию1000миллисекунд;-f,--force– принудительная реорганизация всех таблиц в указанной базе данных;-E RATIO,--delay-ratio RATIO– коэффициент для вычисления задержки между раундами. Задержка вычисляется как произведение времени выполнения прошлого раунда и указанного коэффициента. По умолчанию2;-Q Query,--after-round-query Query– SQL выражение, выполняемое после каждого раунда обработки базы данных;-o COUNT,--max-retry-count COUNT– максимальное количество попыток повторной обработки в случае ошибки. По умолчанию10.
Внимание!
Таблицы и индексы с «раздутием» меньше 20% считаются нормальными.
Фрагментация: pg_repack и pgcompacttable#
В процессе работы с Pangolin возникает table bloat — ситуация, при которой данные таблиц будут храниться неэффективно. Они фрагментируются, что приводит к ухудшению производительности и нерациональному использованию места на диске.
Основные причины фрагментации:
непредвиденный скачок запросов
UPDATEилиDELETE;долгие транзакции, препятствующие удалению старых версий записей (VACUUM не может удалить запись, если есть хотя бы одна незакрытая транзакция старше запроса, удалившего или изменившего эту запись);
долгие транзакции, препятствующие удалению старых версий записей (
VACUUMне может удалить запись, если есть хотя бы одна незакрытая транзакция старше запроса, удалившего или изменившего эту запись);незавершенные
PREPAREDтранзакции;накопление остатков удаленных записей большого размера при работе с типами данных переменной длины.
Доработка#
Доработка не проводилась.
Ограничения#
Ограничения отсутствуют.
Установка#
Установка не требуется. Расширение установлено по умолчанию.
Исполняемый файл pgcompacttable расположен в каталоге $PGHOME/bin/.
Настройка#
Настройка не требуется.
Использование модуля#
Пример использования#
Реорганизовать таблицу bloated_table:
pgcompacttable --dbname -t bloated_table
Ссылки на документацию разработчика#
Утилита pgcompacttable: https://github.com/dataegret/pgcompacttable.