Журнал транзакций и файлы сегмента WAL PostgreSQL
Логически PostgreSQL записывает записи XLOG в виртуальный файл, размер которого составляет 8 байт (16 эксабайтов).
Поскольку емкость журнала транзакций фактически неограниченна и можно сказать, что 8 байт адресного пространства - это достаточно много, мы не можем работать с файлом емкостью 8 байт. Поэтому журнал транзакций в PostgreSQL по умолчанию делится на файлы по 16 мегабайт, каждый из которых называется сегментом WAL. Смотрите рисунок 102.
Примечание: Размер сегмента WAL
В версии 11 и новее размер сегмента WAL можно настроить с помощью опции –wal-segsize при создании кластера с помощью команды initdb.
Имя файла сегмента WAL представляет собой шестнадцатеричное 24-значное число, а правила присвоения имени следующие:
WAL segment file name=timelineId+(uint32)LSN−116M∗256+(uint32)(LSN−116M)
Примечание: timelineId
В рамках WAL есть такой концепт, как timelineId (4-байтовое беззнаковое целое число), которое предназначено для PITR, описанного в разделе 10. В этом подразделе timelineId фиксируется на значении 0x00000001.
Первый файл сегмента WAL - 000000010000000000000001. Если первый файл был заполнен записями XLOG, то будет предоставлен второй файл 000000010000000000000002. Файлы используются последовательно в порядке возрастания. После заполнения 000000010000000000000000FF будет предоставлен следующий 000000010000000100000000 файл. Таким образом, каждый раз, когда последняя двузначная цифра переносится вперед, среднее восьмизначное число увеличивается на единицу.
Аналогично, после заполнения 0000000100000001000000FF будет предоставлен 000000010000000200000000 и так далее.
Примечание: pg_xlogfile_name / pg_walfile_name
С помощью встроенной функции pg_xlogfile_name (версия 9.6 и более ранние версии) или pg_walfile_name (версии 10 и новее) можно найти имя файла сегмента WAL, который содержит указанный LSN. Пример показан ниже:
testdb=# SELECT pg_xlogfile_name('1/00002D3E'); # In versions 10 or later, "SELECT pg_walfile_name('1/00002D3E');"
pg_xlogfile_name
--------------------------
000000010000000100000000
(1 row)




