Структура каталога данных

В этой статье описывается структура директории с данными кластера 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_database

pg_commit_ts

Каталог, содержащий данные о времени фиксации транзакции

pg_dynshmem

Каталог, содержащий файлы, используемые подсистемой динамической разделяемой памяти

pg_logical

Каталог, содержащий данные о состоянии подписок (subscriptions) или слотов репликации, используемые для логического декодирования

pg_multixact

Каталог, содержащий данные о состоянии мультитранзакций, используемые для разделяемой блокировки строк

pg_notify

Каталог, содержащий данные о состоянии LISTEN/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 ALTER SYSTEM

postmaster.opts

Файл, содержащий параметры командной строки, с которыми сервер был запущен последний раз

postmaster.pid

Файл блокировки, содержащий идентификатор текущего управляющего процесса (PID), путь к каталогу данных кластера, время запуска процесса postmaster, номер порта, путь к каталогу Unix-сокета (может быть пустым), первое валидное значение параметра listen_address (IP-адрес, или *, или пустое значение в случае отсутствия прослушивания по протоколу TCP) и ID сегмента разделяемой памяти. Этот файл отсутствует после остановки сервера

Для каждой базы данных существует свой подкаталог в каталоге 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 Таблица из табличного пространства, определенного пользователем.
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней