Необходимые поддерживающие процессы PostgreSQL
Механизм управления параллелизмом PostgreSQL требует следующих поддерживающих процессов:
- Удалите «мертвые» кортежи и индексные кортежи, указывающие на соответствующие «мертвые» кортежи;
- Удалите ненужные части clog;
- Заморозьте старые txid;
- Обновите FSM, VM, а также статистику.
Необходимость в первом и втором процессах была объяснена в разделах 5.3.2 и 5.4.3 соответственно. Третий процесс связан с проблемой обхода идентификатора транзакции, которая кратко описана в последующем подразделе.
В PostgreSQL за все эти процессы отвечает команда VACUUM, описанная в Разделе 6.
Заморозка
В данном подразделе описывается проблема, связанная с переполнением счетчика транзакций.
Предположим, что кортеж Tuple_1 вставлен с txid, равным 100, т.е. t_xmin кортежа Tuple_1 = 100.
Сервер работает уже давно, при этом Tuple_1 не подвергался каким-либо изменениям. Текущий txid равен 2,1 млрд + 100, выполняется команда SELECT. В это время Tuple_1 является видимымы, поскольку txid 100 находится в прошлом. Затем выполняется та же команда SELECT;, текущий txid равен 2,1 млрд + 101. Однако Tuple_1 больше не виден, поскольку txid 100 находится в будущем (рис. 67).
Данная ситуация в PostgreSQL называется переполнением счетчика транзакций.
Чтобы справиться с этой проблемой, PostgreSQL использует и реализовывает процесс под названием Заморозка.
В PostgreSQL замороженный txid, представляющий собой специальный зарезервированный txid 2, всегда старше всех остальных txid. Другими словами, замороженный txid всегда неактивный и видимый.
Процесс заморозки вызывается командой VACUUM. Процесс заморозки сканирует все файлы таблиц и переписывает t_xmin кортежей в замороженный txid(2), если значение t_xmin старше текущего txid за вычетом параметра vacuum_freeze_min_age . Более подробную информацию Вы найдете в Разделе 6.
Так, рис. 68 а, Вы можете увидеть, что текущий txid равен 50 млн, а процесс FREEZE вызывается командой VACUUM. В этом случае t_xmin как Tuple_1, так и Tuple_2 переписывается в 2.
В версиях 9.4 и новее XMIN_FROZEN устанавливается в поле t_infomask кортежей (рис. 68 b).





