Управление файлами сегментов WAL в PostgreSQL
PostgreSQL записывает записи XLOG в один из сегментных файлов WAL, хранящихся в подкаталоге pg_wal (в версии 9.6 и более ранних версиях - в подкаталоге pg_xlog). Новый файл сегмента WAL подменяется в том случае, если старый был заполнен. Количество файлов WAL зависит от нескольких параметров конфигурации, а также от активности сервера. Кроме того, в версии 9.5 была улучшена политика управления файлами сегмента WAL.
В следующих подразделах дается подробное описание процессов управления файлами сегментов WAL.
Переключение сегментов WAL
PostgreSQL переключается на новый файл сегмента WAL при следующих условиях:
- Сегмент WAL заполнен;
- Вызвана функция pg_switch_xlog;
- Включен режим archive_mode и превышено время, заданное для archive_timeout.
Переключенные файлы WAL можно либо удалить, либо переработать, т. е. переименовать и повторно использовать в будущем. Количество файлов WAL, которые сервер будет хранить в любой момент времени, зависит от конфигурации сервера, а также от его активности.
Управление сегментами WAL
При запуске контрольной точки PostgreSQL оценивает и подготавливает количество файлов сегмента WAL, которые потребуются для следующего цикла контрольной точки. Эта оценка основана на количестве файлов сегмента WAL, которые были потреблены в предыдущих циклах контрольных точек.
Количество файлов сегмента WAL отсчитывается от сегмента, содержащего предыдущую точку REDO, значение должно находиться между параметром min_wal_size (по умолчанию 80 МБ или 5 файлов) и параметром max_wal_size (по умолчанию 1 ГБ или 64 файла).
Если запускается контрольная точка, PostgreSQL сохранит или переработает необходимые файлы сегмента WAL и удалит все ненужные файлы.
Конкретный пример показан на рис. 113. Предположим, что до начала контрольной точки имеется шесть файлов сегмента WAL, WAL_3 содержит предыдущую точку REDO (в версии 10 и более ранних версия; в версии 11 и новее - точку REDO). В этом случае PostgreSQL считает, что потребуется пять файлов, WAL_1 будет переименован в WAL_7 для повторного использования, а WAL_2 будет удален.
Примечание:
Файлы старее, чем тот, который содержит предыдущую точку REDO, могут быть удалены, поскольку они никогда не будут использоваться.
Если из-за всплеска активности WAL потребуется больше файлов сегмента WAL. Новые файлы сегмента WAL будут создаваться до тех пор, пока общий размер файлов сегмента WAL не достигент параметра max_wal_size. Смотрите рис. 114.
Количество файлов сегмента WAL адаптируется к активности сервера. Если объем записи данных WAL постоянно увеличивается, то расчетное количество файлов сегмента WAL, а также общий размер файлов сегмента WAL, также будут постепенно увеличиваться. В обратном случае (т. е. если объем записи данных WAL уменьшился) они будут уменьшаться.
Если общий размер файлов сегмента WAL превышает параметр max_wal_size, будет запущена контрольная точка. Рисунок 115 наглядно иллюстрирует эту ситуацию. При создании контрольной точки будет создана новая точка REDO, ненужные старые файлы сегмента WAL будут утилизированы. Таким образом, PostgreSQL всегда будет хранить только те файлы сегмента WAL, которые необходимы для восстановления базы данных.
Параметр wal_keep_size (или wal_keep_segments в версии 12 и более ранних версиях), а также параметр replication slot также влияют на количество файлов сегментов WAL






