pgcompacttable. Реорганизации данных в таблицах и перестройка индексов
Версия: 1.0.10.
В исходном дистрибутиве установлено по умолчанию: да.
Связанные компоненты: модуль
pgcompacttableнаписан на языке Perl, поэтому для работы требует библиотеки Perl DBI с модулем поддержки PostgreSQL:
perl-Time-HiRes;perl-DBI;perl-DBD-Pg;- модуль pgstattuple.
Схема размещения: не используется.
Расширениеpgcompacttable с версии Pangolin 6.3.0 – не поддерживается и не рекомендуется к использованию.
Утилита 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 в бэкенде СУБД для понижения приоритетов 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транзакции; - накопление остатков удаленных записей большого размера при работе с типами данных переменной длины.
Доработка
Доработка не проводилась.
Ограничения
Ограничения отсутствуют.
Установка
Расширение поставляется в 3rd Party части дистрибутива продукта. Для установки выполните следующие команды:
- SberLinux, РЕД ОС, CentOS
- Astra Linux
- Альт СП
sudo dnf install pangolin-pgcompacttable-{version_component}-{OS}.x86_64.rpm
sudo apt install pangolin-pgcompacttable-{version_component}_amd64.deb
sudo apt-get install pangolin-pgcompacttable-{version_component}-{OS}.x86_64.rpm
Где:
{version_component}– версия поставляемого расширения;{OS}– наименование операционной системы и ее версия.
Пример заполненной команды:
cd distributive
tar -xzf 3rdparty/3rdparty.tar.gz -C 3rdparty/
sudo dnf install -y 3rdparty/pgcompacttable/pangolin-pgcompacttable-1.0.10-sberlinux9.6.x86_64.rpm
Настройка
Настройка не требуется.
Использование модуля
Пример использования
Реорганизовать таблицу bloated_table:
pgcompacttable --dbname -t bloated_table
Ссылки на документацию разработчика
Утилита pgcompacttable: https://github.com/dataegret/pgcompacttable.