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

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

По умолчанию PostgreSQL устанавливается в папку /var/lib/postgresql//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-файлы (журнал предзаписи).