Очистка таблиц и системного каталога в Yandex MPP Analytics for PostgreSQL
В Yandex MPP Analytics for PostgreSQL очистка пользовательских таблиц и системного каталога выполняется автоматически в фоновом режиме. Если автоматическая очистка оказывается недостаточной, может потребоваться самостоятельное проведение очистки.
Очистка таблиц
При записи транзакции в базу данных ей присваивается уникальный идентификатор XID (32-битный счетчик). По нему база данных определяет, какая транзакция началась раньше, а какая позже, и какие изменения видны текущей транзакции. Когда значение XID переполняется, счетчик сбрасывается, и отсчет транзакций начинается снова (механизм wraparound).
При выполнении операций обновления (UPDATE) и удаления (DELETE) старые версии строк помечаются как «мертвые» (dead tuples), но физически не удаляются из таблицы, чтобы транзакции, которые начались раньше, могли их видеть. В результате таблицы начинают занимать больше места на диске, и запросы к базе данных выполняются медленнее из-за увеличения объема обрабатываемых данных.
Для освобождения пространства, занятого «мертвыми» строками, используются команды VACUUM и VACUUM FULL. Эти команды также замораживают (frozen) XID в строках, созданных завершенными транзакциями. Это необходимо, чтобы строки оставались видимыми, даже если XID переполнится и идентификаторы завершенных транзакций будут использоваться для новых транзакций.
В Greenplum® по умолчанию используются heap-таблицы — стандартный тип таблиц PostgreSQL. Для них команды VACUUM и VACUUM FULL работают следующим образом:
VACUUMпомечает удаленные и устаревшие строки в таблице и ее индексах как свободное пространство для повторного использования. При этом физический размер таблицы на диске не уменьшается.VACUUM FULLсоздает новую таблицу и копирует в нее строки, исключая удаленные и устаревшие, а также создает новые индексы для таблицы. Затем новая таблица заменяет исходную.VACUUM FULLуменьшает физический размер таблицы на диске и очищает индексы от устаревших строк. На время выполнения операции требуется блокировкаACCESS EXCLUSIVE.
Совет
VACUUM FULL блокирует работу с таблицей и требует дополнительного места на диске для создания временной таблицы, поэтому использовать эту операцию часто не рекомендуется. Чтобы избежать блокировки, можно создать новую таблицу, содержащую актуальные строки, с помощью CREATE TABLE ... AS, а затем удалить исходную таблицу.
Подробнее об операции очистки в PostgreSQL
Информация о незамороженных XID
В PostgreSQL информация о незамороженных XID хранится в таблицах pg_class и pg_database:
- Самый старый незамороженный
XIDдля каждой таблицы — в столбцеrelfrozenxidтаблицыpg_class. - Самый старый незамороженный
XIDдля каждой базы данных — в столбцеdatfrozenxidтаблицыpg_database.
Показатели обновляются после выполнения VACUUM или VACUUM FULL.
Подробнее о wraparound в PostgreSQL
Очистка таблиц AO и AOCO
Таблицы AO и AOCO — таблицы, оптимизированные для добавления. Данные в них хранятся в сегментных файлах, которые состоят из блоков. Новые строки добавляются в конец сегментных файлов, а старые помечаются как «мертвые» и не переписываются.
Для таблиц AO и AOCO команды VACUUM и VACUUM FULL работают следующим образом:
VACUUMсоздает новый файл для каждого сегмента и переносит в него видимые строки. При этом количество блоков на диске не меняется. На время удаления старого файла и активации нового таблица блокируется.VACUUM FULLсоздает новый файл для каждого сегмента и переносит в него видимые строки, перераспределяя их между блоками. Это приводит к уменьшению количества блоков на диске. На время выполнения операции таблица блокируется.
Подробнее об операции очистки для таблиц AO и AOCO
Очистка таблиц Yezzey
Yezzey — это расширение Greenplum®, которое позволяет хранить таблицы AO и AOCO в гибридном хранилище.
Для таблиц AO и AOCO в гибридном хранилище операции VACUUM и VACUUM FULL выполняются так же, как и для подобных таблиц в хранилище кластера.
Очистка системного каталога
В Greenplum® системный каталог — это набор системных таблиц в схеме pg_catalog. Системные таблицы хранят метаданные о таблицах, столбцах и других объектах базы данных. Со временем они раздуваются из-за создания и удаления DDL-объектов, особенно при массовой загрузке данных (например, с помощью Managed Service for Apache Airflow™). Поэтому для системного каталога также необходимо выполнять операции VACUUM и VACUUM FULL.
При выполнении VACUUM FULL системного каталога рекомендуется переводить базу данных в режим ограниченного доступа, например, запретив подключения с помощью правил аутентификации пользователей, чтобы исключить взаимодействие пользователей с каталогом. После завершения очистки базу переводят в обычный режим.
Важно
Прерывание операции VACUUM FULL может повредить каталог на сегменте.
Мониторинг состояния таблиц и индексов
Получить информацию о статистике bloat системного каталога и статистике очистки пользовательских таблиц можно в консоли управления
Подробнее о мониторинге состояния кластера Yandex MPP Analytics for PostgreSQL.
Автоматическая очистка
В Yandex MPP Analytics for PostgreSQL очистка (VACUUM) пользовательских таблиц и системного каталога выполняется автоматически в фоновом режиме. Однако рекомендуется отслеживать состояние таблиц и индексов с помощью графиков bloat и выполнять очистку самостоятельно, если автоматическая очистка оказывается недостаточной и таблицы раздуваются.
Подробнее об автоматической очистке.
Самостоятельное планирование и проведение очистки
Операции VACUUM и VACUUM FULL для таблиц AO и AOCO, а также VACUUM FULL для heap-таблиц требуют эксклюзивной блокировки таблицы (ACCESS EXCLUSIVE). Если в базе данных есть незавершенные транзакции, блокирующие таблицу, возникает конфликт блокировок. Это временно приостанавливает операции с таблицей и с системным каталогом.
Чтобы избежать сбоев, соблюдайте следующие рекомендации:
- выполняйте очистку отдельных таблиц, а не всей базы данных;
- подбирайте частоту очистки для каждой таблицы;
- ограничивайте время очистки;
- контролируйте активные соединения и не допускайте зависших транзакций.