Логически журнал WAL можно представить в виде непрерывного потока записей. Каждая запись имеет номер, называемый LSN (Log Sequence Number). Это 64-разрядное число - смещение записи в байтах относительно начала журнала.
Текущую позицию показывает функция pg_current_xlog_location:
=> SELECT pg_current_xlog_location();
pg_current_xlog_location -------------------------- F/2815BAFC (1 row)
Позиция записывается как два 32-разрядных числа через косую черту.
Запомним позицию в переменной psql:
=> SELECT pg_current_xlog_location() AS pos1 \gset
Выполним теперь какие-нибудь операции и посмотрим, как изменилась позиция.
=> CREATE TABLE t(n integer);
CREATE TABLE
=> INSERT INTO t SELECT gen.id FROM generate_series(1,1000) AS gen(id);
INSERT 0 1000
=> SELECT pg_current_xlog_location();
pg_current_xlog_location -------------------------- F/28185214 (1 row)
=> SELECT pg_current_xlog_location() AS pos2 \gset
Удобно смотреть не на абсолютные числа, а на разницу в байтах:
=> SELECT :'pos2'::pg_lsn - :'pos1'::pg_lsn;
?column? ---------- 169752 (1 row)
Физически журнал хранится в файлах по 16 МБ в отдельном каталоге:
postgres$ ls -l -t $PGDATA/pg_xlog | head
total 770052 -rw------- 1 postgres postgres 16777216 авг 25 22:13 000000010000000F00000028 -rw------- 1 postgres postgres 16777216 авг 25 17:47 000000010000000F00000050 -rw------- 1 postgres postgres 16777216 авг 25 17:47 000000010000000F0000004E -rw------- 1 postgres postgres 16777216 авг 25 17:47 000000010000000F00000054 -rw------- 1 postgres postgres 16777216 авг 25 17:47 000000010000000F00000052 -rw------- 1 postgres postgres 16777216 авг 25 17:47 000000010000000F00000056 -rw------- 1 postgres postgres 16777216 авг 25 17:47 000000010000000F00000042 -rw------- 1 postgres postgres 16777216 авг 25 17:47 000000010000000F00000044 -rw------- 1 postgres postgres 16777216 авг 25 17:47 000000010000000F0000004C
PostgreSQL удаляет файлы, не требующиеся для восстановления, по мере необходимости.
Конец демонстрации.