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 | Подкаталог, содержащий информацию о зафиксированных транзакциях serializable |
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_FFFBBB - это идентификатор бэкенда, который создал файл, а 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.NNNPPP - это PID владеющего бэкендом, а
NNN отличает разные временные файлы этого backend.