F.45. pg_repack#

F.45. pg_repack

F.45. pg_repack

F.45.1. О pg_repack

Версия: 1.4.8

GitHub

F.45.2. Краткое описание

pg_repack это расширение Tantor SE, которое позволяет удалять избыточные данные из таблиц и индексов, а также при необходимости восстанавливать физический порядок кластеризованных индексов. В отличие от CLUSTER и VACUUM оно работает в режиме онлайн, не удерживая эксклюзивную блокировку обрабатываемых таблиц во время обработки. pg_repack эффективен также, с производительностью, сравнимой с прямым использованием CLUSTER.

pg_repack - это форк предыдущего проекта pg_reorg. Пожалуйста, перейдите на страницу проекта для сообщений об ошибках и получения информации о разработке.

Вы можете выбрать один из следующих методов для переорганизации:

  • Онлайн CLUSTER (упорядочено по кластерному индексу)

  • Упорядочено по указанным столбцам

  • Онлайн VACUUM FULL (упаковка только строк)

  • Перестроить или переместить только индексы таблицы

ВНИМАНИЕ:

  • Только суперпользователи могут использовать утилиту.

  • Целевая таблица должна иметь PRIMARY KEY или по крайней мере, UNIQUE индекс на NOT NULL столбце.

F.45.3. Требования

Disks

Выполнение полной переупаковки таблицы требует свободного дискового пространства, примерно в два раза больше, чем у целевой таблицы(таблиц) и ее индексов. Например, если общий размер таблиц и индексов, которые нужно переупаковать, составляет 1 ГБ, требуется дополнительное 2 ГБ дискового пространства.

F.45.4. Установка

Загрузите расширение pg_repack в базу данных, которую вы хотите обработать. pg_repack поставляется в виде расширения, поэтому вы можете выполнить:

$ psql -c "CREATE EXTENSION pg_repack" -d your_database

Вы можете удалить pg_repack, используя DROP EXTENSION pg_repack или просто удалив схему repack.

Если вы обновляете с предыдущей версии pg_repack или pg_reorg, просто удалите старую версию из базы данных, как объяснено выше, и установите новую версию.

F.45.5. Использование

pg_repack [OPTION]... [DBNAME]

Следующие параметры можно указать в OPTIONS.

Options:

-a, --all перепаковать все базы данных

-t, --table=TABLE перепаковать только конкретную таблицу

-I, --parent-table=TABLE перепаковать конкретную родительскую таблицу и ее наследников

-c, --schema=SCHEMA перепаковать таблицы только в определенной схеме

-s, --tablespace=TBLSPC переместить перепакованные таблицы в новое табличнoe пространствo

-S, --moveidx переместить перепакованные индексы в TBLSPC тоже

-o, --order-by=COLUMNS сортировать по столбцам вместо кластерных ключей

-n, --no-order выполнять vacuum full вместо cluster

-N, --dry-run печатает, что было бы упаковано и выходит

-j, --jobs=NUM Используйте столько параллельных заданий для каждой таблицы

-i, --index=INDEX переместить только указанный индекс

-x, --only-indexes перемещает только индексы указанной таблицы

-T, --wait-timeout=SECS тайм-аут для отмены других бэкендов при конфликте

-D, --no-kill-backend не убивать другие бэкенды при истечении времени

-Z, --no-analyze не анализировать в конце

-k, --no-superuser-check пропустить проверки суперпользователя в клиенте

-C, --exclude-extension не перепаковывать таблицы, которые принадлежат определенному расширению

Connection options:

-d, --dbname=DBNAME база данных для подключения

-h, --host=HOSTNAME хост сервера базы данных или каталог сокета

-p, --port=PORT порт сервера базы данных

-U, --username=USERNAME имя пользователя для подключения

-w, --no-password никогда не запрашивать пароль

-W, --password принудительный запрос пароля

Generic options:

-e, --echo отображение запросов

-E, --elevel=LEVEL установить уровень вывода сообщений

--help показать эту справку, затем выйти

--version выводит информацию о версии, затем выходит

F.45.5.1. Опции Reorg

-a, --all

Попытка упаковать все базы данных кластера. Будут прне указаны базы данных, где не установлено расширение pg_repack.

-t TABLE, --table=TABLE

Переорганизовать только указанную таблицу(ы). Можно переорганизовать несколько таблиц, написав несколько переключателей -t. По умолчанию переорганизуются все подходящие таблицы в целевых базах данных.

-I TABLE, --parent-table=TABLE

Переорганизовать как указанную таблицу, так и ее наследников. Множественные иерархии таблиц могут быть переорганизованы путем написания нескольких переключателей -I.

-c, --schema

Перепаковать таблицы только в указанной схеме(ах). Можно перепаковать несколько схем, написав несколько переключателей -c. Может использоваться совместно с --tablespace для перемещения таблиц в другое табличное пространство.

-o COLUMNS [,...], --order-by=COLUMNS [,...]

Выполнить онлайн-кластеризацию по указанным столбцам.

-n, --no-order

Выполните онлайн-очистку FULL. Начиная с версии 1.2 это является значением по умолчанию для несгруппированных таблиц.

-N, --dry-run

Список того, что будет упаковано, и выход.

-j, --jobs

Создайте указанное количество дополнительных соединений с Tantor SE, и используйте эти дополнительные соединения для параллелизации перестройки индексов на каждой таблице. Параллельная перестройка индексов поддерживается только для полных перепаковок таблиц, но не с --index или --only-indexes опциями. Если ваш сервер Tantor SE имеет дополнительные ядра и доступ к дисковому вводу/выводу, это может быть полезным способом ускорить pg_repack.

-s TBLSPC, --tablespace=TBLSPC

Переместите перепакованные таблицы в указанное табличнoe пространствo: это по сути онлайн-версия ALTER TABLE ... SET TABLESPACE. Индексы таблиц остаются в исходном табличном пространстве, если не указано --moveidx.

-S, --moveidx

Также переместите индексы перепакованных таблиц в табличном пространстве, указанный в опции --tablespace.

-i, --index

Перепаковать только указанный(ые) индекс(ы). Несколько индексов могут быть перепакованы путем написания нескольких переключателей -i. Может использоваться совместно с --tablespace, чтобы переместить индекс в другое табличное пространство.

-x, --only-indexes

Перепаковать только индексы указанной таблицы(таблиц), которые должны быть указаны с помощью опций --table или --parent-table.

-T SECS, --wait-timeout=SECS

pg_repack должен взять эксклюзивную блокировку в конце процесса реорганизации. Этот параметр контролирует, сколько секунд pg_repack будет ждать для получения этой блокировки. Если блокировка не может быть получена после этого времени и опция --no-kill-backend не указана, pg_repack принудительно отменит конфликтующие запросы. pg_repack вернется к использованию pg_terminate_backend() для отключения любых оставшихся бэкендов после того, как прошло в два раза больше времени ожидания. По умолчанию это 60 секунд.

-D, --no-kill-backend

Пропустить переупаковку таблицы, если блокировка не может быть получена в течение указанного времени --wait-timeout, вместо отмены конфликтующих запросов. По умолчанию значение равно false.

-Z, --no-analyze

Отключить ANALYZE после полной реорганизации таблицы. Если не указано, выполнить ANALYZE после реорганизации.

-k, --no-superuser-check

Пропустите проверки суперпользователя в клиенте. Эта настройка полезна для использования pg_repack на платформах, которые поддерживают его запуск от имени не суперпользователей.

-C, --exclude-extension

Пропустить таблицы, принадлежащие указанным расширениям. Некоторые расширения могут сильно зависеть от таких таблиц во время планирования и т.д.

F.45.5.2. Параметры подключения

Опции для подключения к серверам. Вы не можете использовать --all и --dbname или --table или --parent-table вместе.

-a, --all

Переорганизовать все базы данных.

-d DBNAME, --dbname=DBNAME

Указывает имя базы данных, которую необходимо переорганизовать. Если это не указано и не используется -a (или --all), то имя базы данных считывается из переменной окружения PGDATABASE. Если она не установлена, то используется имя пользователя, указанное для подключения.

-h HOSTNAME, --host=HOSTNAME

Указывает имя хоста машины, на которой работает сервер. Если значение начинается с косой черты, оно используется в качестве каталога для Unix-доменного сокета.

-p PORT, --port=PORT

Указывает TCP-порт или расширение локального файла сокета Unix, на котором сервер ожидает подключений.

-U USERNAME, --username=USERNAME

Имя пользователя для подключения.

-w, --no-password

Никогда не запрашивайте пароль. Если сервер требует аутентификации по паролю и пароль не доступен другими средствами, такими как файл .pgpass, попытка подключения завершится неудачей. Этот параметр может быть полезен в пакетных заданиях и скриптах, где отсутствует пользователь, чтобы ввести пароль.

-W, --password

Принудительно заставляет программу запрашивать пароль перед подключением к базе данных.

Эта опция никогда не является обязательной, так как программа автоматически запросит пароль, если сервер требует аутентификацию по паролю. Однако, pg_repack будет тратить попытку подключения, чтобы узнать, что сервер требует пароль. В некоторых случаях стоит ввести -W, чтобы избежать дополнительной попытки подключения.

F.45.5.3. Общие параметры

-e, --echo

Отобразить команды, отправленные на сервер.

-E LEVEL, --elevel=LEVEL

Выберите уровень вывода сообщений из DEBUG, INFO, NOTICE, WARNING, ERROR, LOG, FATAL и PANIC. По умолчанию используется уровень INFO.

--help

Показать использование программы.

--version

Показать номер версии программы.

F.45.6. Окружение

PGDATABASE, PGHOST, PGPORT, PGUSER

Параметры подключения по умолчанию

Этот инструмент, как и большинство других утилит Tantor SE, также использует поддерживаемые libpq переменные окружения.

F.45.7. Примеры

Выполните онлайн-кластеризацию всех кластеризованных таблиц в базе данных test и выполните онлайн-очистку (VACUUM FULL) всех некластеризованных таблиц:

$ pg_repack test

Выполните онлайн-очистку полностью (VACUUM FULL) для таблиц foo и bar в базе данных test (кластерный индекс игнорируется).

$ pg_repack --no-order --table foo --table bar test

Переместить все индексы таблицы foo в табличное пространство tbs:

$ pg_repack -d test --table foo --only-indexes --tablespace tbs

Переместить указанный индекс в табличном пространстве tbs:

$ pg_repack -d test --index idx --tablespace tbs

F.45.8. Диагностика

Сообщения об ошибках выводятся, когда pg_repack не работает. В следующем списке показаны причины ошибок.

необходимо вручную очистить после фатальных ошибок. Для очистки просто удалите pg_repack из базы данных и установите его снова: DROP EXTENSION pg_repack CASCADE в базе данных, где произошла ошибка, за которым следует CREATE EXTENSION pg_repack; для предыдущей версии загрузите скрипт $SHAREDIR/contrib/uninstall_pg_repack.sql в базу данных, где произошла ошибка, а затем загрузите $SHAREDIR/contrib/pg_repack.sql снова.

INFO: database "db" skipped: pg_repack VER is not installed in the database

pg_repack не установлен в базе данных, когда указана опция --all.

Создайте расширение pg_repack в базе данных.

ERROR: pg_repack VER is not installed in the database

pg_repack не установлен в базе данных, указанной параметром --dbname.

Создайте расширение pg_repack в базе данных.

ERROR: program 'pg_repack V1' does not match database library 'pg_repack V2'

Существует несоответствие между двоичным файлом pg_repack и библиотекой базы данных (.so или .dll).

Несоответствие может быть вызвано неправильным бинарным файлом в $PATH или обращением к неправильной базе данных. Проверьте каталог программы и базу данных; если они указаны правильно, вам может потребоваться повторить установку pg_repack.

ERROR: extension 'pg_repack V1' required, found 'pg_repack V2'

SQL-расширение, найденное в базе данных, не соответствует версии, требуемой программой pg_repack.

ERROR: relation "table" must have a primary key or not-null unique keys

Целевая таблица не имеет первичного ключа или каких-либо определенных уникальных ограничений.

Определите первичный ключ или ограничение UNIQUE для таблицы.

ERROR: query failed: ERROR: column "col" does not exist

Целевая таблица не имеет столбцов, указанных в опции --order-by.

Укажите существующие столбцы.

WARNING: the table "tbl" already has a trigger called repack_trigger

Триггер, вероятно, был установлен во время предыдущей попытки запустить pg_repack на таблице, которая была прервана и по какой-то причине не удалось очистить временные объекты.

ERROR: Another pg_repack command may be running on the table. Please try again later.

Существует вероятность взаимной блокировки при одновременном выполнении двух команд pg_repack на одной и той же таблице. Поэтому, попробуйте выполнить команду через некоторое время.

WARNING: Cannot create index "schema"."index_xxxxx", already exists

DETAIL: Недействительный индекс мог остаться после предыдущего pg_repack на таблице, который был прерван. Пожалуйста, используйте DROP INDEX "schema"."index_xxxxx" для удаления этого индекса и попробуйте снова.

Временный индекс, по-видимому, созданный pg_repack, был оставлен, и мы не хотим рисковать удалением этого индекса самостоятельно. Если индекс был действительно создан старым заданием pg_repack, которое не было очищено, вам следует просто использовать DROP INDEX и попробовать команду repack снова.

F.45.9. Ограничения

pg_repack имеет следующие ограничения.

F.45.9.1. Временные таблицы

pg_repack не может реорганизовать временные таблицы.

F.45.9.2. Индексы GiST

pg_repack не может кластеризовать таблицы по индексам GiST.

F.45.9.3. DDL команды

Вы не сможете выполнять команды DDL целевой таблицы(-ц) за исключением VACUUM или ANALYZE, пока pg_repack работает. pg_repack будет удерживать блокировку ACCESS SHARE на целевой таблице во время полной переупаковки, чтобы обеспечить соблюдение этого ограничения.

Если вы используете версию 1.1.8 или более раннюю, вы не должны пытаться выполнять какие-либо DDL-команды на целевой(ых) таблице(ах) во время работы pg_repack. Во многих случаях pg_repack не справлялся и корректно откатывался, но были некоторые случаи в этих более ранних версиях, которые могли привести к повреждению данных.

F.45.10. Подробнее

F.45.10.1. Полное перепакование таблицы

Для выполнения полной переупаковки таблицы, pg_repack будет:

  1. создайте таблицу журнала для записи изменений, внесенных в исходную таблицу

  2. добавьте триггер на исходную таблицу, регистрирующий INSERT, UPDATE и DELETE в нашу таблицу журнала

  3. создать новую таблицу, содержащую все строки из старой таблицы

  4. построить индексы на этой новой таблице

  5. применить все изменения, которые накопились в таблице журнала, к новой таблице

  6. обменять таблицы, включая индексы и toast-таблицы, используя системные каталоги

  7. удалить исходную таблицу

pg_repack будет удерживать блокировку ACCESS EXCLUSIVE только в течение короткого периода во время начальной настройки (шаги 1 и 2 выше) и во время финальной фазы обмена и удаления (шаги 6 и 7). В остальное время pg_repack требуется удерживать только блокировку ACCESS SHARE на исходной таблице, что означает, что операции INSERT, UPDATE и DELETE могут выполняться как обычно.

F.45.10.2. Индексные только перепаковки

Для выполнения перепаковки только по индексу, pg_repack будет:

  1. создайте новые индексы на таблице, используя CONCURRENTLY, соответствующие определениям старых индексов

  2. замените старые индексы на новые в каталогах

  3. удалите старые индексы

Создание индексов совместно с некоторыми ограничениями, пожалуйста см. документацию__ для получения подробной информации.

F.45.11. См. также