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 BE |
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 BE другие
методы доступа могут работать по-разному.
Каждая таблица и индекс хранятся в отдельном файле. Для обычных отношений эти файлы называются по номеру filenode таблицы или индекса, который можно найти в pg_class
.relfilenode
. Но для временных отношений имя файла имеет форму t
, где BBB
_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 BE).
В принципе, карты свободного пространства и карты видимости также могут требовать несколько
сегментов, хотя это маловероятно в практике.
Все таблицы, имеющие столбцы с потенциально большими записями, имеют связанную таблицу 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_tmp
,
где PPP
.NNN
PPP
- это PID владеющего бэкендом, а
NNN
отличает разные временные файлы этого backend.