Перейти к основному содержанию
`Ctrl`+`K`

# Структура каталогов и файлов PostgreSQL

СУБД PostgreSQL в разных операционных системах имеет практически идентичную структуру каталогов. В данной статье рассматривается стандартная структура каталогов для ОС Ubuntu 12.04.

По умолчанию PostgreSQL устанавливается в папку `/var/lib/postgresql/<version>/main`. Основной каталог СУБД содержит подкаталоги с пользовательскими данными и служебной информацией.

- `postmaster.opts` - файл, в котором содержится командная строка с параметрами, с помощью которой была запущена СУБД.
  Пример строки из файла `postmaster.opts`:

      /usr/lib/postgresql/16/bin/postgres "-D" "/var/lib/postgresql/16/main" "-c" "config_file=/etc/postgresql/16/main/postgresql.conf"

- `PG_VERSION` - файл, содержащий основной номер версии СУБД (к примеру, 16).

- `base` - каталоги внутри `base/` соответствуют OID баз данных. Это физические директории, где хранятся файлы таблиц, индексов и т.д. для каждой базы.

  Имена подкаталогов соответствуют OIDам баз данных:

      root@server: /var/lib/postgresql/16/main/base# ls
      1/  12065/  12070/  16384/  24580/

      user=# select oid, datname from pg_database;
      oid  |  datname
      -------+-----------
          1 | template1
      12065 | template0
      12070 | postgres
      16384 | user
      24580 | t1
      (5 rows)

- `global` - каталог `global/` содержит данные, общие для всех БД — например, `pg_database`, `pg_authid` и др.

- В PostgreSQL 10 и выше `pg_clog` переименован в `pg_xact` и содержит информацию о статусах транзакций (по 2 бита на каждую). Статус транзакции может иметь следующие значения:

  - транзакция стартовала;

  - транзакция успешно завершена;

  - транзакция отменена;

  - подтранзакция успешно завершена.

  Количество хранимых транзакций ограничено параметром `autovacuum_freeze_max_age` (максимальное значение ~ 2 миллиарда), который в свою очередь регулирует работу автовакума. Поэтому максимальный размер файла может быть ~ 0.5 ГБ.

- `pg_multixact` - каталог, содержащий информацию, необходимую для координации работы параллельных транзакций (используется для хранения SHARED ROW LOCKS).

- `pg_notify` - каталог, в котором хранится информация для поддержки работы LISTEN/NOTIFY.

- `pg_serial` - каталог, содержащий информацию о завершенных последовательных (serializable) транзакциях.

- `pg_snapshots` - каталог, в котором хранятся экспортированные снапшоты.

  Файлы создаются при вызове процедуры `pg_export_snapshot()` и существуют до окончания транзакции.

  Ниже представлена последовательность действий, позволяющая понять, как появляются и исчезают файлы в этом каталоге.

  Экспорт снапшота в транзакции:

      BEGIN
      user=# SELECT pg_export_snapshot();
      pg_export_snapshot
      --------------------
      00000312-1
      (1 row)

  В каталоге появился файл, в котором содержится информация о снапшоте:

      root@server: /var/lib/postgresql/16/main/pg_snapshots# ls
      00000312-1

      root@server: /var/lib/postgresql/16/main/pg_snapshots# cat 00000312-1

      xid:786
      dbid:16384
      iso:1
      ro:0
      xmin:786
      xmax:786
      xcnt:0
      sof:0
      sxcnt:0
      rec:0

  Отмена транзакции:

      user=# rollback;
      ROLLBACK

  Файл удален:

      root@server: /var/lib/postgresql/16/main/pg_snapshots# l
      ----

- `pg_stat_tmp` - каталог, содержащий информацию необходимую для поддержания работы системы статистики. Сборщик статистики использует этот каталог для передачи информации другим процессам СУБД. Этот каталог может быть перемещен в оперативную память для уменьшение нагрузки на жесткий диск.

- `pg_subtrans` - каталог, в котором хранится информация о подтранзакциях

- `pg_tblspc` - в каталоге хранятся символьные ссылки на табличные пространства (tablespaces).

  Ниже показана последовательность действий, демонстрирующая, как в этом каталоге появляются файлы.

  Создается табличное пространство:

      user=# CREATE TABLESPACE tmp LOCATION '/home/user/1';
      CREATE TABLESPACE

  Получается список табличных пространств:

      user=# select oid, spcname  from pg_tablespace;
      oid  |  spcname
      -------+------------
      1663 | pg_default
      1664 | pg_global
      27936 | tmp
      (3 rows)

  Для каждого пользовательского табличного пространства в каталоге создается символьная ссылка на заданный каталог, именем этой ссылки является OID этого табличного пространства.

      /var/lib/postgresql/16/main/pg_tblspc# ll
      total 8
      drwx------  2 postgres postgres 4096 Nov  4 09:51 ./
      drwx------ 15 postgres postgres 4096 Nov  4 07:05 ../
      lrwxrwxrwx  1 postgres postgres   13 Nov  4 09:51 27936 -> /home/user/1/

- `pg_twophase` - каталог содержит информацию о подготовленных транзакциях для двухфазного коммита.

- Каталог `pg_xlog` (в PostgreSQL 10+ — pg_wal) содержит WAL-файлы (журнал предзаписи).