Структура каталога данных
В этой статье описывается структура директории с данными кластера ADPG.
ADPG сохраняет файлы данных в каталоге, указанном в параметре конфигурации Data directory. Значение по умолчанию — /pg_data1
. Можно изменить это значение во время установки кластера ADPG, до установки ADPG-сервиса.
Содержимое каталога данных кластера
В каталоге, указанном в Data directory, находится подкаталог для текущего кластера. Для ADPG v16.x.x это adpg16. Его содержимое приведено в таблице ниже.
Элемент | Описание |
---|---|
PG_VERSION |
Файл, содержащий номер мажорной версии ADPG/PostgreSQL |
base |
Каталог, содержащий подкаталоги для каждой базы данных |
current_logfiles |
Файл, регистрирующий log-файлы, в которые в данный момент пишет сборщик сообщений |
global |
Каталог, содержащий общие таблицы кластера, например |
pg_commit_ts |
Каталог, содержащий данные о времени фиксации транзакции |
pg_dynshmem |
Каталог, содержащий файлы, используемые подсистемой динамической разделяемой памяти |
pg_logical |
Каталог, содержащий данные о состоянии подписок (subscriptions) или слотов репликации, используемые для логического декодирования |
pg_multixact |
Каталог, содержащий данные о состоянии мультитранзакций, используемые для разделяемой блокировки строк |
pg_notify |
Каталог, содержащий данные о состоянии |
pg_replslot |
Каталог, содержащий данные слота репликации |
pg_serial |
Каталог, содержащий информацию о выполненных сериализуемых транзакциях |
pg_snapshots |
Каталог, содержащий экспортированные снепшоты |
pg_stat |
Каталог, содержащий постоянные файлы для подсистемы статистики |
pg_stat_tmp |
Каталог, содержащий временные файлы для подсистемы статистики |
pg_subtrans |
Каталог, содержащий данные о состоянии подтранзакций |
pg_tblspc |
Каталог, содержащий символические ссылки на табличные пространства |
pg_twophase |
Каталог, содержащий файлы состояний для подготовленных транзакций |
pg_wal |
Каталог, содержащий WAL-файлы |
pg_xact |
Каталог, содержащий данные о состоянии фиксации транзакции |
postgresql.auto.conf |
Файл, используемый для хранения параметров конфигурации, которые задаются командой SQL |
postmaster.opts |
Файл, содержащий параметры командной строки, с которыми сервер был запущен последний раз |
postmaster.pid |
Файл блокировки, содержащий идентификатор текущего управляющего процесса (PID), путь к каталогу данных кластера, время запуска процесса postmaster, номер порта, путь к каталогу Unix-сокета (может быть пустым), первое валидное значение параметра |
Для каждой базы данных существует свой подкаталог в каталоге base, названный в соответствии с OID базы данных. OID можно получить из системного каталога pg_database:
SELECT oid, datname FROM pg_database;
oid | datname -----+----------- 5 | postgres 1 | template1 4 | template0
Для просмотра содержимого каталога base выполните следующую команду:
$ cd /pg_data1/adpg16/base && ls
Результат:
1 4 5
В подкаталоге базы данных хранятся все её файлы, включая системные каталоги.
Файлы отношений
Стандартные отношения, такие как таблицы или индексы, хранятся в отдельном файле. Эти файлы именуются по значению filenode
таблицы или индекса, которое содержится в столбце relfilenode
системного каталога pg_class. В качестве примера можно вывести имя отношения и значение filenode
для первых пяти записей из pg_class
:
SELECT relname, relfilenode FROM pg_class LIMIT 5;
relname | relfilenode -------------------+------------- books_book_id_seq | 16390 books | 16391 books_pkey | 16396 authors_id_seq | 16398 authors | 16399
Поскольку перечисленные отношения принадлежат базе данных postgres
, соответствующие файлы с именами 16390
, 16391
, 16396
, 16398
, 16399
находятся в каталоге /pg_data1/adpg16/base/5.
Для временных отношений имя файла создается как t<backend>_<filenode>
, где <backend>
— номер backend-процесса, создавшего файл, а <filenode>
— значение filenode
. Например, t8_16433
.
В дополнение к основному файлу каждая таблица или индекс имеет карту свободного пространства (free space map), которая хранит информацию о свободном пространстве в отношении. Карта свободного пространства имеет такое же имя файла, как и соответствующее отношение с добавлением суффикса _fsm
. Например, 16432_fsm
.
Таблицы также имеют карты видимости (visibility maps) для отслеживания страниц, которые не содержат "мертвых" кортежей. Карта видимости имеет такое же имя файла, как и соответствующая таблица с добавлением суффикса _vm
. Например, 16432_vm
.
Нежурналируемые таблицы и индексы имеют дополнительный файл, известный как слой инициализации (initialization fork), который именуется с суффиксом _init
.
Обратите внимание, что хотя filenode
таблицы часто совпадает с её OID, это не всегда так. Некоторые операции, такие как TRUNCATE
, REINDEX
, CLUSTER
и некоторые формы ALTER TABLE
, могут изменять filenode
, сохраняя OID.
Если таблица или индекс превышает 1 ГБ, отношение делится на сегменты с максимальным размером 1 ГБ. Имя файла первого сегмента совпадает с filenode
. Последующие сегменты называются filenode.1
, filenode.2
и т.д. Такое расположение позволяет избежать проблем на платформах с ограничениями на размер файла.
Для таблицы, столбцы которой могут содержать данные большого объема, создается TOAST-таблица, предназначенная для отдельного хранения больших значений. Основная таблица связывается со своей TOAST-таблицей через поле reltoastrelid
системного каталога pg_class. За дополнительной информацией обратитесь к статье TOAST.
Временные файлы, необходимые для ресурсозатратных операций, создаются в base/pgsql_tmp. Имя временного файла имеет формат pgsql_tmp<PID>.<Number>
, где <PID>
— PID backend-процесса, <Number>
служит для различия отдельных временных файлов текущего backend-процесса. Например, pgsql_tmp29522.1
.
Файлы табличных пространств
Каждое определенное пользователем табличное пространство имеет символическую ссылку в подкаталоге pg_tblspc, расположенном в каталоге данных кластера (значение по умолчанию — /pg_data1/adpg16), которая указывает на физический каталог табличного пространства — значение LOCATION
, указанное в команде CREATE TABLESPACE
. Эта символическая ссылка названа в соответствии с OID табличного пространства. Внутри физического каталога табличного пространства создается подкаталог с именем, которое зависит от версии ADPG/PostgreSQL, например, PG_16_202307071. В этом подкаталоге создается подкаталог для каждой базы данных, которая имеет элементы в табличном пространстве. Подкаталоги баз данных названы в соответствии с их OID. Таблицы и индексы, хранящиеся в этих каталогах, используют схему именования, описанную выше и основанную на filenode
.
К табличному пространству pg_default
невозможно получить доступ из pg_tblspc, но pg_default
соответствует подкаталогу base, расположенному в каталоге данных кластера. Аналогично табличное пространство pg_global
недоступно через pg_tblspc, но соответствует подкаталогу global.
Временные файлы создаются в подкаталоге pgsql_tmp каталога табличного пространства.
Получение пути к файлу отношения
Функция pg_relation_filepath(relation regclass)
возвращает путь к файлу относительно каталога данных кластера для любого отношения. Обратите внимание, что эта функция выдает имя первого сегмента, связанного с текущим отношением. Может потребоваться добавить номер сегмента и/или суффиксы _fsm
, _vm
, _init
, чтобы получить все файлы, связанные с отношением.
Пример:
SELECT pg_relation_filepath('books');
pg_relation_filepath ---------------------- base/5/16391
Также можно отобразить имя отношения и путь к файлу для каждого отношения из системного каталога pg_class
:
SELECT relname, pg_relation_filepath(oid) FROM pg_class;
books_book_id_seq | base/5/16390 books | base/5/16391 (1) books_pkey | base/5/16396 authors_id_seq | base/5/16398 authors | base/5/16399 authors_pkey | base/5/16403 pg_statistic | base/5/2619 pg_type | base/5/1247 pgbench_accounts | base/5/16422 pgbench_branches | base/5/16423 pgbench_tellers | base/5/16425 pgbench_branches_pkey | base/5/16426 pgbench_tellers_pkey | base/5/16428 pgbench_accounts_pkey | base/5/16430 pgbench_history | base/5/16457 pg_toast_1255 | base/5/2836 pg_toast_1255_index | base/5/2837 ... table1 | pg_tblspc/16451/PG_16_202307071/5/16454 (2) ...
1 | Таблица из табличного пространства, используемого по умолчанию. |
2 | Таблица из табличного пространства, определенного пользователем. |