Перейти к основному содержимому

Компоновка файлов базы данных

В этом разделе описывается формат хранения данных на уровне файлов и каталогов.

Традиционно файлы конфигурации и данных, используемые кластером баз данных, хранятся вместе в каталоге данных кластера, обычно называемом PGDATA (по названию переменной окружения, которая может использоваться для его определения). Обычное местоположение PGDATA - /var/lib/pgsql/data. На одной машине может существовать несколько кластеров, управляемых разными экземплярами сервера.

Каталог PGDATA содержит несколько подкаталогов и управляющих файлов, как показано в таблице ниже. В дополнение к этим необходимым элементам файлы конфигурации кластера postgresql.conf, pg_hba.conf и pg_ident.conf традиционно хранятся в PGDATA, хотя их можно разместить и в другом месте.

ЭлементОписание
PG_VERSIONФайл, содержащий номер основной версии PostgreSQL
baseПодкаталог, содержащий подкаталоги для каждой базы данных
current_logfilesФайл, записывающий файл(ы) журнала, в который в данный момент записывается(ются) коллектор журнала
globalПодкаталог, содержащий общекластерные таблицы, например pg_database
pg_commit_tsПодкаталог, содержащий данные временной метки фиксации транзакции
pg_dynshmemПодкаталог, содержащий файлы, используемые подсистемой динамической разделяемой памяти
pg_logicalПодкаталог, содержащий данные о состоянии для логического декодирования
pg_multixactПодкаталог, содержащий данные о состоянии нескольких транзакций (используется для блокировки общих строк).
pg_notifyПодкаталог, содержащий данные LISTEN/NOTIFY status
pg_replslotПодкаталог, содержащий данные слота репликации
pg_serialПодкаталог, содержащий информацию о сериализуемых транзакциях.
pg_snapshotsПодкаталог, содержащий экспортированные снимки
pg_statПодкаталог, содержащий постоянные файлы для подсистемы статистики
pg_stat_tmpПодкаталог, содержащий временные файлы для подсистемы статистики
pg_subtransПодкаталог, содержащий данные о состоянии субтранзакций
pg_tblspcПодкаталог, содержащий символические ссылки на табличные пространства
pg_twophaseПодкаталог, содержащий файлы состояний для подготовленных транзакций
pg_walПодкаталог, содержащий файлы WAL (Write Ahead Log).
pg_xactПодкаталог, содержащий данные статистики фиксации транзакций
postgresql.auto.confФайл, используемый для хранения параметров конфигурации, которые устанавливаются командой ALTER SYSTEM
postmaster.optsФайл, записывающий параметры командной строки, с которыми сервер был запущен в последний раз
postmaster.pidФайл блокировки, записывающий идентификатор текущего процесса postmaster (PID), путь к каталогу данных кластера, временную метку запуска postmaster, номер порта, путь к каталогу сокетов Unix-домена (может быть empty), первый действительный адрес listen_address (IP-адрес или *, или пустой, если не прослушивается по TCP), и общий идентификатор сегмента памяти (этот файл отсутствует после выключения сервера)

Для каждой базы данных в кластере существует подкаталог PGDATA/base, названный по OID базы данных в pg_database. Этот подкаталог является местом по умолчанию для файлов базы данных; в частности, там хранятся ее системные каталоги.

Обратите внимание, что в следующих разделах описывается поведение встроенного метода доступа к таблицам кучи и встроенных методов доступа к индексам. Из-за расширяемости PostgreSQL другие методы доступа могут работать по-другому.

Каждая таблица и индекс хранятся в отдельном файле. Для обычных отношений эти файлы называются по номеру filenode таблицы или индекса, который можно найти в pg_class.relfilenode. Для временных отношений имя файла имеет вид tBBB_FFF, где BBB - идентификатор бэкенда, создавшего файл, а FFF - номер файлового узла. В любом случае, помимо главного файла (он же главная вилка), каждая таблица и индекс имеют карту свободного пространства (см. раздел «Карта свободного пространства»), которая хранит информацию о свободном пространстве, доступном в отношении. Карта свободного пространства хранится в файле с именем, содержащим номер узла и суффикс _fsm. Таблицы также имеют карту видимости, хранящуюся в форке с суффиксом _vm, чтобы отслеживать, на каких страницах, как известно, нет мертвых кортежей. Карта видимости описана далее в разделе «Карта видимости». У нежурналируемых таблиц и индексов есть третья вилка, известная как вилка инициализации, которая хранится в вилке с суффиксом _init (см. раздел «Форк инициализации»).

Внимание!

Обратите внимание, что хотя узел файла таблицы часто совпадает с его OID, это не обязательно так; некоторые операции, такие как TRUNCATE, REINDEX, CLUSTER и некоторые формы ALTER TABLE, могут изменить узел файла, сохраняя OID. Не следует предполагать, что узел файла и OID таблицы одинаковы. Кроме того, для некоторых системных каталогов, включая сам pg_class, pg_class.relfilenode содержит ноль. Фактический номер узла файла этих каталогов хранится в структуре данных более низкого уровня и может быть получен с помощью функции pg_relation_filenode().

Если таблица или индекс превышают 1 ГБ, они делятся на сегменты размером в гигабайт. Имя файла первого сегмента совпадает с именем filenode; последующие сегменты называются filenode.1, filenode.2 и т. д. Это

расположение позволяет избежать проблем на платформах с ограничениями по размеру файлов. (На самом деле, 1 ГБ - это просто размер сегмента по умолчанию. Размер сегмента можно настроить с помощью конфигурационной опции --with-segsize при сборке PostgreSQL.) В принципе, форки карт свободного пространства и карт видимости также могут потребовать несколько сегментов, хотя на практике это маловероятно.

Таблица, имеющая столбцы с потенциально большими записями, будет иметь связанную с ней таблицу TOAST, которая используется для внестрочного хранения значений полей, слишком больших для хранения в строках таблицы. pg_class.reltoastrelid связывает таблицу с ее таблицей TOAST, если таковая имеется. Дополнительные сведения см. в разделе «TOAST».

Содержание таблиц и индексов рассматривается далее в разделе «Макет страницы базы данных»

Табличные пространства усложняют сценарий. Каждая пользовательская табличная область имеет символическую ссылку внутри каталога PGDATA/pg_tblspc, которая указывает на физический каталог табличной области (т.е. на место, указанное в команде CREATE TABLESPACE табличной области). Эта символическая ссылка имеет имя OID табличного пространства. Внутри каталога физического табличного пространства есть подкаталог с именем, которое зависит от версии сервера PostgreSQL, например PG_9.0_201008051. (Причина использования этого подкаталога заключается в том, что последующие версии базы данных могут использовать одно и то же значение местоположения CREATE TABLESPACE без конфликтов). Внутри подкаталога для конкретной версии есть подкаталог для каждой базы данных, имеющей элементы в табличном пространстве, названный по OID базы данных. Таблицы и индексы хранятся в этом каталоге, используя схему именования filenode. Доступ к табличному пространству pg_default не осуществляется через pg_tblspc, а соответствует PGDATA/base. Аналогично, доступ к табличному пространству pg_global не осуществляется через pg_tblspc, а соответствует PGDATA/global.

Функция pg_relation_filepath() показывает полный путь (относительно PGDATA) для любого отношения. Это часто бывает полезно для запоминания многих из описанных выше правил. Но имейте в виду, что эта функция выдает только имя первого сегмента основной вилки отношения - может понадобиться добавить номер сегмента и/или _fsm, _vm или _init, чтобы найти все файлы, связанные с отношением.

Временные файлы (для таких операций, как сортировка большего количества данных, чем может поместиться в памяти) создаются в каталоге PGDATA/base/pgsql_tmp или в подкаталоге pgsql_tmp каталога табличного пространства, если для них указано табличное пространство, отличное от pg_default. Имя временного файла имеет вид pgsql_tmpPPP.NNN, где PPP - PID принадлежащего бэкенда, а NNN различает разные временные файлы этого бэкенда.