Компоновка файлов базы данных
В этом разделе описывается формат хранения данных на уровне файлов и каталогов.
Традиционно файлы конфигурации и данных, используемые кластером баз данных, хранятся вместе в каталоге данных кластера, обычно называемом 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 различает разные временные файлы этого бэкенда.