pgcompacttable. Реорганиз ации данных в таблицах и перестройка индексов
Версия: 1.0.10.
В исходном дистрибутиве установлено по умолчанию: да.
Связанные компоненты: модуль
pgcompacttable
написан на языке Perl, поэтому для работы требует библиотеки Perl DBI с модулем поддержки PostgreSQL:
perl-Time-HiRes
;perl-DBI
;perl-DBD-Pg
;- модуль
pgstattuple
.Схема размещения: не используется.
Утилита 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
транзакции; - накопление остатков удаленных записей большого размера при работе с типами данных переменной длины.