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

pg_squeeze. Автоматическая реорганизация таблиц по расписанию

Версия: 1.5.2.

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

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

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

Описание

Расширение предназначено для оптимизации хранения данных в таблицах и индексах методом переупаковки данных в новый объект.

Полностью замещает и дополняет расширение pg_repack.

Предусмотрен обмен данными между расширением и администратором СУБД только через следующие объекты:

ОбъектТипНазначение
squeeze.tablesтаблицаРегистрация автоматически обслуживаемых таблиц, по одной записи на таблицу
squeeze.logтаблицаЖурнал переупаковок, заполняется по записи на каждую успешно переупакованную таблицу
squeeze.errorsтаблицаЖурнал ошибок, заполняется ошибками переупаковки
squeeze.start_worker();функцияЗапустить фоновую обработку
squeeze.stop_worker();функцияОстановить фоновую обработку
squeeze.squeeze_table();функцияПереупаковать таблицу вручную

Поля таблицы squeeze.tables и параметры функции squeeze.squeeze_table

Следующие параметры применяются как при регистрации таблицы для автоматической обработки, так и при ручной переупаковке. Им соответствуют и поля таблицы squeeze.tables, и аргументы squeeze.squeeze_table():

ПараметрОписание
tabschemaНазвание схемы
tabnameНазвание таблицы
clustering_indexНазвание существующего индекса обрабатываемой таблицы. Когда обработка будет завершена, записи в таблице будут физически упорядочены и отсортированы в порядке ключа индекса
rel_tablespaceСуществующее табличное пространство, в которое должна быть перемещена таблица. NULL означает, что таблицу следует оставить на своем месте
ind_tablespacesДвумерный массив, в котором каждая запись задает соответствие табличного пространства индексу. Первая и вторая колонка представляют собой название индекса и табличного пространства соответственно. Все индексы, для которых соответствие не задано, останутся в изначальном табличном пространстве
Внимание!

Если табличное пространство задано для таблицы, но не для индексов, то в это табличное пространство перемещается только таблица. Индексы в таком случае остаются в первоначальном пространстве. Таким образом, пространство таблицы не принимается по умолчанию и для индексов.

Следующие параметры применяются только при регистрации таблицы, им соответствуют поля таблицы squeeze.tables:

ПараметрОписание
scheduleУказывает, когда следует проверять и, возможно, переупаковывать таблицу. Расписание задается значением следующего составного типа данных, который напоминает по значению элемент файла crontab

Пример запроса:

CREATE TYPE schedule AS ( minutes minute[], hours hour[], days_of_month dom[], months month[], days_of_week dow[] );
ПараметрОписание
minutes (от 0 до 59), hours (от 0 до 23)Задают время проверки внутри суток
days_of_month (от 1 до 31), months (от 1 до 12), days_of_week (от 0 до 7, где 0 и 7 означают воскресенье)Определяют дни проверок

Проверка выполняется, если minute, hour и month совпадают с текущим временем. При этом NULL означает любую минуту, час и день соответственно. Для того чтобы проверка запустилась, как минимум один из параметров days_of_month, days_of_week должен совпасть с текущим временем. В противном случае оба параметра должны быть NULL.

Например, следующая таблица будет проверяться в 22:30 каждую среду и пятницу:

INSERT INTO squeeze.tables (tabschema, tabname, schedule, free_space_extra, vacuum_max_age, max_retry)
VALUES ('app', 'bar', ('{30}', '{22}', NULL, NULL, '{3, 5}'), 30, '2 hours', 2);
ПараметрОписаниеЗначение по умолчанию
free_space_extraМинимальный процент дополнительного свободного пространства, при котором запускается переупаковка таблицы. «Дополнительный» означает, что порожденное fillfactor свободное пространство — не причина сжимать таблицу. Например, если fillfactor равен 60, то как минимум 40 процентов каждой страницы (блока) должны оставаться свободными при обычной работе. Так, для детектирования со стороны pg_squeeze состояния таблицы при 70 процентах свободного места, необходимо установить порог free_space_extra в значение 30. Порог вычисляется как разность требуемых свободных 70 процентов и 40 процентов, свободных по fillfactor50
min_sizeМинимальное дисковое пространство, которое должна занимать на диске таблица, чтобы подходить для обработки8
vacuum_max_ageМаксимальное время после завершения последней процедуры VACUUM по таблице, в течение которого карта свободного места (FSM) считается свежей. Как только этот интервал истек, доля устаревших версий записей (dead tuples), возможно, становится значительной. Поэтому для оценки потенциального эффекта pg_squeeze потребуется больше усилий, чем простейшая проверка FSM1 hour
max_retryМаксимальное число повторных попыток переупаковки таблицы, если произошел сбой первой попытки обработки соответствующей задачи. Типичная причина повтора обработки то, что определение таблицы поменялось на протяжении операции переупаковки. Если достигнуто максимальное число повторов, то обработка таблицы считается завершенной. Как только наступит следующее запланированное время, будет создана следующая задача0 (т.е. не повторять)
skip_analyzeУказывает, что за обработкой таблицы не должна следовать команда ANALYZEfalse, поэтому по умолчанию ANALYZE после обработки таблицы выполняется

По требованиям к механизму защиты данных от привилегированных пользователей в СУБД Pangolin (перенос таблиц между табличными пространствами как отдельное подлежащее защите действие), запрещено переносить объекты из зашифрованного табличного пространства в открытое как при автоматической обработке, так и вручную. В случае возникновения ошибки Action is forbidden, которая связана с отказом в выполнении переноса в новое табличное пространство, необходимо обратиться к администратору безопасности для получения соответствующих прав. Отказ происходит, когда при явно установленных параметрах rel_tablespace или ind_tablespaces и включенной защите объекта запрошена переупаковка таблицы или индекса, у которых исходное табличное пространство было зашифровано, а новое таковым не является.

Доработка

Доработка не проводилась.

Ограничения

Ограничения отсутствуют.

Установка

При наличии прав администратора СУБД включение модуля возможно выполнить вручную:

CREATE EXTENSION pg_squeeze SCHEMA squeeze;

Настройка

Проверка работоспособности расширения

Для проверки подключения расширения необходимо:

  1. Убедиться, что установлены следующие параметры сервера:

    wal_level: logical
    max_replication_slots = 1 # или добавить 1 к существующему значению
    shared_preload_libraries = 'pg_squeeze' # или добавить библиотеку к существующим
  2. Проверить наличие схемы squeeze, а также подключение под ТУЗ squeeze_tuz;

  3. Перезапустить узлы для применения.

Включение автоматической обработки

Установите два параметра сервера:

squeeze.worker_autostart = 'my_database your_database'
squeeze.worker_role = squeeze_tuz

При следующем перезапуске сервера запустятся четыре обработчика: планировщик и переупаковщик по my_database, такие же процессы по your_database. Все обработчики получат привилегии суперпользователя squeeze_tuz.

Настройка существующей базы

Добавьте установленное расширение к существующей базе, для этого подключитесь к базе в качестве суперпользователя и выполните команду:

CREATE EXTENSION pg_squeeze;

Чтобы настроить автоматический запуск фоновых обработчиков по базе, дополните или добавьте параметр сервера:

squeeze.worker_autostart = 'my_database your_database next_database'

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

Регистрация таблицы

Подключитесь к базе в качестве суперпользователя, после чего выполните:

INSERT INTO squeeze.tables (tabschema, tabname, first_check) VALUES ('app', 'foo', now());

Поля таблицы и их значения подробно описаны выше.

Отмена регистрации

Подключитесь к базе в качестве суперпользователя, после чего выполните:

DELETE FROM squeeze.tables WHERE tabschema='app' and tabname='foo';

Ручная переупаковка таблицы

Выполните команду:

SELECT squeeze.squeeze_table('app', 'pgbench_accounts', null, null, null);

Полная форма: squeeze.squeeze_table(tabchema name, tabname name, clustering_index name, rel_tablespace name, ind_tablespaces name[]). Параметры - см. выше.