Файловая структура PostgreSQL
# Каталог данных кластера
/var/lib/pgsql/data # на Linux
\Program Files\PostgreSQL\[version]\data # на Windows)Конфигурация кластера ^conf-cluster-psql
# Основной системный каталог с конфигурацией кластеров, управляемый пакетным менеджером (Debian/Ubuntu)
/etc/postgresql
| # Версия PostgreSQL (например, 18)
└── 18
| # Имя кластера (по умолчанию — main); позволяет запускать несколько кластеров одной версии
└── main
├── conf.d # Каталог для подключения дополнительных .conf-файлов (автоматически включаются в postgresql.conf)
├── environment # Файл с переменными окружения, которые будут загружены при старте кластера (например, LC_COLLATE, locale)
├── pg_ctl.conf # Конфигурация для утилиты pg_ctl (редко используется в дистрибутивах на основе systemd)
| # Это **простой текстовый файл**, содержащий **аргументы командной строки**, которые будут **автоматически переданы `pg_ctl`** при вызове без явного указания параметров.
├── pg_hba.conf # Файл контроля доступа: определяет, кто и как может подключаться к кластеру (host, local, методы аутентификации)
├── pg_ident.conf # Файл отображения имён ОС-пользователей в роли PostgreSQL (используется с методом auth «ident»)
├── postgresql.conf # Основной конфигурационный файл СУБД: все параметры сервера (память, WAL, репликация, логирование и т.д.)
└── start.conf # Управление автозапуском кластера при загрузке ОС (значения: auto, manual, disabled)/etc/psql/.../environment ^conf-cluster-environment
- Содержимое файла — это переменные окружения, которые устанавливаются для процесса
postmasterи всех его дочерних процессов (backend’ов, фоновых процессов и т.д.). Эти переменные: - Определят локаль кластера при инициализации (если не задана явно в
initdb), - Влияют на сортировку, сравнение строк, формат даты внутри СУБД,
- Используются только процессами PostgreSQL, запущенными от имени
postgres.
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
/etc/psql/.../pg_ctl.conf ^conf-cluster-pgctl-conf
- В Debian/Ubuntu и большинстве современных систем кластер управляется через
systemd(например,systemctl start postgresql@18-main). - В этом случае
pg_ctl.confполностью игнорируется. - Даже при ручном вызове
pg_ctl, если вы явно указываете-Dили-l, значения изpg_ctl.confпереопределяются.
/etc/psql/.../pg_hba.conf ^conf-cluster-pghba-conf
Файл pg_hba.conf (Host-Based Authentication) — это главный файл контроля доступа в PostgreSQL. Он определяет:
Кто, откуда и как может подключиться к каким базам данных в кластере. только авторизацию на этапе подключения
Он не управляет правами внутри БД (это делают GRANT/REVOKE), а .
# TYPE DATABASE USER ADDRESS METHOD
# Разрешить локальному пользователю ОС "postgres" подключаться без пароля
local all postgres peer
# Разрешить всем локальным пользователям подключаться к любой БД своей ролью
local all all peer
# Разрешить подключение с localhost по TCP с паролем (SCRAM)
host all all 127.0.0.1/32 scram-sha-256
# Разрешить подключение с внутренней сети с паролем
host all all 192.168.1.0/24 scram-sha-256
# Запретить всё остальное
host all all 0.0.0.0/0 reject| Колонка | Описание |
|---|---|
TYPE | Тип подключения: local (Unix-сокет), host (TCP/IP), hostssl, hostnossl |
DATABASE | Имя БД или all, sameuser, samerole, replication |
USER | Имя роли (пользователя) или all, +группа |
ADDRESS | IP-адрес/сеть (для host) или пропускается для local |
METHOD | Метод аутентификации: trust, md5, scram-sha-256, ident, peer, cert, ldap, и др. |
Основные методы аутентификации (METHOD)
| Метод | Поведение |
|---|---|
trust | Без пароля! Любой, кто соответствует правилу, получает доступ. Опасен в production! |
scram-sha-256 | Современный, безопасный метод (рекомендуется по умолчанию в PG ≥10) |
md5 | Устаревший хэш-метод (всё ещё широко используется, но менее безопасен) |
peer | Для local: берёт имя пользователя ОС и сопоставляет с ролью в PostgreSQL |
ident | Для host: запрашивает имя ОС-пользователя через ident-сервер (редко используется) |
cert | Использует клиентский SSL-сертификат для аутентификации |
reject | Явно запрещает подключение (полезно для чёрных списков) |
Перезагрузка конфигурации ^reboot-conf-psql
Изменения в pg_hba.conf не требуют перезапуска, но требуют перезагрузки конфигурации:
SELECT pg_reload_conf();или
systemctl reload postgresql@18-main/etc/psql/.../pg_ident.conf ^conf-cluster-pgident-conf
Файл pg_ident.conf — это файл отображения имён пользователей ОС в роли PostgreSQL, используемый только при аутентификации методом ident (для TCP-подключений) или peer (для локальных Unix-сокетов, хотя для peer он обычно не нужен).
Он не используется при парольной аутентификации (md5, scram-sha-256 и т.д.).
В некоторых сценариях вы хотите, чтобы:
Пользователь ОС
aliceпри подключении к PostgreSQL автоматически получал рольapp_user,
даже если имя роли в БД отличается от имени в системе.
Именно для таких преобразований имён и служит pg_ident.conf.
# MAPNAME SYSTEM-USERNAME PG-ROLENAME
myusers alice app_reader
myusers bob app_writer
admins root postgres
supermap all guest| Колонка | Описание |
|---|---|
MAPNAME | Имя правила (произвольное, например mymap) |
SYSTEM-USERNAME | Имя пользователя ОС (или all) |
PG-ROLENAME | Имя роли в PostgreSQL (или all) |
Метод в pg_hba.conf | Использует pg_ident.conf? | Примечание |
|---|---|---|
peer | ✅ Да (если указан map=...) | Только для local |
ident | ✅ Да (если указан map=...) | Для host (TCP) |
trust, scram-sha-256, md5 | ❌ Нет | Имя роли берётся напрямую из запроса подключения |
Если в
pg_hba.confуказано простоpeer(безmap=...), то имя ОС напрямую сопоставляется с ролью в PostgreSQL —pg_ident.confне используется.
Как это работает вместе с pg_hba.conf
В pg_hba.conf вы указываете имя карты (MAPNAME) в колонке METHOD:
# TYPE DATABASE USER ADDRESS METHOD
local all all peer map=myusers
host all all 192.168.1.0/24 ident map=admins
# Синтаксис: `peer map=имя_карты` или `ident map=имя_карты`Пример потока аутентификации:
- Пользователь ОС
aliceзапускаетpsqlлокально. - Подключение идёт через Unix-сокет → срабатывает правило
local ... peer map=myusers. - PostgreSQL получает от ОС имя
alice. - Смотрит в
pg_ident.confпо картеmyusers→ находит:alice → app_reader. - Подключает пользователя как роль
app_reader(без пароля).
Перезагрузка конфигурации: ^reboot-conf-psql к содержанию
/etc/psql/.../postgresql.conf ^psql-conf-file-postgresql-conf
Основной конфигурационный файл PostgreSQL
Это ядро конфигурации кластера, и почти всё, что управляет поведением СУБД, задаётся именно здесь (или через SQL-команду ALTER SYSTEM, которая вносит изменения в postgresql.auto.conf).
Этот файл читается при старте кластера и может быть частично перезагружен без перезапуска.
Поддерживаемые типы значений:
- Числа:
max_connections = 100 - Строки (в кавычках, если есть пробелы):
cluster_name = 'prod-db' - Булевы:
fsync = on - Интервалы времени:
wal_keep_size = 1GBилиcheckpoint_timeout = 15min - Списки:
listen_addresses = 'localhost,192.168.1.10'
Более подробно здесь к содержанию
/etc/psql/.../conf.d ^psql-conf-confd-files
Директория дополнительных conf файлов postgres. Приоритет:
postgresql.conf # Запускается первым
conf.d/*.conf # (если подключены через include_dir)
postgresql.auto.conf # наивысший приоритет/etc/psql/.../start.conf ^conf-cluster-start-conf
Файл start.conf — это специфичный для дистрибутивов на основе Debian/Ubuntu файл, который управляет автозапуском кластера PostgreSQL при загрузке системы.
Он не является частью ядра PostgreSQL и игнорируется при ручном запуске через pg_ctl или в других ОС (RHEL, CentOS, Alpine и т.д.).
Файл содержит ровно одно слово — режим автозапуска:
autoДопустимые значения:
| Значение | Поведение |
|---|---|
auto | Кластер автоматически запускается при загрузке ОС (по умолчанию) |
manual | Кластер не запускается автоматически, но может быть запущен вручную через pg_ctlcluster или systemctl |
disabled | Кластер заблокирован от запуска (даже вручную через стандартные средства) |
- При установке пакета
postgresql-18система создаёт unit-файл systemd видаpostgresql@18-main.service. - Скрипты управления (
pg_ctlcluster,systemctl start postgresql@18-main) читаютstart.confперед запуском. - Если значение
disabled, запуск отклоняется с ошибкой.
Это удобный способ отключить кластер без удаления данных (например, для обслуживания или экономии ресурсов).
- Не влияет на уже запущенный кластер — только на поведение при старте системы или ручном запуске через
pg_ctlcluster. - Игнорируется, если вы запускаете PostgreSQL напрямую через
pg_ctlс указанием-D. - Не существует в RHEL/CentOS/Fedora — там управление автозапуском делается через
systemctl enable/disable.
Каталог данных кластера ^pgdata-cluster-cotalog-psql
# Основной каталог данных кластера (PGDATA), где хранятся все пользовательские и системные данные
/var/lib/postgresql
| # Версия PostgreSQL
└── 18
| # Имя кластера
└── main
├── base # Каталоги с данными пользовательских баз данных (по одному подкаталогу на OID базы)
│ ├── 1 # Служебная БД template1 (OID=1)
│ │ ├── 112 # Файл таблицы или индекса (RELFILENODE = 112)
│ │ ├── 1247_fsm # Free Space Map — карта свободного места для страниц файла 1247
│ │ ├── 1247_vm # Visibility Map — битовая карта видимости для страниц файла 1247
│ │ ├── pg_filenode.map # Отображение RELFILENODE ↔ OID для нестандартных имён файлов
│ │ ├── pg_internal.init # Кэш системных каталогов для ускорения запуска
│ │ └── PG_VERSION # Версия формата данных (совпадает с версией PostgreSQL)
│ ├── 4 # Служебная БД postgres (OID=4, может отличаться)
│ └── 5 # Пользовательская БД (например, ваша БД с OID=5)
├── global # Глобальные системные таблицы, общие для всего кластера
│ ├── 2396 # Файл глобальной системной таблицы (например, pg_database)
│ ├── 2396_fsm # FSM для глобальной таблицы
│ ├── 2396_vm # VM для глобальной таблицы
│ ├── pg_control # Ключевой файл: метаданные кластера, LSN последнего checkpoint’а, состояние
│ ├── pg_filenode.map # Отображение для глобальных отношений
│ └── pg_internal.init # Кэш глобальных каталогов
├── pg_commit_ts # Хранилище временных меток коммитов (если включено track_commit_timestamp)
├── pg_dynshmem # Файлы разделяемой памяти для динамических библиотек (например, расширений)
├── pg_logical # Данные для логической декодировки и логической репликации
│ ├── mappings # Отображения между XID и LSN для логической репликации
│ ├── replorigin_checkpoint # Точка восстановления для origin’ов репликации
│ └── snapshots # Сохранённые снимки (snapshots) для логической репликации
├── pg_multixact # Информация о мультитранзакциях (для совместных блокировок SHARE/KEY SHARE)
│ ├── members # Списки участников мультитранзакций
│ └── offsets # Смещения мультитранзакций
├── pg_notify # Очереди LISTEN/NOTIFY
├── pg_replslot # Слоты репликации (физические и логические) — предотвращают удаление нужного WAL
├── pg_serial # Данные для сериализуемой изоляции (отслеживание конфликтов)
├── pg_snapshots # Сохранённые снимки (через pg_export_snapshot)
├── pg_stat # Постоянные файлы статистики (начиная с PG 14 — вместо pg_stat_tmp)
├── pg_stat_tmp # Временные файлы статистики (в PG ≤13)
├── pg_subtrans # Информация о вложенных (sub) транзакциях
├── pg_tblspc # Символические ссылки на табличные пространства (если они созданы)
├── pg_twophase # Состояния двухфазных транзакций (PREPARE TRANSACTION)
├── PG_VERSION # Версия формата данных кластера (дублирует base/*/PG_VERSION)
├── pg_wal # Write-Ahead Log — журнал транзакций (по 16 МБ на файл)
│ ├── 000000010000000000000001 # WAL-файл
│ ├── archive_status # Флаги архивации (.ready, .done)
│ └── summaries # Сводные данные WAL для быстрого поиска (начиная с PG 17)
├── pg_xact # Commit Log (CLOG) — статусы транзакций (Committed/Aborted)
│ └── 0000 # Сегмент CLOG
├── postgresql.auto.conf # Файл для ALTER SYSTEM — автоматически управляемый конфиг
├── postmaster.opts # Аргументы командной строки, с которыми был запущен postmaster
└── postmaster.pid # PID главного процесса и информация о сокете (существует только при запущенном кластере)/var/lib/psql/…/postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
Другие каталоги ^other-cotalog-psql
Содержит PIF процесса postmaster
cat /var/run/postgresql/18-main.pid
5455как и
cat /var/lib/postgresql/18/main/postmaster.pid
5455
/var/lib/postgresql/18/main
1766638926
5432
/var/run/postgresql
localhost
132040 4
ready