Журнал

Логически журнал WAL можно представить в виде непрерывного потока записей. Каждая запись имеет номер, называемый LSN (Log Sequence Number). Это 64-разрядное число - смещение записи в байтах относительно начала журнала.

Текущую позицию показывает функция pg_current_xlog_location:

=> SELECT pg_current_xlog_location();
 pg_current_xlog_location 
--------------------------
 F/60EDF1C0
(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/60F08D7C
(1 row)

=> SELECT pg_current_xlog_location() AS pos2 \gset

Удобно смотреть не на абсолютные числа, а на разницу в байтах:

=> SELECT :'pos2'::pg_lsn - :'pos1'::pg_lsn;
 ?column? 
----------
   170940
(1 row)


Физически журнал хранится в файлах по 16 МБ в отдельном каталоге:

postgres$ ls -l -t $PGDATA/pg_xlog | head
total 786436
-rw------- 1 postgres postgres 16777216 сен  1 15:50 000000010000000F00000060
-rw------- 1 postgres postgres 16777216 авг 25 22:14 000000010000000F00000085
-rw------- 1 postgres postgres 16777216 авг 25 22:14 000000010000000F0000008B
-rw------- 1 postgres postgres 16777216 авг 25 22:14 000000010000000F0000007B
-rw------- 1 postgres postgres 16777216 авг 25 22:14 000000010000000F00000080
-rw------- 1 postgres postgres 16777216 авг 25 22:14 000000010000000F0000007D
-rw------- 1 postgres postgres 16777216 авг 25 22:14 000000010000000F0000007C
-rw------- 1 postgres postgres 16777216 авг 25 22:14 000000010000000F00000084
-rw------- 1 postgres postgres 16777216 авг 25 22:14 000000010000000F0000008E

PostgreSQL удаляет файлы, не требующиеся для восстановления, по мере необходимости.


Конец демонстрации.