F.44. pg_repack#
F.44. pg_repack #
F.44.2. Краткое описание #
pg_repack это расширение Tantor SE-1C, которое позволяет удалять избыточные данные из таблиц и индексов, а также при необходимости восстанавливать физический порядок кластеризованных индексов. В отличие от CLUSTER и VACUUM оно работает в режиме онлайн, не удерживая эксклюзивную блокировку обрабатываемых таблиц во время обработки. pg_repack эффективен также, с производительностью, сравнимой с прямым использованием CLUSTER.
pg_repack - это форк предыдущего проекта pg_reorg. Пожалуйста, перейдите на страницу проекта для сообщений об ошибках и получения информации о разработке.
Вы можете выбрать один из следующих методов для переорганизации:
Онлайн CLUSTER (упорядочено по кластерному индексу)
Упорядочено по указанным столбцам
Онлайн VACUUM FULL (упаковка только строк)
Перестроить или переместить только индексы таблицы
ВНИМАНИЕ:
Только суперпользователи могут использовать утилиту.
Целевая таблица должна иметь PRIMARY KEY или по крайней мере, UNIQUE индекс на NOT NULL столбце.
F.44.3. Требования #
- Disks
Выполнение полной переупаковки таблицы требует свободного дискового пространства, примерно в два раза больше, чем у целевой таблицы(таблиц) и ее индексов. Например, если общий размер таблиц и индексов, которые нужно переупаковать, составляет 1 ГБ, требуется дополнительное 2 ГБ дискового пространства.
F.44.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.44.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.44.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-1C, и используйте эти дополнительные соединения для параллелизации перестройки индексов на каждой таблице. Параллельная перестройка индексов поддерживается только для полных перепаковок таблиц, но не с
--index
или--only-indexes
опциями. Если ваш сервер Tantor SE-1C имеет дополнительные ядра и доступ к дисковому вводу/выводу, это может быть полезным способом ускорить 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.44.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.44.5.3. Общие параметры #
-
-e
,--echo
Отобразить команды, отправленные на сервер.
-
-E LEVEL
,--elevel=LEVEL
Выберите уровень вывода сообщений из
DEBUG
,INFO
,NOTICE
,WARNING
,ERROR
,LOG
,FATAL
иPANIC
. По умолчанию используется уровеньINFO
.-
--help
Показать использование программы.
-
--version
Показать номер версии программы.
F.44.6. Окружение #
-
PGDATABASE
,PGHOST
,PGPORT
,PGUSER
Параметры подключения по умолчанию
Этот инструмент, как и большинство других утилит Tantor SE-1C, также использует поддерживаемые libpq переменные окружения.
F.44.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.44.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.44.9. Ограничения #
pg_repack
имеет следующие ограничения.
F.44.9.1. Временные таблицы #
pg_repack
не может реорганизовать временные таблицы.
F.44.9.2. Индексы GiST #
pg_repack
не может кластеризовать таблицы по индексам GiST.
F.44.9.3. DDL команды #
Вы не сможете выполнять команды DDL целевой
таблицы(-ц) за исключением VACUUM
или
ANALYZE
, пока pg_repack
работает. pg_repack
будет удерживать
блокировку ACCESS SHARE
на целевой таблице во время полной
переупаковки, чтобы обеспечить соблюдение этого ограничения.
Если вы используете версию 1.1.8 или более раннюю, вы не должны пытаться
выполнять какие-либо DDL-команды на целевой(ых) таблице(ах) во время
работы pg_repack
. Во многих случаях pg_repack
не справлялся и
корректно откатывался, но были некоторые случаи в этих более ранних
версиях, которые могли привести к повреждению данных.
F.44.10. Подробнее #
F.44.10.1. Полное перепакование таблицы #
Для выполнения полной переупаковки таблицы, pg_repack
будет:
создайте таблицу журнала для записи изменений, внесенных в исходную таблицу
добавьте триггер на исходную таблицу, регистрирующий INSERT, UPDATE и DELETE в нашу таблицу журнала
создать новую таблицу, содержащую все строки из старой таблицы
построить индексы на этой новой таблице
применить все изменения, которые накопились в таблице журнала, к новой таблице
обменять таблицы, включая индексы и toast-таблицы, используя системные каталоги
удалить исходную таблицу
pg_repack
будет удерживать блокировку ACCESS EXCLUSIVE только в течение короткого
периода во время начальной настройки (шаги 1 и 2 выше) и во время
финальной фазы обмена и удаления (шаги 6 и 7). В остальное время
pg_repack
требуется удерживать только блокировку ACCESS SHARE на
исходной таблице, что означает, что операции INSERT, UPDATE и DELETE могут
выполняться как обычно.
F.44.10.2. Индексные только перепаковки #
Для выполнения перепаковки только по индексу, pg_repack
будет:
создайте новые индексы на таблице, используя CONCURRENTLY, соответствующие определениям старых индексов
замените старые индексы на новые в каталогах
удалите старые индексы
Создание индексов совместно с некоторыми ограничениями, пожалуйста см. документацию__ для получения подробной информации.