linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/kb/Хранение и формат на диске/cluster-pgdata

kb/storage ── Хранение и формат на диске ── beginner

Кластер, PGDATA и каталоги

Кластер PostgreSQL - это один каталог на диске (PGDATA) и один набор процессов, обслуживающий сразу несколько баз. Внутри PGDATA лежат base/ с данными баз, global/ с общими объектами, pg_wal/ с журналом и служебные каталоги вроде pg_xact/. Всё хранение начинается отсюда.

view as markdownaka: pgdata, data-directory, cluster

Когда говорят «поставил Postgres», обычно имеют в виду одну установку сервера. Внутри это кластер - один каталог с данными и один главный процесс (postmaster), который обслуживает несколько баз данных сразу. Слово «кластер» тут не про несколько машин. Это про несколько баз под одним сервером.

Каталог с данными называют PGDATA - по имени переменной окружения, которая на него указывает. Узнать его путь можно прямо из работающего сервера:

sql
SHOW data_directory;
-- /var/lib/postgresql/data

Что лежит в PGDATA

Заглянем внутрь. Имена каталогов одинаковы на любой установке:

КаталогЧто хранит
base/данные всех обычных баз, по подкаталогу на базу
global/объекты, общие для кластера (список баз, роли)
pg_wal/журнал предзаписи (WAL)
pg_xact/статусы транзакций (clog)
pg_tblspc/ссылки на табличные пространства
postgresql.confконфигурация сервера

Каждая база внутри base/ - это подкаталог, названный по числовому идентификатору базы (OID). Посмотреть соответствие «имя - OID»:

sql
SELECT oid, datname FROM pg_database ORDER BY oid;
--   oid  |  datname
-- -------+-----------
--      1 | template1
--      4 | template0
--      5 | postgres
--  16384 | lab

Системные базы получают маленькие фиксированные OID, а созданные позже - числа из диапазона от 16384. То есть данные нашей учебной базы lab с OID 16384 лежат в base/16384/. Внутри этого подкаталога - файлы отдельных таблиц и индексов. Какой именно файл соответствует таблице, расскажет relfilenode-forks.

Три базы по умолчанию

Свежий кластер уже содержит три базы. template1 и template0 - это шаблоны: CREATE DATABASE физически копирует template1. template0 держат нетронутым как чистый эталон на случай, если template1 испортили. База postgres - просто удобная база по умолчанию, в неё можно зайти сразу после установки.

Табличные пространства

По умолчанию все данные лежат внутри PGDATA. Но таблицу или целую базу можно положить на другой диск через табличное пространство (tablespace) - именованную ссылку на каталог вне PGDATA. Внутри base/ тогда останется только символическая ссылка через pg_tblspc/. Это инструмент уровня администрирования: вынести горячие индексы на быстрый SSD, архив - на медленный диск.

Почему это важно знать

Понимание, что кластер - это один каталог с предсказуемой раскладкой, убирает магию из всего остального. Размер базы - это размер каталога. Бэкап на уровне файлов - это копия PGDATA в согласованном состоянии. Повреждение - это конкретный битый файл в конкретном подкаталоге. Когда знаешь, где что лежит, диагностика перестаёт быть гаданием.

§ команды

bash
SHOW data_directory;

Путь к каталогу PGDATA текущего кластера

bash
SELECT oid, datname FROM pg_database ORDER BY oid;

Список баз и их числовых идентификаторов (имена подкаталогов в base/)

bash
SELECT pg_size_pretty(pg_database_size('postgres'));

Размер базы на диске в человекочитаемом виде

bash
SELECT spcname FROM pg_tablespace;

Список табличных пространств кластера

§ см. также

  • relfilenode-forksrelfilenode и форки отношенияКаждая таблица и индекс лежит на диске как набор файлов - форков. Главный форк хранит сами данные, _fsm - карту свободного места, _vm - карту видимости, _init - шаблон для нежурналируемых таблиц. Имя файла - это relfilenode, и оно не равно OID после перезаписи таблицы.
  • page-layoutРаскладка страницы 8 КБТаблица на диске - это массив страниц по 8 КБ. Внутри страницы четыре зоны: заголовок 24 байта, массив указателей строк (растёт сверху вниз), свободное место и сами кортежи (растут снизу вверх). У heap-страницы спецзона в конце пустая. Указатели и кортежи движутся навстречу.
  • toastTOAST: вынос и сжатие длинных значенийСтрока не может пересекать границу страницы 8 КБ, поэтому длинные значения PostgreSQL сначала сжимает, а если всё равно не влезают - выносит во вторичную TOAST-таблицу чанками примерно по 2 КБ. Порог срабатывает около 2000 байт на строку. Управляется стратегией хранения: PLAIN, MAIN, EXTERNAL, EXTENDED.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки