70.1. Расположение файлов базы данных#

70.1. Расположение файлов базы данных

70.1. Расположение файлов базы данных #

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

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

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

Таблица 70.1. Содержимое PGDATA

Элемент Описание
PG_VERSIONФайл, содержащий основной номер версии Tantor SE-1C
baseПодкаталог, содержащий подкаталоги для каждой базы данных
current_logfilesФайл, в котором записываются текущие файлы журнала, в которые в настоящее время записывает сборщик журнала
globalПодкаталог, содержащий кластерные таблицы, такие как pg_database
pg_commit_tsПодкаталог, содержащий данные времени коммита транзакций
pg_dynshmemПодкаталог, содержащий файлы, используемые подсистемой динамической общей памяти
pg_logicalПодкаталог, содержащий данные о состоянии для логического декодирования
pg_multixactПодкаталог, содержащий данные о состоянии множественных транзакций (используется для общих блокировок строк)
pg_notifyПодкаталог, содержащий данные о состоянии прослушивания/уведомления
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Файл блокировки, записывающий текущий идентификатор процесса постмастер (PID), путь к каталогу данных кластера, временная метка запуска постмастера, номер порта, путь к каталогу сокетов домена Unix (может быть пустым), первый допустимый listen_address (IP-адрес или *, или пусто, если не прослушивается по TCP), и идентификатор общего сегмента памяти (этот файл отсутствует после завершения работы сервера)

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

Обратите внимание, что следующие разделы описывают поведение встроенного метода доступа к таблице heap table access method, а также встроенных методов доступа к индексам index access methods. Из-за расширяемости Tantor SE-1C другие методы доступа могут работать по-разному.

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

Предостережение

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

Когда таблица или индекс превышает 1 ГБ, они разделяются на сегменты размером в гигабайт. Имя файла первого сегмента совпадает с именем файла; последующие сегменты называются файл.1, файл.2 и т.д. Такая организация предотвращает проблемы на платформах с ограничениями на размер файла. (На самом деле, 1 ГБ - это просто размер сегмента по умолчанию. Размер сегмента можно настроить с помощью опции конфигурации --with-segsize при сборке Tantor SE-1C). В принципе, карты свободного пространства и карты видимости также могут требовать несколько сегментов, хотя это маловероятно в практике.

Все таблицы, имеющие столбцы с потенциально большими записями, имеют связанную таблицу TOAST, которая используется для хранения значений полей, которые слишком большие, чтобы поместиться в сами строки таблицы. pg_class.reltoastrelid связывает таблицу с ее таблицей TOAST, если таковая имеется. См. Раздел 70.2 для получения дополнительной информации.

Содержание таблиц и индексов обсуждается далее в Раздел 70.6.

Табличные пространства усложняют сценарий. У каждого пользовательского табличного пространства есть символическая ссылка внутри каталога PGDATA/pg_tblspc, которая указывает на физический каталог табличнoго пространства (т.е. на место, указанное в команде CREATE TABLESPACE). Эта символическая ссылка называется OID табличнoго пространства. Внутри физического каталога табличнoго пространства есть подкаталог с именем, зависящим от версии сервера PostgreSQL, например PG_9.0_201008051. (Причина использования этого подкаталога заключается в том, чтобы последующие версии базы данных могли использовать одно и то же значение местоположения CREATE TABLESPACE без конфликтов.) Внутри подкаталога, специфичного для версии, есть подкаталог для каждой базы данных, в которой есть элементы в tablespace, названный по OID базы данных. Таблицы и индексы хранятся в этом каталоге, используя схему именования filenode. Табличнoe пространствo pg_default не обращается к pg_tblspc, а соответствует PGDATA/base. Аналогично, табличнoe пространствo 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 отличает разные временные файлы этого backend.