Sysadminium
Познакомимся поближе с процессом VACUUM и теми задачами, которые он решает в PostgreSQL. Этот процесс чистит таблицы, обновляет статистику и обновляет карты видимости и свободного пространства. А также борется с переполнением счетчика транзакций.
Варианты запуска очистки
Очищать таблицы или базы данных от ненужных версий строк можно с помощью следующих команд:
- VACUUM таблица; — очищает таблицу;
- VACUUM; — базу данных;
- $ vacuumdb — обёртка для использования в ОС.
Процедура VACUUM выполняется параллельно с другими транзакциями. При этом частый запуск нагружает систему, редкий запуск приводит к росту размера файлов. Подробнее почитать про очистку PostgreSQL можно тут. Мы уже встречались с понятием VACUUM в статье «Изоляция и многоверсионность в Postgresql«.
Дополнительно к этому существует процесс автоматической очистки AUTOVACUUM:
- autovacuum launcher — следит за таблицами и в случае необходимости запускает autovacuum worker;
- autovacuum worker — занимается очисткой таблиц.
Частота работы autovacuum worker зависит от частоты изменений таблицы. Чем активнее ведётся работа с таблицей, тем чаще туда приходит autovacuum. Autovacuum настраивается конфигурационными параметрами.
Как уже рассматривалось VACUUM и AUTOVACUUM не сжимает файл, а только очищает его образовывая в нем пустые пространства. Для полного перестроения файла, другими словами чтобы файл уменьшился, нужно использовать VACUUM FULL:
- VACUUM FULL таблица; — очистка таблицы;
- VACUUM FULL; — очистка базы;
- $ vacuumdb —full — обёртка для использования в ОС.
VACUUM FULL очищает таблицу и перезаписывает её в новый файл, при этом файл уменьшается в размере. Для этого на таблицу навешивают блокировку, поэтому на некоторое время таблица становится недоступной. Похожим образом работает TRUNCATE.
Команда TRUNCATE блокирует таблицу и очищает её, при этом старые версии строк не сохраняются и файл уменьшается физически. Другой способ очистить таблицу это выполнить DELETE всех строк в ней, а затем запустить по этой таблице VACUUM FULL для очистки. TRUNCATE это транзакционная команда, поэтому её можно отменить (ROLLBACK).
Обновление статистики
Фоновый процесс autovacuum обновляет статистику. А статистика необходима планировщику, чтобы строить план запроса.
В ручную сбор статистику можно запустить с помощью следующих команд:
- ANALYZE [таблица]; — обновить статистику по таблице;
- ANALYZE; — обновить статистику по базе данных;
- $ vacuumdb —analyze-only — обёртка для использования в ОС;
- VACUUM ANALYZE; — выполнить очистку, а затем сбор статистики.
Существует много параметров конфигурации, которые управляют процессом autovacuum:
postgres@s-pg13:~$ grep autovacuum $PGDATA/postgresql.conf #autovacuum_work_mem = -1 # min 1MB, or -1 to use maintenance_work_mem #autovacuum = on # Enable autovacuum subprocess? 'on' #log_autovacuum_min_duration = -1 # -1 disables, 0 logs all actions and #autovacuum_max_workers = 3 # max number of autovacuum subprocesses #autovacuum_naptime = 1min # time between autovacuum runs #autovacuum_vacuum_threshold = 50 # min number of row updates before #autovacuum_vacuum_insert_threshold = 1000 # min number of row inserts #autovacuum_analyze_threshold = 50 # min number of row updates before #autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum #autovacuum_vacuum_insert_scale_factor = 0.2 # fraction of inserts over table #autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze #autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum #autovacuum_multixact_freeze_max_age = 400000000 # maximum multixact age #autovacuum_vacuum_cost_delay = 2ms # default vacuum cost delay for # autovacuum, in milliseconds; #autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for # autovacuum, -1 means use
Обновление карт видимости и свободного пространства
Карта видимости — помечает те страницы, где есть только актуальные версии строк, значит очищать такие страницы не нужно.
Карта свободного пространства — нужна чтобы быстро вставлять новые версии строк.
Эти карты обновляет autovacuum:
- после очистки, если на странице не осталось старых версий строк, autovacuum ставит галочку в карте видимости. Любой процесс, который запишет в эту страницу, эту галочку снимает.
- когда autovacuum почистит страницу, в ней образуются дыры, и он обновляет карту свободного пространства.
Переполнение счётчика транзакций и заморозка
Счетчик транзакций 32-битный — это примерно 4 миллиарда значений. И он постоянно растёт! Если счетчик транзакций переполнится и начтет считать с нуля, то это приведет к большим проблемам на сервере. Для борьбы с этой проблемой существует процесс «Заморозка«.
При заморозке берутся версии строчек, в которых номер транзакции достаточно старый. То есть эта транзакция должна быть видна во всех новых снимках. Этот номер транзакции меняется на «минус бесконечность«. Система понимает, что эта строчка была создана когда-то давно и номер транзакции создавший её уже не имеет значения. Значит этот номер транзакции можно использовать повторно. Замороженные номера транзакций можно повторно использовать.
Почему не сделать счетчик 64 битным? В каждой версии строчки есть заголовок. Если счетчик будет 64 битным, то будет слишком много служебной информации на каждую версию строки.
Заморозкой тоже занимается VACUUM.