Когда говорят «поставил Postgres», обычно имеют в виду одну установку сервера. Внутри это кластер - один каталог с данными и один главный процесс (postmaster), который обслуживает несколько баз данных сразу. Слово «кластер» тут не про несколько машин. Это про несколько баз под одним сервером.
Каталог с данными называют PGDATA - по имени переменной окружения, которая на него указывает. Узнать его путь можно прямо из работающего сервера:
SHOW data_directory;
-- /var/lib/postgresql/data
Что лежит в PGDATA
Заглянем внутрь. Имена каталогов одинаковы на любой установке:
| Каталог | Что хранит |
|---|---|
base/ | данные всех обычных баз, по подкаталогу на базу |
global/ | объекты, общие для кластера (список баз, роли) |
pg_wal/ | журнал предзаписи (WAL) |
pg_xact/ | статусы транзакций (clog) |
pg_tblspc/ | ссылки на табличные пространства |
postgresql.conf | конфигурация сервера |
Каждая база внутри base/ - это подкаталог, названный по числовому
идентификатору базы (OID). Посмотреть соответствие «имя - OID»:
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 в согласованном состоянии. Повреждение - это конкретный битый файл в конкретном подкаталоге. Когда знаешь, где что лежит, диагностика перестаёт быть гаданием.